tspan元素的背景颜色

Posted

技术标签:

【中文标题】tspan元素的背景颜色【英文标题】:Background color of tspan element 【发布时间】:2012-01-30 07:20:45 【问题描述】:

是否可以给 SVG <tspan> 元素背景颜色?如果没有,模拟它的最佳方法是什么?

我的目标是赋予文本背景颜色,我认为填充 <tspan> 元素会是完美的——它们已经“勾勒”了代表多行文本中的行的文本块(<tspan> 元素)。

我正在使用的示例:

<text x="100" y="100" font-size="30">
  <tspan>hello</tspan>
  <tspan x="100" dy="1.2em">world</tspan>
</text>

我尝试了“填充”属性,但它似乎影响文本的填充(颜色),而不是它后面的区域:

<tspan fill="yellow">hello</tspan>

我也尝试通过 CSS 设置背景颜色:

<style type="text/css">tspan  background-color: yellow </tspan>

..但这不起作用(至少在 Chrome 17 和 Firefox 12 中)。

使用“填充”将 tspan 包装在 &lt;g&gt;(或 &lt;g&gt; 中的文本本身)也不起作用:

<g fill="yellow"><tspan>hello</tspan></g>
<tspan><g fill="yellow">hello</g></tspan>

除了创建一个位于同一位置的 &lt;rect&gt; 元素(我想避免这种情况)之外,还有其他方法可以实现这一点吗?

【问题讨论】:

【参考方案1】:

矩形可能是最好的方法(假设您只处理最简单的文本形式)。

在 SVG 1.1 中,tspan 本身没有“背景”,背景是在 tspan 之前绘制的任何内容。有很多情况需要考虑,例如 tspan 位于具有圆形形状的 textPath 内的情况。另请注意,它并非在所有情况下都像连续矩形那么简单,单个 tspan 可以由于变换、字形定位等原因而倾斜、旋转和分割成几个相交和不相交的形状。

我能想到的另一种方法可以在不编写脚本的情况下执行此操作,但是您需要提前知道字符串的宽度(例如,使用等宽字体)。如果你有,那么你可以使用 Ahem 字体添加另一个 tspan 元素,将它放在文档中的另一个 tspan 之前,并给它与你想要提供“背景”的 tspan 相同的 x,y 位置。

否则,执行此操作的方法是通过脚本编写,并添加矩形(或带有类似 Ahem 字体的 tspan)。

【讨论】:

谢谢,那我就去 rect's。我现在明白为什么指定文本背景可能会出现问题。【参考方案2】:

SVG 不支持直接指定图像背景颜色...但是您可以调整 viewBox 属性的四个值(复杂)。我知道这是你想避免的,但 CSS 帮不了你。

...或者您可以使用 getBBox 和 getCTM...它将为您提供旋转文本的优势。 例子: http://srufaculty.sru.edu/david.dailey/svg/getCTM.svg

【讨论】:

SVG 确实允许在根 svg 元素上使用“背景”,在 SVG Tiny 1.2 中也有“viewport-fill”和“viewport-opacity”。但是确实没有什么可以自动填充 tspan,您目前必须使用脚本来完成。我不明白为什么“viewBox”会在这里适用。 @Erik,总的来说,浏览器对 Tiny 的支持有多强? 一般?有些部分受支持,有些则不支持:) 目前还没有广泛支持“viewport-fill”(Opera 支持它),但还有其他一些东西正在受到关注,例如“vector-effect”和“多个浏览器引擎支持的可聚焦的。 非常感谢,我浏览了规格......但遗憾的是,有很多漂亮的不受支持的东西。

以上是关于tspan元素的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

DIV下面子元素的颜色被页面背景颜色覆盖问题css?

如何将元素的背景颜色与 2 种半透明元素背景颜色匹配

前端 元素的层级 背景

jquery如何使css设定好背景颜色的div去掉背景颜色?

LaTeX:公式中元素填背景色/颜色

jQuery检测固定元素的背景颜色