【bug记录10】同一iOS webview页面中相同的两个svg图标出现部分显示或全部不显示的情况

ops/2024/11/30 17:39:03/

一、问题背景

在vue项目中,同一页面中直接复制粘贴了两个相同的svg代码嵌入到html中

在chrome浏览器中显示良好;

但是在Safari浏览器 或者 iOS WKwebview中,出现只显示一个svg或者两个都不显示的情况,但是绑定在svg的点击事件仍然可以触发

svg的代码如下

 <svg width="18" height="18" viewBox="0 0 24 24" fill="#212121" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_3468_29991)"><path fill-rule="evenodd" clip-rule="evenodd" d="M6.5 8.69995H4.55C3.55589 8.69995 2.75 9.50584 2.75 10.5V19.4C2.75 20.3941 3.55589 21.2 4.55 21.2H19.45C20.4441 21.2 21.25 20.3941 21.25 19.4V10.5C21.25 9.50584 20.4441 8.69995 19.45 8.69995H17.5V10.5H19.45V19.4H4.55L4.55 10.5H6.5V8.69995Z" /><path fill-rule="evenodd" clip-rule="evenodd" d="M11.3634 2.11358C11.7149 1.76211 12.2848 1.76211 12.6362 2.11358L16.9191 6.39642C17.1143 6.59168 17.1143 6.90827 16.9191 7.10353L16.3534 7.66921C16.1581 7.86448 15.8416 7.86448 15.6463 7.66921L11.9998 4.02277L8.3534 7.66921C8.15813 7.86448 7.84155 7.86448 7.64629 7.66921L7.0806 7.10353C6.88534 6.90827 6.88534 6.59168 7.0806 6.39642L11.3634 2.11358Z" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4001 2.69995C12.6762 2.69995 12.9001 2.92381 12.9001 3.19995V16C12.9001 16.2761 12.6762 16.5 12.4001 16.5H11.6001C11.324 16.5 11.1001 16.2761 11.1001 16V3.19995C11.1001 2.92381 11.324 2.69995 11.6001 2.69995H12.4001Z" /></g><defs><clipPath id="clip0_3468_29991"><rect width="24" height="24" /></clipPath></defs></svg>

二、问题分析

当时由于不清楚原因,svg元素不显示但是可以点击,证明是svg绘制渲染这一步出了问题,即矢量图形没有被正确解析

🌟于是做了两组对照实验:

  • 将两个相同的svg代码,删除其中一份,看是否可以显示【结果:单一svg在页面中可以显示】
  • 将两个的svg代码均替换成页面中另一个可以显示的svg,看是否可以显示【结果:全部替换成如下svg的时候,是可以两个同时正常显示的
 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M14.9999 4L6.99994 12L14.9999 20" stroke="#212121" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
</svg>

👍根据上述实验分析:

对比新替换的svg代码和原svg代码,可以看出新svg代码最大的不同是没有应用clip-path进行区域裁剪而仅仅是用了path元素绘制

而原svg单个可以显示、两个则不能显示,猜测可能是clip-path的id在iOS系统中解析需要局部唯一,否则会造成冲突。经验证和查询资料,确实如此。

拓展总结

诸如<clipPath>此类的图形效果标签在用url进行引用时,都需要设置唯一id,否则会因为冲突而无法解析效果、从而无法正确渲染矢量图形。

例如:

  • <filter>:滤镜效果
  • <mask>:遮罩效果
  • <linearGradient>和<radialGradient>:渐变和镭射效果
  • <pattern>:使用预定义的图形对一个对象进行填充或描边(通过fill / stroke属性url引用pattern中预定义的图案)
  • <marker>:定义在<path>、<line>、<polyline> 或 <polygon> 这些线性/多边形元素上绘制箭头或者多边标记所使用的图形。(通过 marker-start、marker-mid 和 marker-end 属性将marker中定义的标记附着上来)

三、解决方法

🌰主要有两种思路:

1、避免id冲突

2、避免svg重复嵌入

👍 那么基于上述两种思路,主要有两个解决方法:

1、手动解决id冲突,在页面内保证id唯一【就是自己手动改下id值啦】

