gpt4 book ai didi

html - 为什么 SVG 数据 URL 内的 HTML 中的 SVG 数据 URL 不显示在 Chrome 中?

转载 作者:太空宇宙 更新时间:2023-11-04 15:51:36 25 4
gpt4 key购买 nike

背景

我有一个 SVG 数据 URL 作为 background-image <foreignObject> 中 HTML 元素的属性在作为 <img> 来源的 SVG 数据 URL 中元素。

问题

在 Google Chrome 中,根本不会渲染内部 SVG;而如果这整个业务不在图像中,它就会呈现出来。我该如何解决这个问题?

Wait, what? Why?

为什么将在下面,但首先我想通过添加树结构和代码示例来完成问题,以澄清上面令人费解的段落。

树:

  • <img src="data:image/svg+xml;utf8, (展览A)
    • <svg> (图表B)
      • <foreignObject>
        • <html>
          • <div style="background: url('data:image/svg+xml;utf8,
            • <svg> (图表C)

Exhibit C 根本没有呈现,就好像它不存在一样。但是,如果我删掉展览 A,使展览 B 成为顶级元素,那么展览 C 就可以正常呈现。

小代码示例:

<div>Standalone:</div>
<svg xmlns="http://www.w3.org/2000/svg" width="75" height="50" style="position:relative"><circle cx="25" cy="25" r="25" fill="red" /><foreignObject style="width: 100%; height: 100%"><html xmlns="http://www.w3.org/1999/xhtml"><style>.x {position: absolute;background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='100' height='50'><circle cx='50' cy='25' r='25' fill='blue'/></svg>"); width: 100%; height: 100%;}</style><div class="x"></div></html></foreignObject></svg>

<div>As image source:</div>
<img style="position:relative" src='data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="75" height="50" style="position:relative"><circle cx="25" cy="25" r="25" fill="red" /><foreignObject style="width: 100%; height: 100%"><html xmlns="http://www.w3.org/1999/xhtml"><style>.x {position: absolute;background: url("data:image/svg+xml;utf8,<svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;100&quot; height=&quot;50&quot;><circle cx=&quot;50&quot; cy=&quot;25&quot; r=&quot;25&quot; fill=&quot;blue&quot;/></svg>"); width: 100%; height: 100%;}</style><div class="x"></div></html></foreignObject></svg>'>

最后一点:使用 PNG 数据 URL 而不是 SVG 数据 URL 效果很好;这是在使用 SVG 时出现问题。

为什么?

将 HTML 放在 <img> 中允许通过 context.drawImage 在 Canvas 上呈现 HTML - 我通过 canvas.toDataURL 跟进为了从 HTML 生成图像,这是我的最终目标。这是一种糟糕但标准的方法,也被广泛使用的库所采用,例如 https://github.com/tsayen/dom-to-image .

不过,我的 HTML 带有自己的嵌入式 SVG,这会产生问题中提到的问题。到目前为止,我通过首先对最里面的 SVG 数据 URL 重复这个流程,用 PNG 数据 URL 替换它们,然后只渲染顶级 HTML 元素来绕过这个。但现在我想在混合中添加缩放,这使事情变得非常复杂,因为这些 PNG 无法平滑缩放,我不能先缩放,因为这样图像对于它们的元素来说太大了。

(好吧,它适用于缩放的背景图像,但不适用于不缩放的剪辑路径,我也在转换)。

其他浏览器

IE 和 Edge 不支持 HTML 内部 <foreignObject> ,所以这与他们无关。

Firefox 确实支持它,但出于某种原因,它的“独立”版本也不起作用——我也想解决这个问题,但它可能属于一个单独的问题。

相关但不重复:

最佳答案

你需要对特殊字符进行编码,我不知道到底是哪一个是罪魁祸首,但是当在整个 上使用 encodeURIComponent 时,然后再次对整个标记进行编码以将其传递到 中,一切在 Chrome 中运行良好。

<div>Standalone:</div>
<svg xmlns="http://www.w3.org/2000/svg" width="75" height="50" style="position:relative"><circle cx="25" cy="25" r="25" fill="red" /><foreignObject style="width: 100%; height: 100%"><html xmlns="http://www.w3.org/1999/xhtml"><style>.x {position: absolute;background: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width%3D'100'%20height%3D'50'%3E%3Ccircle%20cx%3D'50'%20cy%3D'25'%20r%3D'25'%20fill%3D'blue'%2F%3E%3C%2Fsvg%3E"); width: 100%; height: 100%;}</style><div class="x"></div></html></foreignObject></svg>

<div>As image source:</div>
<img style="position:relative" src="data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2275%22%20height%3D%2250%22%20style%3D%22position%3Arelative%22%3E%3Ccircle%20cx%3D%2225%22%20cy%3D%2225%22%20r%3D%2225%22%20fill%3D%22red%22%20%2F%3E%3CforeignObject%20style%3D%22width%3A%20100%25%3B%20height%3A%20100%25%22%3E%3Chtml%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%3Cstyle%3E.x%20%7Bposition%3A%20absolute%3Bbackground%3A%20url(%22data%3Aimage%2Fsvg%2Bxml%3Butf8%2C%253Csvg%2520xmlns%253D'http%253A%252F%252Fwww.w3.org%252F2000%252Fsvg'%2520width%253D'100'%2520height%253D'50'%253E%253Ccircle%2520cx%253D'50'%2520cy%253D'25'%2520r%253D'25'%2520fill%253D'blue'%252F%253E%253C%252Fsvg%253E%22)%3B%20width%3A%20100%25%3B%20height%3A%20100%25%3B%7D%3C%2Fstyle%3E%3Cdiv%20class%3D%22x%22%3E%3C%2Fdiv%3E%3C%2Fhtml%3E%3C%2FforeignObject%3E%3C%2Fsvg%3E">

另请注意 <foreingObject>widthheight属性在 SVG1.1 中是强制性的,因此,省略它们将只在 Chrome 中有效。

所以对于其他浏览器还是要实现这个新特性

<div>Standalone:</div>
<svg xmlns="http://www.w3.org/2000/svg" width="75" height="50" style="position:relative"><circle cx="25" cy="25" r="25" fill="red" /><foreignObject width="100%" height="100%"><html xmlns="http://www.w3.org/1999/xhtml"><style>.x {position: absolute;background: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width%3D'100'%20height%3D'50'%3E%3Ccircle%20cx%3D'50'%20cy%3D'25'%20r%3D'25'%20fill%3D'blue'%2F%3E%3C%2Fsvg%3E"); width: 100%; height: 100%;}</style><div class="x"></div></html></foreignObject></svg>

<div>As image source:</div>
<img style="position:relative" src="data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2275%22%20height%3D%2250%22%20style%3D%22position%3Arelative%22%3E%3Ccircle%20cx%3D%2225%22%20cy%3D%2225%22%20r%3D%2225%22%20fill%3D%22red%22%20%2F%3E%3CforeignObject%20width%3D%22100%%22%20height%3D%22100%%22%3E%3Chtml%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%3Cstyle%3E.x%20%7Bposition%3A%20absolute%3Bbackground%3A%20url(%22data%3Aimage%2Fsvg%2Bxml%3Butf8%2C%253Csvg%2520xmlns%253D'http%253A%252F%252Fwww.w3.org%252F2000%252Fsvg'%2520width%253D'100'%2520height%253D'50'%253E%253Ccircle%2520cx%253D'50'%2520cy%253D'25'%2520r%253D'25'%2520fill%253D'blue'%252F%253E%253C%252Fsvg%253E%22)%3B%20width%3A%20100%25%3B%20height%3A%20100%25%3B%7D%3C%2Fstyle%3E%3Cdiv%20class%3D%22x%22%3E%3C%2Fdiv%3E%3C%2Fhtml%3E%3C%2FforeignObject%3E%3C%2Fsvg%3E">

关于html - 为什么 SVG 数据 URL 内的 HTML 中的 SVG 数据 URL 不显示在 Chrome 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49663180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com