Copyright © 2009 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
CSS 2D Transforms allows elements rendered by CSS to be transformed in two-dimensional space.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.
Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
The (archived) public mailing list www-style@w3.org (see instructions) is preferred for discussion of this specification. When sending e-mail, please put the text “css3-2d-transforms” in the subject, preferably like this: “[css3-2d-transforms] …summary of comment…”
This document was produced by the CSS Working Group (part of the Style Activity).
This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This is the first public Working Draft of the “css3-2d-transforms” series.
transform’ Property 
   transform-origin’ Property 
   This section is not normative.
The CSS visual formatting model describes a coordinate system within which each element is positioned. Positions and sizes in this coordinate space can be thought of as being expressed in pixels, starting in the upper left corner of the parent with positive values proceeding to the right and down.
 This coordinate space can be modified with the ‘transform’ property. Using
   transform, elements can be translated, rotated and scaled in two
   dimensional space. The coordinate space behaves as described in the coordinate
   system transformations section of the SVG 1.1 specification. This is a
   coordinate system with two axes: the X axis increases horizontally to the
   right; the Y axis increases vertically downwards.
  
 Specifying a value other than ‘none’ for the ‘transform’ property establishes a
   new local coordinate system at the element that it is applied to.
   Transformations are cumulative. That is, elements establish their local
   coordinate system within the coordinate system of their parent. In this
   way, a ‘transform’ property effectively
   accumulates all the ‘transform’ properties of its
   ancestors. The accumulation of these transforms defines a current
   transformation matrix (CTM) for the element.
  
 The transform property does not affect the flow of the content
   surrounding the transformed element. However, the value of the overflow
   area takes into account transformed elements. This behavior is similar to
   what happens when elements are translated via relative positioning.
   Therefore, if the value of the ‘overflow’ property is ‘scroll’
   or ‘auto’, scrollbars will appear as needed
   to see content that is transformed outside the visible area.
  
 Any value other than ‘none’ for
   the transform results in the creation of both a stacking context and a
   containing block. The object acts as though position: relative has been
   specified, but also acts as a containing block for fixed positioned
   descendants.
  
transform’ Property A two-dimensional transformation is applied to an element through the
   ‘transform’ property. This property
   contains a list of transform functions.
   The final transformation value for an element is obtained by performing a
   matrix concatenation of each entry in the list. The set of transform
   functions is similar to those allowed by SVG.
  
| Name: | transform | 
| Value: | none | <transform-function> [ <transform-function> ]* | 
| Initial: | none | 
| Applies to: | block-level and inline-level elements | 
| Inherited: | no | 
| Percentages: | refer to the size of the element's box | 
| Media: | visual | 
| Computed value: | Same as specified value. | 
transform-origin’
   Property The ‘transform-origin’
   property establishes the origin of transformation for an element. This
   property is applied by first translating the element by the negated value
   of the property, then applying the element's transform, then translating
   by the property value. This effectively moves the desired transformation
   origin of the element to (0,0) in the local coordinate system, then
   applies the element's transform, then moves the element back to its
   original position.
  
| Name: | transform-origin | 
| Value: | [ [ <percentage> | <length> | left | center | right ] [ <percentage> | <length> | top | center | bottom ]? ] | [ [ left | center | right ] || [ top | center | bottom ] ] | 
| Initial: | 50% 50% | 
| Applies to: | block-level and inline-level elements | 
| Inherited: | no | 
| Percentages: | refer to the size of the element's box | 
| Media: | visual | 
| Computed value: | For <length> the absolute value, otherwise a percentage | 
The value of the transform property is a list of <transform-functions>, applied in the order provided. The individual transform functions are separated by whitespace. The following is a list of allowed transform functions. In this list the type <translation-value> is defined as a <length> or <percentage> value, and the <angle> type is defined by CSS Values and Units.
The <translation-value> values are defined as [<percentage> | <length>]. All other value types are described as CSS types. If a list of transforms is provided, then the net effect is as if each transform had been specified separately in the order provided. For example,
<div style="transform:translate(-10px,-20px) scale(2) rotate(45deg) translate(5px,10px)"/>
is functionally equivalent to:
  <div style="transform:translate(-10px,-20px)">
    <div style="transform:scale(2)">
      <div style="transform:rotate(45deg)">
        <div style="transform:translate(5px,10px)">
        </div>
      </div>
    </div>
  </div>
  
  
  div {
      transform: translate(100px, 100px);
  }
  
   Move the element by 100 pixels in both the X and Y directions.
   
  div {
      height: 100px; width: 100px;
      transform: translate(80px, 80px) scale(1.5, 1.5) rotate(45deg);
  }
  
   Move the element by 80 pixels in both the X and Y directions, then scale
   the element by 150%, then rotate it 45 degrees clockwise about the Z axis.
   Note that the scale and rotate operate about the center of the element,
   since the element has the default transform-origin of 50% 50%.
   
 When animating or transitioning the value of a transform property the
   rules described below are applied. The ‘from’ transform is the transform at the start
   of the transition or current keyframe. The ‘end’ transform is the transform at the end of
   the transition or current keyframe.
  
from’ and
    ‘to’ transforms are both single
    functions of the same type:
    from’ and
    ‘to’ transforms are "none":
    from’ or
    ‘to’ transforms is "none":
    none’ is replaced by
      an equivalent identity function list for the corresponding transform
      function list.
       For example, if the ‘from’
       transform is "scale(2)" and the ‘to’ transform is "none" then the value
       "scale(1)" will be used as the ‘to’ value, and animation will proceed
       using the rule above. Similarly, if the ‘from’ transform is "none" and the
       ‘to’ transform is "scale(2)
       rotate(50deg)" then the animation will execute as if the ‘from’ value is "scale(1) rotate(0)".
