标签不能直接调节饱和度,因其仅负责按条件选择预处理的静态图片;真正起作用的是其内部 元素及 css filter,且需注意 safari 渲染限制。

<picture></picture> 标签本身不支持动态调节饱和度——它只负责按条件(如设备像素比、宽高、色彩方案)选择不同源图片,不能对已加载的图片实时应用 filter: saturate() 或其他 CSS 滤镜。
为什么 <picture></picture> 不能直接调饱和度
它的设计目标是“资源分发”,不是“运行时图像处理”。所有 <source></source> 的 srcset 或 media 属性都指向**预处理好的静态图片文件**(比如一张已用 PS 提前增强饱和度的 logo-vivid.png),浏览器不会在加载后对这些图片再加滤镜。
常见误解是以为写上 media="(prefers-color-scheme: dark)" 就能自动触发 CSS 滤镜,其实它只决定加载哪张图,后续样式仍需单独作用于 <img> 元素本身。
想让 <picture></picture> 配合饱和度控制,必须套一层 <img>
真正起作用的是嵌套在 <picture></picture> 内部的 <img> 标签。只有它能接收 CSS 样式,包括 filter:
<picture><source media="(prefers-color-scheme: dark)" srcset="cat-dark.jpg"><source media="(prefers-color-scheme: light)" srcset="cat-light.jpg"> @@##@@ </source></source></picture>
.saturate-vivid { filter: saturate(1.4); } 这行 CSS 才真正生效——但要注意:
- 它会同时作用于所有被选中的源图(
cat-dark.jpg和cat-light.jpg都会被提鲜) - 如果某张源图本身已过度饱和,叠加
saturate(1.4)可能导致色块溢出或细节丢失 - 不能靠
<picture></picture>实现“暗色模式下降饱和、亮色模式下提饱和”这种反向逻辑——因为<source></source>不控制样式,只控制资源
真要按主题动态调饱和度,得放弃 <picture></picture> 分发逻辑
如果你的核心需求是“系统切暗色,图片就自动降饱和”,那么 <picture></picture> 不是解法,应该直接用 <img src="cat-fallback.jpg" alt="cat" class="saturate-vivid"> + 媒体查询 CSS:
@@##@@
.theme-aware-sat { filter: saturate(1.2); }<br>@media (prefers-color-scheme: dark) {<br> .theme-aware-sat { filter: saturate(0.7); }<br>}
这样更轻量、可预测,也避免了 <picture></picture> 的冗余层级。唯一代价是:所有主题共用同一张原图,依赖 CSS 渲染时实时计算——这正是现代浏览器擅长的事。
容易被忽略的关键点
哪怕你坚持用 <picture></picture> 包裹,并给内部 <img> 加了 filter,也要注意 Safari 对 <picture></picture> 内部元素的渲染限制:iOS Safari 15.3 及更早版本中,若 <img src="cat.jpg" alt="cat" class="theme-aware-sat"> 的某个祖先(比如 <picture></picture> 父容器)是 display: inline,filter 会静默失效。务必设 display: block 或 inline-block 显式声明。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











