首页 > 其他分享 >Safari浏览器对SVG中的<foreignObject>标签支持不友好,渲染容易错位

Safari浏览器对SVG中的<foreignObject>标签支持不友好,渲染容易错位

时间:2022-12-25 21:25:28浏览次数:60  
标签:浏览器 SVG 编辑器 Safari foreignObject position

  在 svg 中需要写一个 markdown 编辑器,需要用到 <foreignObject> 绘制来html,编辑器选择了 simplemde。大致html部分结构如下,<markdown-editor> 组件为定制封装好的 simplemde 编辑器。

<template>
  <svg>
    <g>
      <foreignObject :width="XXX" :height="XXX">
        <div xmlns="http://www.w3.org/1999/xhtml">
          <markdown-editor></markdown-editor>
        </div>
      </foreignObject>
    </g>
  </svg>
</template>

  在 Chrome 浏览器开发完成,测试上线都符合预期,但是最后收到用户反馈:她用的是 mac 自带的 Safari 浏览器,在 Safari 里markdown编辑器会出现错位等各种问题。于是我先打开我的 Firefox 浏览器,自测正常,那估计就是 Safari 浏览器的兼容问题了。我看了下 Safari 浏览器的表现:markdown 编辑器每次一打开检查本身的 dom 占位是正确的,但是可视的编辑器界面却会被渲染到最顶部 <svg> 标签的左上角原点(0,0)。最后排查到是因为 safari 对 SVG 中的 <foreignObject> 标签支持不友好,渲染容易错位,特别是遇到 position 属性的时候,而我在引入simplemde 编辑器的同时也引入了 simplemde.min.css,其中大量使用了 position 属性我也在 StackOverflow 和 Github 找到了几篇关于这个bug的讨论帖作为参考:

  StackOverflow:SVG foreignObject not working properly on Safari

  Github:Safari + foreignobject render issue

  最后Github一位程序员ankero一锤定音,原文大意如下:

    这不是一个问题,但是可以添加到 README 中。我将在这里添加它,以便如果有人面临类似的问题,可以在这个仓库中找到一个解决方案。在使用这个库(指的是react-d3-tree库,但是遇到的问题是一样的)进行开发时,如果使用 foreignObject 呈现节点,请检查它在 Safari (Mac + iOS)中的显示方式。我们遇到了一个问题,节点内容呈现为父 SVG 的坐标0,0(左上角)。这是由于 Safari 中的一个 bug,它影响 foreignObject 根据顶部 SVG 而不是 foreignObject 本身计算呈现位置。通过检查节点并查看基于浏览器的节点是否在应该在的位置,您可以非常清楚地看到这种效果,但是呈现在了错误的位置。(这段描述和我当时排查的结果一模一样)

    那么,如果你看到这个问题,解决方案是什么?

    据我所知,如果您使用以下任何 CSS 选项,dom 元素将呈现在错误的位置。所以解决办法就是不要用这些。对我们来说,我们需要检查浏览器是否是 Safari,然后删除一些需要一个或多个这样的样式的功能。

      所以不要在 Safari + foreignObject 中使用以下样式:

        • position(您可以使用 position: fixed,但这将导致溢出问题)
        • webkit-transform-style
        • webkit-backface-visibility
        • transition
        • transform

    如何检测 Safari?

    我们使用以下片段:

export const IS_SAFARI = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);

  这里提一下 position: fixed 导致的溢出问题,这个在上一个StackOverflow链接中被很多程序员提为解决方案,确实,如果页面不复杂的情况下,会

  各大浏览器之间的兼容问题是各位前端er心中永远的痛,一方面希望谷歌或火狐浏览器能一统江湖,但是另一方面又希望百家齐放能促进前端技术的发展。其实,最重要的还是遵守标准,既然标准都设立在那了,

标签:浏览器,SVG,编辑器,Safari,foreignObject,position
From: https://www.cnblogs.com/jdWu-d/p/16835394.html

相关文章

  • 浏览器了解知识
    浏览器和浏览器内核浏览器内核的作用:解析网页语法,并渲染网页常见的浏览器内核:Trident(三叉戟):IE、360安全浏览器、搜狗高速浏览器、百度浏览器、UC浏览器;Gecko(壁虎):M......
  • perl SVG 作图之线图
    今天尝试用perl来画一个简单的图,根据数据我们这里画线图。使用的模块是SVG::TT::Graph,两年前更新过,相比perl模块动不动十几年没有新版本,这个模块算不错了,出图格式为SVG格......
  • mfc封装cef浏览器 关闭整个窗口程序得时候又重启mfc 应用的程序
    最近使用mfc做了一个cef得浏览器多标签得。当使用这个封装得浏览器一段时间之后(超过1分钟2分钟)当关闭封装得浏览器整个窗体x得时候,整个窗体又重新弹了出来。大概现象......
  • 关闭浏览器请求icon图标
    关闭浏览器请求icon图标<linkrel="icon"href="data:,">这是阻止浏览器发出标准图标请求,加速页面显示;(当然一般不用考虑此请求)文章来源:刘俊涛的博客欢迎关注公众号、......
  • 关闭浏览器清除cookie_细讲前端设置cookie,储存用户登录信息
    关闭浏览器清除cookie_细讲前端设置cookie,储存用户登录信息weixin_39789370于 2020-12-0803:33:17 发布3382 收藏文章标签: 关闭浏览器清除cookie 安卓开发......
  • Vue中 TodoList 示例: 浏览器本地存储、自定义事件
    Vue中TodoList示例:浏览器本地存储、自定义事件1:界面展示情况2:源代码vue.config.jsconst{defineConfig}=require('@vue/cli-service')module.exports=defineConf......
  • 又是一款好用到爆炸的浏览器,用安卓机的快看!
    手机浏览器千千万,然而真正无广、好用的却没有多少个。曾经简约、广受好评的夸克浏览器,因为体积越来越大,功能越来越离谱而遭吐槽。今天,给大家带来一款简约、功能强大、无广......
  • 一款功能强大的浏览器网页视频下载插件-猫爪视频下载插件使用与安装
    猫爪视频下载插件官方版是一款功能强大的浏览器插件工具。通过猫爪视频下载插件用户可以轻松的抓取任意网页的视频文件,并将其保存到本地,节省了缓存加载的时间。猫爪视频......
  • loading动画的svg代码片段
    <svgdata-v-b9c138e2=""version="1.1"id="loader-1"xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"x="0px"y="0px"width="24px"h......
  • 浏览器的解析和执行过程
    当浏览器获得一个html文件时,会“自上而下”加载,并在加载过程中进行解析渲染。解析:1.浏览器会将HTML解析成一个DOM树(display:none,visibility:hidden)。DOM树的构建过程......