SVG tspan 与文本锚点不对齐的问题="end"
Issue with SVG tspans not aligning with text-anchor="end"
我有一些这样的代码:
svg {font-family:Verdana,sans-serif;color:#000;}
.key {font-size:75%;overflow:visible;}
.caphgh {font-weight:bold;}
.keynor {font-weight:normal;}
.keysub {font-weight:normal;font-size:85%;}
.keyshf,.keyctl,.keyalt {text-anchor:end;}
.keyshf {fill:#077BC7;} /* CIE-L*ch ( 50, 47,270) blue */
.keyctl {fill:#028946;} /* CIE-L*ch ( 50, 55,150) green */
.keyalt {fill:#ED0631;} /* CIE-L*ch ( 50, 88, 30) red */
.yel {fill:#CEB46C;} /* CIE-L*ch ( 74, 40, 90) */
.non {fill:none;}
.rec {stroke:#000;stroke-width:1;}
<svg class="key" x="631.5" y="253.5" width="69" height="69">
<rect class="rec yel" x="0.5" y="0.5" rx="4" ry="4" width="68" height="68"/>
<text class="caphgh" x="2.5" y="16.5">K</text>
<text class="keynor" x="2.5" y="22.5">
<tspan x="2.5" dy="14">Next</tspan>
<tspan x="2.5" dy="14">Near</tspan>
<tspan x="2.5" dy="14">Friend</tspan>
</text>
<text class="keysub" y="0.5">
<tspan class="keyshf" x="68.5" dy="12">Base</tspan>
<tspan class="keyctl" x="68.5" dy="12">Plant</tspan>
<tspan class="keyalt" x="68.5" dy="12">Jump</tspan>
</text>
</svg>
问题出在最后三个 tspan 上。它们都是右对齐的,但在 Chrome 和 Firefox 中,三个中的最后一个比前两个更靠近右边缘。在 IE 11 中不会发生这种情况。
谁能告诉我可能是什么原因?这是屏幕截图:
谢谢!
这是由 XML 中 <tspan>
元素之间的白色 space 引起的。如果我们删除它,您的问题就会消失。
svg {font-family:Verdana,sans-serif;color:#000;}
.key {font-size:75%;overflow:visible;}
.caphgh {font-weight:bold;}
.keynor {font-weight:normal;}
.keysub {font-weight:normal;font-size:85%;}
.keyshf,.keyctl,.keyalt {text-anchor:end;}
.keyshf {fill:#077BC7;} /* CIE-L*ch ( 50, 47,270) blue */
.keyctl {fill:#028946;} /* CIE-L*ch ( 50, 55,150) green */
.keyalt {fill:#ED0631;} /* CIE-L*ch ( 50, 88, 30) red */
.yel {fill:#CEB46C;} /* CIE-L*ch ( 74, 40, 90) */
.non {fill:none;}
.rec {stroke:#000;stroke-width:1;}
<svg class="key" x="631.5" y="253.5" width="69" height="69">
<rect class="rec yel" x="0.5" y="0.5" rx="4" ry="4" width="68" height="68"/>
<text class="caphgh" x="2.5" y="16.5">K</text>
<text class="keynor" x="2.5" y="22.5">
<tspan x="2.5" dy="14">Next</tspan>
<tspan x="2.5" dy="14">Near</tspan>
<tspan x="2.5" dy="14">Friend</tspan>
</text>
<text class="keysub" y="0.5">
<tspan class="keyshf" x="68.5" dy="12">Base</tspan><tspan
class="keyctl" x="68.5" dy="12">Plant</tspan><tspan
class="keyalt" x="68.5" dy="12">Jump</tspan>
</text>
</svg>
这可能有点不直观,但是当您在 <tspan>
元素中设置 text-anchor: end
时,它会覆盖所有文本,直到您更改文本位置。当您更改 x
和 dy
时,这会发生在下一个 <tspan>
元素处。因此,跨度之间的额外 space 成为前一个 <tspan>
的一部分。所以你的第一行文字实际上是:
<tspan>Jump</tspan>{spaces}
这就是为什么该文本看起来向左移动了 space。
请注意,SVG 文档中的默认白色space 行为是将连续的 space 折叠为单个 space。
您实际上不需要在您的示例中使用 <tspan>
。仅使用 <text>
个元素会更简单、更清晰。
svg {font-family:Verdana,sans-serif;color:#000;}
.key {font-size:75%;overflow:visible;}
.caphgh {font-weight:bold;}
.keynor {font-weight:normal;}
.keysub {font-weight:normal;font-size:85%;}
.keyshf,.keyctl,.keyalt {text-anchor:end;}
.keyshf {fill:#077BC7;} /* CIE-L*ch ( 50, 47,270) blue */
.keyctl {fill:#028946;} /* CIE-L*ch ( 50, 55,150) green */
.keyalt {fill:#ED0631;} /* CIE-L*ch ( 50, 88, 30) red */
.yel {fill:#CEB46C;} /* CIE-L*ch ( 74, 40, 90) */
.non {fill:none;}
.rec {stroke:#000;stroke-width:1;}
<svg class="key" x="631.5" y="253.5" width="69" height="69">
<rect class="rec yel" x="0.5" y="0.5" rx="4" ry="4" width="68" height="68"/>
<text class="caphgh" x="2.5" y="16.5">K</text>
<g class="keynor">
<text x="2.5" y="22.5" dy="14">Next</text>
<text x="2.5" y="22.5" dy="28">Near</text>
<text x="2.5" y="22.5" dy="42">Friend</text>
</g>
<g class="keysub">
<text class="keyshf" x="68.5" y="0.5" dy="12">Base</text>
<text class="keyctl" x="68.5" y="0.5" dy="24">Plant</text>
<text class="keyalt" x="68.5" y="0.5" dy="36">Jump</text>
</g>
</svg>
我有一些这样的代码:
svg {font-family:Verdana,sans-serif;color:#000;}
.key {font-size:75%;overflow:visible;}
.caphgh {font-weight:bold;}
.keynor {font-weight:normal;}
.keysub {font-weight:normal;font-size:85%;}
.keyshf,.keyctl,.keyalt {text-anchor:end;}
.keyshf {fill:#077BC7;} /* CIE-L*ch ( 50, 47,270) blue */
.keyctl {fill:#028946;} /* CIE-L*ch ( 50, 55,150) green */
.keyalt {fill:#ED0631;} /* CIE-L*ch ( 50, 88, 30) red */
.yel {fill:#CEB46C;} /* CIE-L*ch ( 74, 40, 90) */
.non {fill:none;}
.rec {stroke:#000;stroke-width:1;}
<svg class="key" x="631.5" y="253.5" width="69" height="69">
<rect class="rec yel" x="0.5" y="0.5" rx="4" ry="4" width="68" height="68"/>
<text class="caphgh" x="2.5" y="16.5">K</text>
<text class="keynor" x="2.5" y="22.5">
<tspan x="2.5" dy="14">Next</tspan>
<tspan x="2.5" dy="14">Near</tspan>
<tspan x="2.5" dy="14">Friend</tspan>
</text>
<text class="keysub" y="0.5">
<tspan class="keyshf" x="68.5" dy="12">Base</tspan>
<tspan class="keyctl" x="68.5" dy="12">Plant</tspan>
<tspan class="keyalt" x="68.5" dy="12">Jump</tspan>
</text>
</svg>
问题出在最后三个 tspan 上。它们都是右对齐的,但在 Chrome 和 Firefox 中,三个中的最后一个比前两个更靠近右边缘。在 IE 11 中不会发生这种情况。
谁能告诉我可能是什么原因?这是屏幕截图:
谢谢!
这是由 XML 中 <tspan>
元素之间的白色 space 引起的。如果我们删除它,您的问题就会消失。
svg {font-family:Verdana,sans-serif;color:#000;}
.key {font-size:75%;overflow:visible;}
.caphgh {font-weight:bold;}
.keynor {font-weight:normal;}
.keysub {font-weight:normal;font-size:85%;}
.keyshf,.keyctl,.keyalt {text-anchor:end;}
.keyshf {fill:#077BC7;} /* CIE-L*ch ( 50, 47,270) blue */
.keyctl {fill:#028946;} /* CIE-L*ch ( 50, 55,150) green */
.keyalt {fill:#ED0631;} /* CIE-L*ch ( 50, 88, 30) red */
.yel {fill:#CEB46C;} /* CIE-L*ch ( 74, 40, 90) */
.non {fill:none;}
.rec {stroke:#000;stroke-width:1;}
<svg class="key" x="631.5" y="253.5" width="69" height="69">
<rect class="rec yel" x="0.5" y="0.5" rx="4" ry="4" width="68" height="68"/>
<text class="caphgh" x="2.5" y="16.5">K</text>
<text class="keynor" x="2.5" y="22.5">
<tspan x="2.5" dy="14">Next</tspan>
<tspan x="2.5" dy="14">Near</tspan>
<tspan x="2.5" dy="14">Friend</tspan>
</text>
<text class="keysub" y="0.5">
<tspan class="keyshf" x="68.5" dy="12">Base</tspan><tspan
class="keyctl" x="68.5" dy="12">Plant</tspan><tspan
class="keyalt" x="68.5" dy="12">Jump</tspan>
</text>
</svg>
这可能有点不直观,但是当您在 <tspan>
元素中设置 text-anchor: end
时,它会覆盖所有文本,直到您更改文本位置。当您更改 x
和 dy
时,这会发生在下一个 <tspan>
元素处。因此,跨度之间的额外 space 成为前一个 <tspan>
的一部分。所以你的第一行文字实际上是:
<tspan>Jump</tspan>{spaces}
这就是为什么该文本看起来向左移动了 space。
请注意,SVG 文档中的默认白色space 行为是将连续的 space 折叠为单个 space。
您实际上不需要在您的示例中使用 <tspan>
。仅使用 <text>
个元素会更简单、更清晰。
svg {font-family:Verdana,sans-serif;color:#000;}
.key {font-size:75%;overflow:visible;}
.caphgh {font-weight:bold;}
.keynor {font-weight:normal;}
.keysub {font-weight:normal;font-size:85%;}
.keyshf,.keyctl,.keyalt {text-anchor:end;}
.keyshf {fill:#077BC7;} /* CIE-L*ch ( 50, 47,270) blue */
.keyctl {fill:#028946;} /* CIE-L*ch ( 50, 55,150) green */
.keyalt {fill:#ED0631;} /* CIE-L*ch ( 50, 88, 30) red */
.yel {fill:#CEB46C;} /* CIE-L*ch ( 74, 40, 90) */
.non {fill:none;}
.rec {stroke:#000;stroke-width:1;}
<svg class="key" x="631.5" y="253.5" width="69" height="69">
<rect class="rec yel" x="0.5" y="0.5" rx="4" ry="4" width="68" height="68"/>
<text class="caphgh" x="2.5" y="16.5">K</text>
<g class="keynor">
<text x="2.5" y="22.5" dy="14">Next</text>
<text x="2.5" y="22.5" dy="28">Near</text>
<text x="2.5" y="22.5" dy="42">Friend</text>
</g>
<g class="keysub">
<text class="keyshf" x="68.5" y="0.5" dy="12">Base</text>
<text class="keyctl" x="68.5" y="0.5" dy="24">Plant</text>
<text class="keyalt" x="68.5" y="0.5" dy="36">Jump</text>
</g>
</svg>