SVG的应用顺序转换

cat*_*yes 14 html svg

W3C的规范中,它说:

'transform'属性的值是<transform-list>,它被定义为变换定义列表,它按照提供的顺序应用.

...

如果提供了变换列表,那么净效果就好像每个变换都是按照提供的顺序单独指定的

当我尝试使用firefox,chrome和IE10中的跟随标记时,所有三个通过首先进行翻译,然后通过旋转进行渲染!请参阅codepen代码段.我错过了什么?或者3个浏览器的实现不符合W3C?

<svg width="180" height="200"
  xmlns="http://www.w3.org/2000/svg" 
  xmlns:xlink="http://www.w3.org/1999/xlink">

  <!-- This is the element before translation and rotation are applied -->
  <rect x="0" y="0" height="100" width="100" style="stroke:#000; fill: #0086B2" fill-opacity=0.2 stroke-opacity=0.2></rect>

  <!-- Now we add a text element and apply rotate and translate to both -->
  <rect x="0" y="0" height="100" width="100" style="stroke:#000; fill: #0086B2" transform="rotate(45 100 50) translate(50)"></rect>
</svg>
Run Code Online (Sandbox Code Playgroud)

Rob*_*son 15

规范非常清楚,首先应用最右边的变换的顺序.

如果提供了变换列表,那么净效果就好像每个变换都是按照提供的顺序单独指定的.

也就是说,

<g transform="translate(-10,-20) scale(2) rotate(45) translate(5,10)">
  <!-- graphics elements go here -->
</g>
Run Code Online (Sandbox Code Playgroud)

在功能上等同于:

<g transform="translate(-10,-20)">
  <g transform="scale(2)">
    <g transform="rotate(45)">
      <g transform="translate(5,10)">
        <!-- graphics elements go here -->
      </g>
    </g>
  </g>
</g>
Run Code Online (Sandbox Code Playgroud)

  • 该规范极具误导性,它不会按所提供的顺序应用转换,而是创建一个嵌套的转换结构,其中首先应用最内部转换,这是列表中的最后一个转换.如果规范如此清晰,那么为什么几乎所有第一次尝试SVG的人都会绊倒. (9认同)
  • 同意@ bikeman868,从右到左的变换顺序与规范措辞和假设的逻辑行为相反.每次都打败我. (4认同)
  • 该规范确实按从左到右的顺序应用了转换:transform="AB C" 创建了矩阵 A、B、C,这些矩阵被应用了 A * B * C。但是,如果您查看,矩阵乘法最终会从右到左“工作”矩阵作为函数调用。 (3认同)
  • 我明白了,谢谢。但是规范应该明确规定这一点。 (2认同)
  • 它确实!我发布的内容来自规范. (2认同)
  • 在数学中,术语“应用”通常用作函数应用,术语变换也通常用于指代函数,所有这些都意味着与矩阵乘法的假设相反的顺序。作为几个图形标准委员会的成员,我很容易想象有人会贬低那些不按照自己的方式解释它的人,并胁迫委员会接受模棱两可的(即使不是完全错误的)语言。 (2认同)