首页 文章 精选 留言 我的

精选列表

搜索[响应式],共10009篇文章
优秀的个人博客,低调大师

响应式布局中 SVG 图标在 Safari 下模糊的根源与修复

在移动端项目里用 SVG 做图标已经是很常规的做法,但最近在 iPhone 12 和 iPad 上遇到一个怪现象:同一套 SVG 图标,在 Chrome 和 Android 设备上边缘清晰锐利,但在 Safari 中却有一层明显的模糊,尤其在图标尺寸不是整数倍缩放时更严重。这个问题通常出现在使用 `viewBox` 加百分比宽高的场景,比如图标放在 Flex 容器里随容器缩放,或者通过 CSS 设置 `width: 1.5em` 这类非整数像素值。根本原因在于 Safari 对 SVG 的栅格化策略与 Blink 不同,它倾向于在布局阶段就按最终设备像素比生成位图,而 `vector-effect` 和 `shape-rendering` 的默认值又放大了抗锯齿带来的模糊。文章会从 SVG 渲染管线讲起,分析 Safari 的舍入行为,给出几个实际可用的修复手段,并对比它们对动画和性能的影响。 ## 先确认模糊到底来自哪里 很多人第一反应是给 SVG 加 `shape-rendering: crispEdges`,但这招只对纯水平垂直的线条有效,对带曲线和斜线的图标反而会让边缘出现难看的锯齿。更靠谱的做法是先判断模糊发生在哪个环节:是 SVG 本身的坐标精度不够,还是 CSS 缩放导致浏览器重新采样,又或者是 `viewBox` 和实际渲染尺寸比例不匹配。 拿一个常见的 24x24 图标举例: ```html ``` 在 Safari 下把宽高设成 18px 时,24 到 18 的缩放比是 0.75,路径坐标会被乘上 0.75 后落在半像素上,抗锯齿一开就糊。如果换成 16px 或 24px,模糊会明显减轻——这就是整数倍缩放带来的差异。 ## 用 CSS 控制尺寸时避开半像素 设计稿里经常出现 `1.25rem`、`1.5rem` 这种尺寸,换算到根字号 16px 就是 20px、24px,没问题;但根字号被改成 15px 或 17px 时,算出来就是 18.75px、25.5px,落在半像素上。 一个低成本的处理是在图标容器上做一次像素对齐: ```css .icon { display: inline-flex; align-items: center; justify-content: center; width: 1.5rem; height: 1.5rem; } .icon > svg { width: 100%; height: 100%; display: block; } ``` 关键点是给 svg 加 `display: block`,去掉行内元素基线带来的额外空隙,否则父容器 `1.5rem` 的实际可用高度可能变成 23.2px 这类数值,Safari 会按这个高度重新计算缩放。 ## 让 viewBox 和渲染尺寸保持整数关系 如果图标本身来自设计工具,导出时最好把 `viewBox` 设成实际要用的倍数。比如需要 20px、40px、60px 三种尺寸,就把 `viewBox` 设成 `0 0 20 20`,路径坐标也按 20 的网格来画。这样无论怎么缩放,比例都是整数,Safari 的栅格化结果会干净很多。 已经有一批 24 网格的图标怎么办?可以在不改路径的前提下,把 `viewBox` 改成 `0 0 24 24`,但用 CSS 强制渲染尺寸为 24 的整数倍: ```css .icon svg { width: 24px; height: 24px; } @media (min-resolution: 2dppx) { .icon svg { width: 48px; height: 48px; transform: scale(0.5); transform-origin: 0 0; } } ``` 这段代码先按 2 倍尺寸渲染,再通过 `transform` 缩回目标大小。Safari 在处理 `transform` 缩放时会走合成层,不重新栅格化 SVG 内容,模糊基本消失。代价是图标如果参与布局计算,视觉尺寸和占位尺寸会不一致,需要外面再包一层固定尺寸的容器。 ## 用 CSS `image-rendering` 的坑 网上有些回答会建议加: ```css svg { image-rendering: -webkit-optimize-contrast; } ``` 在 Safari 上这个属性对 SVG 的生效情况并不稳定,而且会影响图标内部渐变的过渡。更安全的做法是只在真正需要硬边缘的小尺寸图标(比如 12px 以下的箭头、关闭按钮)上使用,并且配合 `shape-rendering: geometricPrecision` 观察效果。 ## 一个实际项目里的组合方案 我目前维护的后台系统里,图标组件统一走一个 `SvgIcon`: ```jsx function SvgIcon({ name, size = 20, className }) { const dimension = Math.round(size); return ( ); } ``` 组件里用 `Math.round` 保证传入的任意尺寸都落到整数像素,`viewBox` 保持 24 网格,但宽高直接按目标像素给。这样在绝大多数 Safari 版本下不会再出现半像素模糊。如果某个图标在 20px 下还是偏糊,就单独把它换成 20 网格重新导出,而不是靠 CSS 硬调。 ## 什么时候不该折腾 SVG 缩放 如果图标本身包含大量 1px 描边或者极细的线条,在 Safari 里再怎么调也可能达不到设计稿的锐度。这种场景直接按目标尺寸导出 SVG,把 `viewBox` 和路径坐标都对齐到最终像素网格,比在运行时做缩放可靠得多。另外对于需要频繁切换尺寸的交互图标,可以准备两套资源,小尺寸用 16 网格,大尺寸用 24 网格,通过 `matchMedia` 或容器查询切换,避免一次缩放跨过太多倍率。 模糊问题排查到最后,往往不是某一个 CSS 属性写错了,而是设计稿的坐标网格、导出配置和运行时尺寸三者没有对齐。把这三者统一到整数像素上,Safari 的 SVG 渲染并不比 Chrome 差。 推荐查看天气:https://www.40tianqi.com/yunyan/10tian.html 推荐查看天气:https://www.40tianqi.com/yunyan/15tian.html 推荐查看天气:https://www.40tianqi.com/yunyan/40tian.html 推荐查看天气:https://www.40tianqi.com/huaxi/ 推荐查看天气:https://www.40tianqi.com/huaxi/zuotian.html 推荐查看天气:https://www.40tianqi.com/huaxi/7tian.html 推荐查看天气:https://www.40tianqi.com/huaxi/10tian.html 推荐查看天气:https://www.40tianqi.com/huaxi/15tian.html 推荐查看天气:https://www.40tianqi.com/huaxi/40tian.html 推荐查看天气:https://www.40tianqi.com/wudang/ 推荐查看天气:https://www.40tianqi.com/wudang/zuotian.html 推荐查看天气:https://www.40tianqi.com/wudang/7tian.html 推荐查看天气:https://www.40tianqi.com/wudang/10tian.html 推荐查看天气:https://www.40tianqi.com/wudang/15tian.html 推荐查看天气:https://www.40tianqi.com/wudang/40tian.html 推荐查看天气:https://www.40tianqi.com/baiyun/ 推荐查看天气:https://www.40tianqi.com/baiyun/zuotian.html 推荐查看天气:https://www.40tianqi.com/baiyun/7tian.html 推荐查看天气:https://www.40tianqi.com/baiyun/10tian.html 推荐查看天气:https://www.40tianqi.com/baiyun/15tian.html 推荐查看天气:https://www.40tianqi.com/baiyun/40tian.html 推荐查看天气:https://www.40tianqi.com/xiaohe/ 推荐查看天气:https://www.40tianqi.com/xiaohe/zuotian.html 推荐查看天气:https://www.40tianqi.com/xiaohe/7tian.html 推荐查看天气:https://www.40tianqi.com/xiaohe/10tian.html 推荐查看天气:https://www.40tianqi.com/xiaohe/15tian.html 推荐查看天气:https://www.40tianqi.com/xiaohe/40tian.html 推荐查看天气:https://www.40tianqi.com/kaiyang/ 推荐查看天气:https://www.40tianqi.com/kaiyang/zuotian.html 推荐查看天气:https://www.40tianqi.com/kaiyang/7tian.html 推荐查看天气:https://www.40tianqi.com/kaiyang/10tian.html 推荐查看天气:https://www.40tianqi.com/kaiyang/15tian.html 推荐查看天气:https://www.40tianqi.com/kaiyang/40tian.html 推荐查看天气:https://www.40tianqi.com/guiyangxifeng/ 推荐查看天气:https://www.40tianqi.com/guiyangxifeng/zuotian.html 推荐查看天气:https://www.40tianqi.com/guiyangxifeng/7tian.html 推荐查看天气:https://www.40tianqi.com/guiyangxifeng/10tian.html 推荐查看天气:https://www.40tianqi.com/guiyangxifeng/15tian.html 推荐查看天气:https://www.40tianqi.com/guiyangxifeng/40tian.html 推荐查看天气:https://www.40tianqi.com/xiuwen/ 推荐查看天气:https://www.40tianqi.com/xiuwen/zuotian.html 推荐查看天气:https://www.40tianqi.com/xiuwen/7tian.html 推荐查看天气:https://www.40tianqi.com/xiuwen/10tian.html 推荐查看天气:https://www.40tianqi.com/xiuwen/15tian.html 推荐查看天气:https://www.40tianqi.com/xiuwen/40tian.html 推荐查看天气:https://www.40tianqi.com/qingzhen/ 推荐查看天气:https://www.40tianqi.com/qingzhen/zuotian.html 推荐查看天气:https://www.40tianqi.com/qingzhen/7tian.html 推荐查看天气:https://www.40tianqi.com/qingzhen/10tian.html 推荐查看天气:https://www.40tianqi.com/qingzhen/15tian.html 推荐查看天气:https://www.40tianqi.com/qingzhen/40tian.html 推荐查看天气:https://www.40tianqi.com/liupanshui/ 推荐查看天气:https://www.40tianqi.com/liupanshui/zuotian.html 推荐查看天气:https://www.40tianqi.com/liupanshui/7tian.html 推荐查看天气:https://www.40tianqi.com/liupanshui/10tian.html 推荐查看天气:https://www.40tianqi.com/liupanshui/15tian.html 推荐查看天气:https://www.40tianqi.com/liupanshui/40tian.html 推荐查看天气:https://www.40tianqi.com/liuzhi/ 推荐查看天气:https://www.40tianqi.com/liuzhi/zuotian.html 推荐查看天气:https://www.40tianqi.com/liuzhi/7tian.html 推荐查看天气:https://www.40tianqi.com/liuzhi/10tian.html 推荐查看天气:https://www.40tianqi.com/liuzhi/15tian.html 推荐查看天气:https://www.40tianqi.com/liuzhi/40tian.html 推荐查看天气:https://www.40tianqi.com/shuicheng/ 推荐查看天气:https://www.40tianqi.com/shuicheng/zuotian.html 推荐查看天气:https://www.40tianqi.com/shuicheng/7tian.html 推荐查看天气:https://www.40tianqi.com/shuicheng/10tian.html 推荐查看天气:https://www.40tianqi.com/shuicheng/15tian.html 推荐查看天气:https://www.40tianqi.com/shuicheng/40tian.html 推荐查看天气:https://www.40tianqi.com/panxian/ 推荐查看天气:https://www.40tianqi.com/panxian/zuotian.html 推荐查看天气:https://www.40tianqi.com/panxian/7tian.html 推荐查看天气:https://www.40tianqi.com/panxian/10tian.html 推荐查看天气:https://www.40tianqi.com/panxian/15tian.html 推荐查看天气:https://www.40tianqi.com/panxian/40tian.html 推荐查看天气:https://www.40tianqi.com/zunyi/ 推荐查看天气:https://www.40tianqi.com/zunyi/zuotian.html 推荐查看天气:https://www.40tianqi.com/zunyi/7tian.html 推荐查看天气:https://www.40tianqi.com/zunyi/10tian.html 推荐查看天气:https://www.40tianqi.com/zunyi/15tian.html 推荐查看天气:https://www.40tianqi.com/zunyi/40tian.html 推荐查看天气:https://www.40tianqi.com/honghuagang/ 推荐查看天气:https://www.40tianqi.com/honghuagang/zuotian.html 推荐查看天气:https://www.40tianqi.com/honghuagang/7tian.html 推荐查看天气:https://www.40tianqi.com/honghuagang/10tian.html 推荐查看天气:https://www.40tianqi.com/honghuagang/15tian.html 推荐查看天气:https://www.40tianqi.com/honghuagang/40tian.html 推荐查看天气:https://www.40tianqi.com/huichuan/ 推荐查看天气:https://www.40tianqi.com/huichuan/zuotian.html 推荐查看天气:https://www.40tianqi.com/huichuan/7tian.html 推荐查看天气:https://www.40tianqi.com/huichuan/10tian.html 推荐查看天气:https://www.40tianqi.com/huichuan/15tian.html 推荐查看天气:https://www.40tianqi.com/huichuan/40tian.html 推荐查看天气:https://www.40tianqi.com/zunyixian/ 推荐查看天气:https://www.40tianqi.com/zunyixian/zuotian.html 推荐查看天气:https://www.40tianqi.com/zunyixian/7tian.html 推荐查看天气:https://www.40tianqi.com/zunyixian/10tian.html 推荐查看天气:https://www.40tianqi.com/zunyixian/15tian.html 推荐查看天气:https://www.40tianqi.com/zunyixian/40tian.html 推荐查看天气:https://www.40tianqi.com/tongzi/ 推荐查看天气:https://www.40tianqi.com/tongzi/zuotian.html 推荐查看天气:https://www.40tianqi.com/tongzi/7tian.html 推荐查看天气:https://www.40tianqi.com/tongzi/10tian.html 推荐查看天气:https://www.40tianqi.com/tongzi/15tian.html 推荐查看天气:https://www.40tianqi.com/tongzi/40tian.html 推荐查看天气:https://www.40tianqi.com/suiyang/ 推荐查看天气:https://www.40tianqi.com/suiyang/zuotian.html 推荐查看天气:https://www.40tianqi.com/suiyang/7tian.html 推荐查看天气:https://www.40tianqi.com/suiyang/10tian.html 推荐查看天气:https://www.40tianqi.com/suiyang/15tian.html 推荐查看天气:https://www.40tianqi.com/suiyang/40tian.html 推荐查看天气:https://www.40tianqi.com/zhengan/ 推荐查看天气:https://www.40tianqi.com/zhengan/zuotian.html 推荐查看天气:https://www.40tianqi.com/zhengan/7tian.html 推荐查看天气:https://www.40tianqi.com/zhengan/10tian.html 推荐查看天气:https://www.40tianqi.com/zhengan/15tian.html 推荐查看天气:https://www.40tianqi.com/zhengan/40tian.html 推荐查看天气:https://www.40tianqi.com/daozhen/ 推荐查看天气:https://www.40tianqi.com/daozhen/zuotian.html 推荐查看天气:https://www.40tianqi.com/daozhen/7tian.html 推荐查看天气:https://www.40tianqi.com/daozhen/10tian.html 推荐查看天气:https://www.40tianqi.com/daozhen/15tian.html 推荐查看天气:https://www.40tianqi.com/daozhen/40tian.html 推荐查看天气:https://www.40tianqi.com/wuchuan/ 推荐查看天气:https://www.40tianqi.com/wuchuan/zuotian.html 推荐查看天气:https://www.40tianqi.com/wuchuan/7tian.html 推荐查看天气:https://www.40tianqi.com/wuchuan/10tian.html 推荐查看天气:https://www.40tianqi.com/wuchuan/15tian.html 推荐查看天气:https://www.40tianqi.com/wuchuan/40tian.html 推荐查看天气:https://www.40tianqi.com/fenggang/ 推荐查看天气:https://www.40tianqi.com/fenggang/zuotian.html 推荐查看天气:https://www.40tianqi.com/fenggang/7tian.html 推荐查看天气:https://www.40tianqi.com/fenggang/10tian.html 推荐查看天气:https://www.40tianqi.com/fenggang/15tian.html 推荐查看天气:https://www.40tianqi.com/fenggang/40tian.html 推荐查看天气:https://www.40tianqi.com/meitan/ 推荐查看天气:https://www.40tianqi.com/meitan/zuotian.html 推荐查看天气:https://www.40tianqi.com/meitan/7tian.html 推荐查看天气:https://www.40tianqi.com/meitan/10tian.html 推荐查看天气:https://www.40tianqi.com/meitan/15tian.html 推荐查看天气:https://www.40tianqi.com/meitan/40tian.html 推荐查看天气:https://www.40tianqi.com/yuqing/ 推荐查看天气:https://www.40tianqi.com/yuqing/zuotian.html 推荐查看天气:https://www.40tianqi.com/yuqing/7tian.html 推荐查看天气:https://www.40tianqi.com/yuqing/10tian.html 推荐查看天气:https://www.40tianqi.com/yuqing/15tian.html 推荐查看天气:https://www.40tianqi.com/yuqing/40tian.html 推荐查看天气:https://www.40tianqi.com/xishui/ 推荐查看天气:https://www.40tianqi.com/xishui/zuotian.html 推荐查看天气:https://www.40tianqi.com/xishui/7tian.html 推荐查看天气:https://www.40tianqi.com/xishui/10tian.html 推荐查看天气:https://www.40tianqi.com/xishui/15tian.html 推荐查看天气:https://www.40tianqi.com/xishui/40tian.html 推荐查看天气:https://www.40tianqi.com/chishui/ 推荐查看天气:https://www.40tianqi.com/chishui/zuotian.html 推荐查看天气:https://www.40tianqi.com/chishui/7tian.html 推荐查看天气:https://www.40tianqi.com/chishui/10tian.html 推荐查看天气:https://www.40tianqi.com/chishui/15tian.html 推荐查看天气:https://www.40tianqi.com/chishui/40tian.html 推荐查看天气:https://www.40tianqi.com/renhuai/ 推荐查看天气:https://www.40tianqi.com/renhuai/zuotian.html 推荐查看天气:https://www.40tianqi.com/renhuai/7tian.html 推荐查看天气:https://www.40tianqi.com/renhuai/10tian.html 推荐查看天气:https://www.40tianqi.com/renhuai/15tian.html 推荐查看天气:https://www.40tianqi.com/renhuai/40tian.html 推荐查看天气:https://www.40tianqi.com/anshun/ 推荐查看天气:https://www.40tianqi.com/anshun/zuotian.html 推荐查看天气:https://www.40tianqi.com/anshun/7tian.html 推荐查看天气:https://www.40tianqi.com/anshun/10tian.html 推荐查看天气:https://www.40tianqi.com/anshun/15tian.html 推荐查看天气:https://www.40tianqi.com/anshun/40tian.html 推荐查看天气:https://www.40tianqi.com/xixiu/ 推荐查看天气:https://www.40tianqi.com/xixiu/zuotian.html 推荐查看天气:https://www.40tianqi.com/xixiu/7tian.html 推荐查看天气:https://www.40tianqi.com/xixiu/10tian.html 推荐查看天气:https://www.40tianqi.com/xixiu/15tian.html 推荐查看天气:https://www.40tianqi.com/xixiu/40tian.html 推荐查看天气:https://www.40tianqi.com/pingba/ 推荐查看天气:https://www.40tianqi.com/pingba/zuotian.html 推荐查看天气:https://www.40tianqi.com/pingba/7tian.html 推荐查看天气:https://www.40tianqi.com/pingba/10tian.html 推荐查看天气:https://www.40tianqi.com/pingba/15tian.html 推荐查看天气:https://www.40tianqi.com/pingba/40tian.html 推荐查看天气:https://www.40tianqi.com/puding/ 推荐查看天气:https://www.40tianqi.com/puding/zuotian.html 推荐查看天气:https://www.40tianqi.com/puding/7tian.html 推荐查看天气:https://www.40tianqi.com/puding/10tian.html 推荐查看天气:https://www.40tianqi.com/puding/15tian.html 推荐查看天气:https://www.40tianqi.com/puding/40tian.html 推荐查看天气:https://www.40tianqi.com/zhenning/ 推荐查看天气:https://www.40tianqi.com/zhenning/zuotian.html 推荐查看天气:https://www.40tianqi.com/zhenning/7tian.html 推荐查看天气:https://www.40tianqi.com/zhenning/10tian.html 推荐查看天气:https://www.40tianqi.com/zhenning/15tian.html 推荐查看天气:https://www.40tianqi.com/zhenning/40tian.html 推荐查看天气:https://www.40tianqi.com/guanling/ 推荐查看天气:https://www.40tianqi.com/guanling/zuotian.html 推荐查看天气:https://www.40tianqi.com/guanling/7tian.html 推荐查看天气:https://www.40tianqi.com/guanling/10tian.html 推荐查看天气:https://www.40tianqi.com/guanling/15tian.html

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册