The identity functions are translate(0), translateX(0), translateY(0), scale(1), scaleX(1), scaleY(1), rotate(0), rotateX(0), rotateY(0), skewX(0), skewY(0), and matrix(1, 0, 0, 1, 0, 0).
from’ and
    ‘to’ transforms have the same
    number of transform functions and corresponding functions in each
    transform list are of the same type:
    This section describes the interfaces and functionality added to the DOM to support runtime access to the functionality described above.
 The Point interface represents a point in
     two-dimensional space.
  interface Point {
      attribute float x;
      attribute float y;
  };
      x of type float
       y of type float
        The following 2 functions are added to the Window
     interface. They provide conversions between the page and node coordinate
     spaces.
  interface Window {
    ...
    Point convertPointFromPageToNode(in Node node, in Point point);
    Point convertPointFromNodeToPage(in Node node, in Point point);
    ...
  };
      convertPointFromPageToNode
        
       convertPointFromPageToNode method
         returns a point in the coordinate space of the passed Node that is
         at the same location in the page as the passed point, which is in
         the coordinate space of the page.
         node of type
             Node
            point of type
             Point
            Point
           convertPointFromNodeToPage
        
       convertPointFromNodeToPage method
         returns a point in the coordinate space of the page that is at the
         same location in the page as the passed point, which is in the
         coordinate space of the passed Node.
         node of type
             Node
            point of type
             Point
            Point
            The CSSMatrix interface represents a 4x4 homogeneous
     matrix.
  interface CSSMatrix {
      attribute float a;
      attribute float b;
      attribute float c;
      attribute float d;
      attribute float e;
      attribute float f;
      void        setMatrixValue(in DOMString string) raises(DOMException);
      CSSMatrix   multiply(in CSSMatrix secondMatrix);
      CSSMatrix   inverse() raises(DOMException);
      CSSMatrix   translate(in float x, in float y);
      CSSMatrix   scale(in float scaleX, in float scaleY);
      CSSMatrix   rotate(in float angle);
  };
      a-f of type float
       setMatrixValue
       setMatrixValue method replaces
         the existing matrix with one computed from parsing the passed string
         as though it had been assigned to the transform property in a CSS
         style rule.
         string of type
             DOMString
            SYNTAX_ERR
            multiply
       multiply method returns a new
         CSSMatrix which is the result of this matrix multiplied by the
         passed matrix, with the passed matrix to the right. This matrix is
         not modified.
         secondMatrix of type
             CSSMatrix
            CSSMatrix
            inverse
       inverse method returns a new
         matrix which is the inverse of this matrix. This matrix is not
         modified.
         CSSMatrix
            NOT_SUPPORTED_ERROR
            translate
       translate method returns a new
         matrix which is this matrix post multiplied by a translation matrix
         containing the passed values. This matrix is not modified.
         x of type
             float
            y of type
             float
            CSSMatrix
            scale
       scale method returns a new matrix
         which is this matrix post multiplied by a scale matrix containing
         the passed values. If the z component is undefined, a 1 value is
         used in its place. If the y component is undefined, the x component
         value is used in its place. This matrix is not modified.
         scaleX of type
             float
            scaleY of type
             float
            CSSMatrix
            rotate
       rotate method returns a new
         matrix which is this matrix post multiplied by a rotation matrix.
         The rotation value is in degrees. This matrix is not modified.
         angle of type
             float
            CSSMatrix
             The CSSTransformValue interface represents one transform
     function in the transform property. The operationType
     defines which operation is represented. The object also contains a list
     of values, which are the parameters of the function, in the same order
     in which they appear in the transform functions.
  interface CSSTransformValue : CSSValueList {
      // 2D OperationTypes
      const unsigned short CSS_TRANSLATE   = 1;
      const unsigned short CSS_TRANSLATEX  = 2;
      const unsigned short CSS_TRANSLATEY  = 3;
      const unsigned short CSS_ROTATE      = 4;
      const unsigned short CSS_SCALE       = 5;
      const unsigned short CSS_SCALEX      = 6;
      const unsigned short CSS_SCALEY      = 7;
      const unsigned short CSS_SKEW        = 8;
      const unsigned short CSS_SKEWX       = 9;
      const unsigned short CSS_SKEWY       = 10;
      const unsigned short CSS_MATRIX      = 11;
      attribute unsigned short operationType;
      CSSMatrix getCSSMatrix() raises(DOMException);
  };    
  
      operationType of
        type unsigned short
       getCSSMatrix
       getCSSMatrix method returns a
         CSSMatrix object representing this transform.
         CSSMatrix
            NOT_SUPPORTED_ERROR
             In addition to the interfaces listed above, the
   getComputedStyle method of the Window object has
   been updated. The transform property
   of the style object returned by getComputedStyle contains a
   single CSSTransformValue with a type of CSS_MATRIX. The 6 parameters
   represent the 3x2 matrix that is the result of applying the individual
   functions listed in the transform
   property.
| Property | Values | Initial | Applies to | Inh. | Percentages | Media | 
|---|---|---|---|---|---|---|
| transform | none | <transform-function> [ <transform-function> ]* | none | block-level and inline-level elements | no | refer to the size of the element's box | visual | 
| transform-origin | [ [ <percentage> | <length> | left | center | right ] [ <percentage> | <length> | top | center | bottom ]? ] | [ [ left | center | right ] || [ top | center | bottom ] ] | 50% 50% | block-level and inline-level elements | no | refer to the size of the element's box | visual |