【问题标题】:SVG <Image> tag only partially rendering on iPhoneSVG <Image> 标签仅在 iPhone 上部分呈现
【发布时间】:2020-07-28 14:53:00
【问题描述】:

我一直在我的 PC 上基于 HTML、SVG 和 Javascript 开发网页“游戏”。它通过 SVG 标签将地球的大图像加载到 SVG 视图中。在我的 PC 上进行测试没有问题,但是最近我将它发布到公共网页 (http://rbarryyoung.com/EarthOrbitalSimulator.html) 并发现只有 SVG 的右下角四分之一在我的 iPhone 和 iPad 上的 SVG 视图上呈现。像这样:

起初,我以为它只是 SVG 视口中的图像,但后来我意识到除了右下象限之外,整个 SVG 视口都是黑色的。 SVG 视口的大小正确无误,它看起来好像在它的 3/4 上(或只有 1/4 渲染)有一些黑色蒙版。

以下是我认为相关的 HTML 代码行,包含第一个 SVG 视图的 Div 标记(第 67 行):

<div id="divSvg1" 
    style="position:relative; z-index:1; margin:15px; 
        top:100px; 
        width:640px; height:640px; 
        background-color:black;
        float:left;"
    >

SVG 标签(第 104 行):

    <svg  id="svgEa" 
        style="width:100%; height:100%;"
        viewBox="-7500 -7500 15000 15000"
        preserveAspectRatio="xMidYMid meet"
        clip-path="url(#svgEaClip)"
        transform="scale(1.0,1.0)"
        version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <!-- NOTE: All internal units are in KM (or %)  -->

以及嵌入的 Image 标签(从第 160 行开始):

        <g id="gEaAll" transform="scale(1.0,1.0)" >

            <!-- ... -->

            <g id="gEaSurfaceFacingBottom" class="eaSurfaceFacing">
                <g id=gEarthImage>
                    <!-- ...  -->
                    <image x="-6413" y="-6413" width="12826" height="12826" href="eosImages/globe-arctic 8bit.png" />
                </g>
            </g>

第二个 SVG 视图是一个带阴影的( 标签),第一个的缩放视图有同样的问题。

我已经在我的 PC 上测试了这个,在 Chrome、Edge 和 IE 的两个屏幕上都可以正常工作。我还在我的 iPhone 上用 Safari 和 Edge 测试过这个,我的 iPad 上用 Safari、Chrome 和 Edge 测试过,所有这些都失败了。我只尝试了 SVG 之外的 PNG 文件的裸 标记,并且在这些平台上运行良好。

我没有任何 Android 平台可供测试,所以如果有人想尝试并告诉我,我可以在此处添加这些结果。

我对此进行了研究,虽然有很多关于 iOS 不渲染图像的东西,但大多数是完全无法渲染,而不是这个非常具体的部分渲染,更不用说关于 SVG 差异的具体内容。最终我没有发现任何似乎是相同问题的东西。

总结一下,我的问题是:是什么导致了这个问题或者我做错了什么,我该如何解决? (我确实知道我需要为移动设备设置不同的样式/CSS 布局,但我仍然需要知道需要更改哪些内容才能正确渲染)

【问题讨论】:

  • 在您的主页,第 114 行和第 301 行 &lt;clipPath id="svgEaClip"&gt;&lt;rect width="100%" height="100%" /&gt;&lt;/clipPath&gt;。这条特定的行有什么作用。如果我删除了&lt;cliPath&gt; 之后的内容,那就是渲染。而且你的&lt;image /&gt;标签没有问题。
  • 在安卓上完美运行。似乎是 Safari 问题
  • @Fussionweb 这是一个 clipPath,用于防止 SVG 视口中位于视图框之外的元素在网页上显示。我在 Windows 上测试的浏览器之一就是这样做的。也就是说,有一些大元素部分位于视口之外,因此它们应该被隐式裁剪,但事实并非如此。所以我添加了这个 clipPath 来显式剪辑所有元素,使其仅在视口中可见。
  • 进入开发工具,检查剪辑路径是否超出您的内容。您的剪辑路径也工作正常,它只是在其路径上显示内容,只需尝试修复剪辑的 x 和 y。
  • 检查此链接可能会对您有所帮助clipPath。它在 Safari 中没有问题

标签: html ios svg rendering


【解决方案1】:

为您的&lt;rect /&gt; 添加 X 和 Y 坐标。在您的情况下,您的 Clip-Path Rectangle 不在精确坐标中。

这是为我工作的代码


    <clipPath>
         <rect x="-7500px" y="-7500px" width="100%" height="100%" />
    <cliPath>

在第 114 和 301 行用您的 &lt;clipPath&gt; 替换此代码。

这是截图

此外,这里还有一个现场演示,它在我的 Mac Safari 以及 Windows Chrome 中都可以使用,我在其中获取了您的一部分代码。

【讨论】:

  • 我真的应该在 X 和 Y 属性上使用“px”吗? / 元素中任何东西的比例不只是视图框坐标系,因此是无单位的吗?
  • 是的,做到了!仅供参考,它确实可以在没有“px”的情况下工作。谢谢
【解决方案2】:

更新

查看@fussionweb 的答案。

原答案:
您可以在clip-path 之前尝试-webkit- 前缀。这似乎是与剪辑路径相关的 Safari 问题。

【讨论】:

  • stackoverflow.com/questions/41860477/… 专门处理这个问题。
  • @iOS 上的 Chrome 和 Edge 也会发生这种情况。但我会试试这个。
  • 嗯,我的网页使用 SVG 属性来剪辑 SVG,但是您提供的链接使用的是 CSS,我认为“-webkit-”是专门的 CSS 不是吗? -webkit-clip-path 属性是否存在?
  • 嗯,我刚刚注意到 clip-path 属性上的 Mozilla doc 填写了 no 兼容性信息。这似乎很奇怪,不要不知道我以前有没有见过。 (我也没有意识到我必须明确检查我正在使用的每个标签属性的兼容性 >:(.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多