【问题标题】:background image SVG with mask using external image not working背景图像 带有使用外部图像的蒙版的 SVG 不起作用
【发布时间】:2015-02-05 00:10:11
【问题描述】:

我正在尝试使用 SVG 图像作为 CSS 背景图像。所讨论的 SVG 最终将使用许多大型 JPEG 图像(嵌入或链接)作为其他 SVG 元素的掩码。我这样做而不是使用 PNG 来节省文件大小。 (我的高度压缩的灰度 jpeg 很小)

目前我只能让嵌入的 base64 编码图像正确显示,而 Safari 无法正常工作(除了使用 embed 直接显示 SVG)

以下是我的测试代码:

(所有图片都来自archive.org,链接应该是持久的——我省略了base64编码数据)

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="application/xhtml+xml">
    <style type="text/css">
      body { font-family: Arial, sans; }
      .box1, .box2, .box3 { width: 400px; height: 100px; background-size: 192px 192px; margin: 10px 10px 0px 0px; padding: 10px; }
      .box1 { background: url("test1.svg"); }
      .box2 { background: url("test2.svg"); }
      .box3 { background: url("test3.svg"); }
      .sml { width: 100px; height: 100px; margin: 10px 10px 10px 0px; }
    </style>
  </head>
  <body>
    <div class="box1">Test 1</div>
    <div class="box2">Test 2</div>
    <div class="box3">Test 3</div>
    <img class="sml" src="test1.svg" type="image/svg+xml">
    <img class="sml" src="test2.svg" type="image/svg+xml">
    <img class="sml" src="test3.svg" type="image/svg+xml">
    <embed class="sml" src="test1.svg" type="image/svg+xml">
    <embed class="sml" src="test2.svg" type="image/svg+xml">
    <embed class="sml" src="test3.svg" type="image/svg+xml">
  </body>
</html>

工作嵌入图像 SVG

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:cc="http://web.resource.org/cc/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://www.w3.org/2000/svg"
  xmlns:svg="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  x="0px" y="0px" width="192px" height="192px" viewBox="0 0 192 192">
  <style type="text/css" id="style_css_sheet">
    .orange { fill: #f9690e; }
    .yellow { fill: #f1d40f; }
  </style>
  <defs>
    <filter id="invert">
      <feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"/>
    </filter>
    <rect id="box-bg" x="0" y="0" width="192px" height="192px" class="yellow" />
    <rect id="box-fg" x="0" y="0" width="192px" height="192px" class="orange" />
    <mask id="fg-mask" x="0" y="0" width="192px" height="192px" maskUnits="userSpaceOnUse" maskContentUnits="userSpaceOnUse">
      <image id="mask-img" width="192px" height="192px" filter="url(#invert)"
        xlink:href="data:image/jpg;base64,
        [[ DATA ]]"></image>
    </mask>
  </defs>
  <use xlink:href="#box-bg" overflow="visible"></use>
  <use xlink:href="#box-fg" mask="url(#fg-mask)" overflow="visible"></use>
</svg>

坏了??图片 xlink 变体

  <mask id="fg-mask" x="0" y="0" width="192px" height="192px" maskUnits="userSpaceOnUse" maskContentUnits="userSpaceOnUse">
    <image id="mask-img" width="192px" height="192px" filter="url(#invert)" xlink:href="http://bit.ly/1u61zrE"></image>
  </mask>

所以... Safari 只喜欢嵌入标签,chrome 和 firefox 可以做背景,但只有当图像作为数据嵌入时。任何关于如何让 Safari 工作的想法,至少在嵌入数据方面都会很棒。如果有办法让它们全部工作,那就更好了......

谢谢。

【问题讨论】:

  • 出于隐私原因,SVG-as-an-image 必须在一个文件中完整,有关详细信息,请参阅longsonr.wordpress.com/2013/10/23/…
  • 谢谢罗伯特 - 这描述了我认为在幕后发生的事情。然后我推测 Safari 尚不支持我正在做的部分工作,因为在任何情况下我都无法将我的 SVG 用作 safari 的背景图像。 (嵌入或链接图像)
  • 对于任何回答这个问题的人,当有一个可行的解决方案时,我会接受这个答案 - 正如罗伯特所指出的那样,它可能不可用(还),尽管我对 JavaScript 解决方法持开放态度t 页特定。例如。如果像modernizr这样的东西通过预渲染并插入到不支持它的浏览器的DOM中来提供这个,那就太好了。 (即所有这些??)
  • 如果您要等到 SVG-as-an-image 支持外部图像数据,您将永远等待。
  • 罗伯特你能把它添加为答案,我会接受它

标签: html image svg


【解决方案1】:

对于privacy reasons,SVG-as-an-image 必须在一个文件中完整。浏览器永远不会支持 SVG-as-an-image 中的外部引用。基本前提是您只能使用 SVG-as-an-image 来执行您可以使用光栅图像执行的操作。

如果您需要外部参考,请使用 &lt;object&gt;&lt;iframe&gt;

【讨论】:

    【解决方案2】:

    正如 Robert Longson 所提到的,浏览器不会加载引用自用作图像的 SVG 的外部文件(HTML &lt;img&gt; 或 CSS 背景图像)。

    &lt;embed&gt; 标签应该工作,加载整个 SVG 和链接的图像。不过&lt;embed&gt;是最近才标准化的,所以可能会有一些不一致的地方。为确保获得最大支持,请混合使用&lt;object&gt; 标签和&lt;embed&gt; 标签:

    <object class="sml" data="test1.svg" type="image/svg+xml">
        <embed class="sml" src="test1.svg" type="image/svg+xml" />
    </object>
    

    【讨论】:

    • 我实际上并不想在主文档中嵌入 SVG,而是使用 SVG 作为背景图像。我已经知道嵌入 SVG 的这个工作流程。 (但谢谢你,不管你清楚地记录它)
    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 2022-01-23
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多