2、通过<use>标签链接svg图形实例,配合<symbol>定义图形模版对象,避免代码重复。

注意,一个symbol元素本身是不呈现的,通过use引用才显示。

🌰举例

<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><symbol id="icon-with-clip" viewBox="0 0 100 100"><defs><clipPath id="uniqueClipPath"><circle cx="50" cy="50" r="50" /></clipPath></defs><rect width="100" height="100" clip-path="url(#uniqueClipPath)" /></symbol>
</svg><!-- 引入位置1:注意use是放在svg标签中的哦 -->
<svg><use href="#icon-with-clip" />
</svg><!-- 引入位置2 -->
<svg><use href="#icon-with-clip" />
</svg>

3、svg不直接嵌入代码,通过<img>引入,但是无法直接修改 SVG 图像中的颜色

 


http://www.ppmy.cn/ops/137983.html

相关文章

CrystalDiskInfo:硬盘健康监测工具简介和下载

原论坛给你更好的阅读体验&#xff1a;CrystalDiskInfo&#xff1a;硬盘健康监测工具简介和下载 | 波波论坛 引言 在日常使用电脑时&#xff0c;硬盘的健康状态对于系统的稳定性和数据的安全性至关重要。硬盘出现故障可能会导致数据丢失&#xff0c;严重时甚至会使整个系统无…

【快速幂】算法

2024 - 11 - 26 - 第 33 篇 - 算法笔记 C、快速幂算法 作者(Author): 郑龙浩 / 仟濹(CSDN账号名) 快速幂算法 一、为什么接触这个算法 在做 洛谷P1045 这个算法题的时候&#xff0c;我发现用 普通的高精度算法&#xff0c;依然无法解决大数计算使用内存太大 的问题&#xff…

24/11/29 Vite

安装nodejs 直接下一步 node.js中自带NPM包(管理js库文件)管理工具 测试NPM命令 npm -v 检查版本 npm config set registry https://registry.npmmirror.com 设置远程仓库 2.安装vite vite是前端服务的工具集 vue团队主持开发 Vite 官网 使用vite安装命令 这个命令是安…

CSS浮动属性

Display 文档流 文档流是文档中可显示对象在排列时所占用的位置/空间 例如&#xff1a;块元素自上而下摆放&#xff0c;内联元素&#xff0c;从左到右摆放 标准流里面的限制非常多&#xff0c;导致很多页面效果无法实现 高矮不齐&#xff0c;底边对齐 空白折叠现象 无论多少…

微信小程序下拉刷新与上拉触底的全面教程

微信小程序下拉刷新与上拉触底的全面教程 引言 在微信小程序的开发中,用户体验至关重要。下拉刷新和上拉触底是提高用户交互体验的重要功能,能够让用户轻松获取最新数据和内容。本文将详细介绍这两个功能的实现方式,结合实际案例、代码示例和图片展示,帮助开发者轻松掌握…

Conda 管理python开发环境

同步发布于我的网站 &#x1f680; 故事起因: 在公司使用Requests多任务并行开发时遇到了问题&#xff0c;使用 ProcessPoolExecutor 时不能正常发出网络请求&#xff0c;会卡在网络请求发不出去&#xff0c;但是善于用 ThreadPoolExecutor 时是可以的,纠结了很久&#xff0c;一…

Docker化部署Django:高效、可扩展的Web应用部署策略

在当今快速发展的Web开发领域&#xff0c;Django以其“快速开发”和“简洁代码”的理念&#xff0c;成为了Python Web框架中的佼佼者。而Docker&#xff0c;作为一种轻量级的容器化技术&#xff0c;为应用的部署和管理提供了极大的便利。本文将探讨Django的优点、Docker部署的好…

antd table 自定义表头过滤表格内容

注意&#xff1a;该功能只能过滤可一次性返回全部数据的表格&#xff0c;通过接口分页查询的请自主按照需求改动哈~ 实现步骤&#xff1a; 1.在要过滤的列表表头增加过滤图标&#xff0c;点击图标显示浮窗 2.浮窗内显示整列可选选项&#xff0c;通过勾选单选或者全选、搜索框来…