CSS图片遮罩滑动展示_使用mask-image配合位置动画

1次阅读

chrome中mask-image需同时声明-webkit-mask-image和mask-image,仅写标准属性会失效;值须为url()或渐变;svg遮罩要避免viewbox冲突;mask-position动画需加transition且用坐标值;mask-size须与background-size匹配;firefox不支持该属性,需用clip-path或canvas降级。

CSS图片遮罩滑动展示_使用mask-image配合位置动画

mask-image 在 Chrome 里不生效?检查是否漏了 -webkit-mask-image

Chrome 和 safarimask-image 的支持至今仍依赖前缀,仅写 mask-image 会导致遮罩完全失效,页面看起来像啥都没做。

  • 必须同时声明 -webkit-mask-image 和标准 mask-image,否则在 Chrome(包括新版 edge)中无效果
  • mask-image 值不能是纯色或渐变——它只接受 url()linear-gradient()radial-gradient(),但注意:某些旧版 WebKit 只认 url() 形式
  • 如果用 SVG 作为遮罩源,确保 SVG 文件内没有 viewBox 缩放冲突,或直接内联 SVG 并设 width/height0 避免意外渲染

滑动遮罩动不了?mask-position 动画需要显式设置 transition

mask-position 本身支持 css 动画,但它不像 transform 那样默认可动画——没写 transition 就只会跳变,看不出滑动效果。

  • 必须给元素加 transition: mask-position 0.3s ease;(或 -webkit-mask-position
  • 动画触发时,mask-position 的起始值和目标值都得是明确的坐标,比如 0% 0%100% 0%;写 left/right 这类关键字在部分浏览器中不可动画
  • 若配合 @keyframes,记得在关键帧里也带上 -webkit-mask-position,否则 Safari 动画会卡住

图片边缘发虚或锯齿?mask-size 和 background-size 不匹配是主因

遮罩图和背景图尺寸对不上,就会拉伸/压缩遮罩区域,导致滑动时边缘模糊、像素错位,甚至出现意外透出。

  • mask-size: cover;mask-size: 100% 100%; 确保遮罩图完整覆盖背景图,别依赖默认值
  • 如果背景图用了 background-size: contain;,遮罩图也得同步设成 contain,否则两者缩放逻辑不同步
  • 高 DPR 屏幕下,SVG 遮罩建议用 vector-effect="non-scaling-stroke" 防止描边糊掉;位图遮罩优先用 2x 分辨率 PNG

Firefox 完全不认 mask-image?换 mask-border 或改用 clip-path 临时兜底

Firefox 目前(v120+)仍不支持 mask-image,连前缀版也无效。这不是你写错了,是浏览器就是没实现。

立即学习前端免费学习笔记(深入)”;

  • 别浪费时间调试 Firefox 下的 mask-image,它不会工作
  • 简单场景可降级用 clip-path: inset(...) 模拟线性滑动遮罩,虽然灵活性差,但兼容性好
  • 若必须用图像遮罩,考虑 js 方案:用 canvas 绘制遮罩合成,或切换为 SVG <mask></mask> + <image></image> 结构(需内联 SVG)

真正麻烦的是 mask-origin 和 mask-clip 的组合行为,不同浏览器对它们的默认值处理不一致,一动就偏移——建议所有 mask 相关属性都显式写全,别信“默认刚好”。

text=ZqhQzanResources