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

在 Chrome 浏览器开发完成,测试上线都符合预期,但是最后收到用户反馈:她用的是 mac 自带的 Safari 浏览器,在 Safari 里markdown编辑器会出现错位等各种问题。于是我先打开我的 Firefox 浏览器,自测正常,那估计就是 Safari 浏览器的兼容问题了。我看了下 Safari 浏览器的表现:markdown 编辑器每次一打开检查本身的 dom 占位是正确的,但是可视的编辑器界面却会被渲染到最顶部 标签的左上角原点(0,0)。最后排查到是因为 safari 对 SVG 中的 标签支持不友好,渲染容易错位,特别是遇到 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心中永远的痛,一方面希望谷歌或火狐浏览器能一统江湖,但是另一方面又希望百家齐放能促进前端技术的发展。其实,最重要的还是遵守标准,既然标准都设立在那了,

推荐内容

  • 全球新动态:Safari浏览器对SVG中的<foreignObject>标签支持不友好,渲染容易错位
    全球新动态:Safari浏览器对SVG中的标签支持不友好,渲染容易错位

  • AcWing241. 楼兰图腾
    AcWing241. 楼兰图腾

  • 天天速递!CentOS7配置静态IP
    天天速递!CentOS7配置静态IP

  • MAUI新生6.1-Shell导航视觉层次结构
    MAUI新生6.1-Shell导航视觉层次结构

  • 今日最新!洛谷 P5721 【入门3】循环结构
    今日最新!洛谷 P5721 【入门3】循环结构

  • 【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】
    【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】

  • 教你用JavaScript实现搜索展开
    教你用JavaScript实现搜索展开

  • 环球微动态丨「杂题乱写」AtCoderDP26 题
    环球微动态丨「杂题乱写」AtCoderDP26 题

  • (二)elasticsearch 源码目录
    (二)elasticsearch 源码目录

  • 新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作
    新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作

  • 焦点速递!Sentinel的规则
    焦点速递!Sentinel的规则

  • MAUI新生5.3-Layout布局类控件难点
    MAUI新生5.3-Layout布局类控件难点

  • 天天精选!Kubernetes监控手册03-宿主监控实操
    天天精选!Kubernetes监控手册03-宿主监控实操

  • 世界播报:cmake-4
    世界播报:cmake-4

  • 27款笔记软件的介绍
    27款笔记软件的介绍

  • 全球视点!ts10_使用webpack打包ts文件3
    全球视点!ts10_使用webpack打包ts文件3

  • 环球今日报丨C#封装GRPC类库及调用简单实例
    环球今日报丨C#封装GRPC类库及调用简单实例

  • 百事通!Spring IOC官方文档学习笔记(四)之依赖项(下)
    百事通!Spring IOC官方文档学习笔记(四)之依赖项(下)

  • 【天天报资讯】Web 标准 & W3C 规范
    【天天报资讯】Web 标准 & W3C 规范

  • 焦点关注:C++基础3
    焦点关注:C++基础3

  • 环球即时看!以小博大外小内大,Db数据库SQL优化之小数据驱动大数据
    环球即时看!以小博大外小内大,Db数据库SQL优化之小数据驱动大数据

  • ts09_使用webpack打包ts文件2
    ts09_使用webpack打包ts文件2

  • 全球热头条丨AcWing1134/洛谷P1144 最短路计数
    全球热头条丨AcWing1134/洛谷P1144 最短路计数

  • WPF开发之Prism详解【内附源码】
    WPF开发之Prism详解【内附源码】

  • 最新快讯!Codeforces 1097 G Vladislav and a Great Legend 题解 (DP)
    最新快讯!Codeforces 1097 G Vladislav and a Great Legend 题解 (DP)

  • 02.关于线程你必须知道的8个问题(上)
    02.关于线程你必须知道的8个问题(上)

  • 天天热点!我的2022年个人总结
    天天热点!我的2022年个人总结

  • 环球焦点!FreeSWITCH学习笔记:EventSocket
    环球焦点!FreeSWITCH学习笔记:EventSocket

  • 天天短讯!多方安全计算(6):MPC中场梳理
    天天短讯!多方安全计算(6):MPC中场梳理

  • 云原生时代,18 岁的 NGINX 过时了吗?
    云原生时代,18 岁的 NGINX 过时了吗?

  • AcWing1131. 拯救大兵瑞恩
    AcWing1131. 拯救大兵瑞恩

  • 全球新资讯:Apache Log4j 远程代码执行漏洞(CVE-2021-44228、CVE-2021-45046)修复方案
    全球新资讯:Apache Log4j 远程代码执行漏洞(CVE-2021-44228、CVE-2021-45046)修复方案

  • 微动态丨vue3的setup函数的使用
    微动态丨vue3的setup函数的使用

  • 教你用JavaScript实现进度条
    教你用JavaScript实现进度条

  • 世界消息!Sentinel
    世界消息!Sentinel

  • 今日要闻!Shell脚本4
    今日要闻!Shell脚本4

  • 【新要闻】【验证码逆向专栏】某验三代滑块验证码逆向分析
    【新要闻】【验证码逆向专栏】某验三代滑块验证码逆向分析

  • 短讯!安全多方计算(5):隐私集合求交方案汇总分析
    短讯!安全多方计算(5):隐私集合求交方案汇总分析

  • 天天观速讯丨论文解读()《Detect Rumors in Microblog Posts for Low-Resource Domains via Adver
    天天观速讯丨论文解读()《Detect Rumors in Microblog Posts for Low-Resource Domains via Adver

  • 每日讯息!GitHub实用开源项目
    每日讯息!GitHub实用开源项目

  • 世界热议:上干货 | 园区智慧物联管理解决方案
    世界热议:上干货 | 园区智慧物联管理解决方案

  • Shell脚本3
    Shell脚本3

  • 微头条丨AcWing341. 洛谷P1073, NOIP2009 最优贸易
    微头条丨AcWing341. 洛谷P1073, NOIP2009 最优贸易

  • 百事通!面向对象与面向过程
    百事通!面向对象与面向过程

  • 全球速递!Flex布局总结
    全球速递!Flex布局总结

  • Codeforces 1630 E Expected Components 题解 (组合数学)
    Codeforces 1630 E Expected Components 题解 (组合数学)

  • 头条:Java基础项目:超市管理项目
    头条:Java基础项目:超市管理项目

  • 环球观察:高可用 Canal集群 实操( 秒懂 + 史上最全)
    环球观察:高可用 Canal集群 实操( 秒懂 + 史上最全)

  • 微头条丨认证管理(锐捷业软篇)
    微头条丨认证管理(锐捷业软篇)

  • 排序算法模板(更新中)
    排序算法模板(更新中)

驱动网