【问题标题】:Set SVG height and width to that of the <text> node inside it将 SVG 的高度和宽度设置为其中的 <text> 节点的高度和宽度
【发布时间】:2015-03-18 21:13:31
【问题描述】:

有没有办法使 SVG 元素的宽度和高度等于其中的 text 节点内的文本宽度?

这是一个演示:

http://codepen.io/Tiger0915/pen/LEyePy

这是 SVG 标记:

<span>I want </span>

<svg width="100%" height="80px">
  <text x="0" y="0" fill="white">
    THESE WORDS
  </text>
</svg>

<span>to be an SVG</span>

理想情况下,我希望将 SVG 视为内联元素(例如 span 节点)。

我希望它像这样呈现:

I want THESE WORDS to be an SVG

THESE WORDS 是 SVG。

如果我在svg 节点上执行width="auto" height="auto",它根本不会渲染。

如何使 SVG 元素自动适应其中文本元素的宽度?

【问题讨论】:

    标签: html css svg height inline


    【解决方案1】:

    我不知道任何 SVG+CSS 解决方案。

    您可以使用一些 JavaScript 来调整大小:

    // get the bounding box for the text element
    var bbox = text.getBBox();
    
    // set the svg width/height accordingly
    svg.setAttribute( 'width', bbox.width );
    svg.setAttribute( 'height', bbox.height );
    
    // set the viewbox accordingly
    svg.setAttribute( 'viewBox', bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height );
    

    Modified Codepen

    您的普遍问题是,SVG 元素在某种意义上没有其他图像的大小。您的画布(理论上)是无限大小的。 因此,为了确定大小,浏览器必须使用所有包含的元素,渲染它们,获取渲染坐标并计算最大边界框。 Afaik 没有浏览器这样做。

    【讨论】:

    • 如果我想让 SVG text 换行,就好像它是一个普通的文本节点一样:codepen.io/Tiger0915/pen/zxwpqK
    • SVG 本身无法进行文本换行。如果您需要包装,请使用 &lt;foreignObject&gt; 将 HTML(及其包装功能)嵌入到 SVG 中。您将无法使用单个 SVG 元素模拟所有内联元素属性。
    • 即使使用&lt;foreignObject&gt;,您也只能在 SVG 内部进行包装,而不是 SVG 元素本身的包装!
    猜你喜欢
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多