【问题标题】:behavior of flipped coordinate system for text transform and translate文本变换和翻译的翻转坐标系的行为
【发布时间】:2019-06-24 04:08:10
【问题描述】:

目标是创建一个笛卡尔空间,用倒置的垂直坐标系正确显示对象和文本,使文本不会倒置显示。我不想将文本嵌入到父 <g> 元素中。

这个 sn-p 有效:

<style>
svg.cartesian { transform: scaleY(-1); }
svg.cartesian text { transform: scaleY(-1); }
</style>
<svg class="cartesian" viewBox="-100 -100 200 200" preserveAspectRatio="xMidYMid meet">
<path d="M0 -100 V 200" stroke="green" stroke-width="0.5" stroke-opacity="0.5" />
<path d="M-100 0 H 200" stroke="green" stroke-width="0.5" stroke-opacity="0.5" />
<circle cx=20 cy=20 r=1 />
<g transform="translate(20, 20)">
<text>(20, 20)</text>
</g>
</svg>

但是,如果将translate() 命令移动到&lt;text&gt; 元素内,它就不起作用;文本未翻译到新位置:

<style>
svg.cartesian { transform: scaleY(-1); }
svg.cartesian text { transform: scaleY(-1); }
</style>
<svg class="cartesian" viewBox="-100 -100 200 200" preserveAspectRatio="xMidYMid meet">
<path d="M0 -100 V 200" stroke="green" stroke-width="0.5" stroke-opacity="0.5" />
<path d="M-100 0 H 200" stroke="green" stroke-width="0.5" stroke-opacity="0.5" />
<circle cx=20 cy=20 r=1 />
<text transform="translate(20, 20)">(20, 20)</text>
</svg>

为什么?

【问题讨论】:

  • @RobertLongson 我有点困惑:在这两种情况下只有一个 svg 转换。你的意思是CSS转换的应用顺序和每个案例之间的svg转换变化......?
  • @RobertLongson 好的,我明白了。然而,在第二种情况下,翻译命令似乎根本没有发生。是不是被 CSS 转换取消了...?
  • @RobertLongson 当你说“它确实发生了”时,你是说 - 除了应用了两个变换和最后应用的 CSS - 应用了第二个 (CSS) 变换original 位置,好像第一次(svg 翻译)转换从未发生过?因为很明显没有对最终图像应用任何翻译。这就是我所说的“被 CSS 转换取消”的意思。
  • 我建议你自己试验一下然后找出答案。
  • @RobertLongson 虽然我同意顺序很重要,但这里的问题是另一回事,是 CSS 对转换的简单覆盖。

标签: html css svg


【解决方案1】:

答案比您预期的要容易。在第二种情况下,您将使用比例覆盖1 翻译,这就是它不起作用的原因:

如果要将 2 个转换成同一个元素,则需要将它们放在同一个转换中:

<style>
svg.cartesian { transform: scaleY(-1); }
</style>
<svg class="cartesian" viewBox="-100 -100 200 200" preserveAspectRatio="xMidYMid meet">
<path d="M0 -100 V 200" stroke="green" stroke-width="0.5" stroke-opacity="0.5" />
<path d="M-100 0 H 200" stroke="green" stroke-width="0.5" stroke-opacity="0.5" />
<circle cx=20 cy=20 r=1 />
<text transform="translate(20, 20) scale(1,-1)">(20, 20)</text>
<text transform="scale(1,-1) translate(20, 20)">(20, 20)</text>
</svg>

如您所见,我添加了这两种情况以证明顺序很重要。

相关:Why does order of transforms matter? SVG rotate/scale doesn't give the same result as scale/rotate


1来自the specification

所有基于文档语言的样式都必须翻译成相应的 CSS 规则,并且要么进入级联在用户代理级别,要么被视为作者级别规则在作者样式表的开头放置一个零特异性。文档语言可以定义表示提示是否进入 UA 或级联的作者级别;如果是这样,UA 必须做出相应的行为。例如,[SVG11] 将其表示属性映射到作者级别

然后

每个样式规则都有一个级联起源,它决定了它进入级联的位置。 CSS 定义了三个核心来源:

作者来源

作者根据文档语言的约定为源文档指定样式表。

用户来源

用户可能能够为特定文档指定样式信息。例如,用户可以指定一个包含样式表的文件,或者用户代理可以提供一个接口来生成用户样式表(或表现得好像它确实如此)。

用户代理来源

符合标准的用户代理必须应用默认样式表(或表现得像他们一样)。用户代理的默认样式表应该以满足文档语言的一般呈现期望的方式呈现文档语言的元素

然后

级联获取给定元素上给定属性的声明值的无序列表,按照下面确定的声明优先级对它们进行排序,并输出一个单级联值

您会找到完整的规则列表,并且您会理解为什么 CSS 会覆盖属性一。您会看到最后只应选择一条规则

【讨论】:

  • 我开始认为这就是答案。是否因为它是两种不同类型的不兼容变换(CSS 变换和 SVG 变换)而被覆盖?如果是这样,是否记录在某处?
  • @RickTeachey 这不是关于不兼容性,而是关于 CSS 的工作原理。基本上 CSS 会在对抗属性的游戏中获胜。就像您使用属性定义图像的高度然后使用 CSS 定义高度一样。我会找到相关的规范
  • 我想这是有道理的......规模变换“取消”了平移变换,这对我来说仍然很奇怪。
  • @RickTeachey 不,取消翻译的不是比例......而是取消属性一的CSS规则。包含转换的内容无关紧要。 CSS 将被应用,这是合乎逻辑的,因为您不能多次应用相同的东西。就像您有许多适用于同一个元素的 CSS 规则:最具体的规则将赢得比赛
  • 我明白了。不过,对于新手来说,这仍然是相当令人惊讶的。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多