没有“通用锯齿边框”CSS属性,所有方案均为视觉模拟;clip-path需严格对称闭合坐标,mask-image兼容性最佳但需配mask-position,伪元素易脱标,Canvas适合动态高精度场景。
没有“通用锯齿边框”CSS属性,所有方案都是视觉模拟——选错方法会导致布局错乱、响应失效或高维护成本。
用 clip-path: polygon() 拼锯齿圆,本质是手动列出一圈顶点坐标。常见错误是:坐标点数为奇数、首尾不闭合、百分比超出 0–100% 范围,导致图形塌陷或显示为空。
60% 5% → 70% 0%),中间那个“尖角”靠第三个点撑开5% 改成 10%)会导致上下不对称,应同步调整对称位置的值clip-path 的 polygon() 百分比解析偶有偏差,建议加 transform: scale(0.999) 触发重绘规避给元素底部加锯齿边框,mask-image 是目前兼容性与可控性平衡最好的方式。它不侵占布局流,也不依赖伪元素定位,且支持缩放和动画。
repeating-linear-gradient(-45deg, transparent 0 10px, black 10px 20px) 的角度和断点必须严格匹配 mask-size;若把 20px 20px 改成 30px 30px 却没调渐变断点,锯齿会拉长变形-45deg 得到右下斜齿,45deg 得到左下斜齿,0deg 则是水平齿(但易显生硬)mask-image,Edge 16–18 需加 -webkit- 前缀;如需兼容旧浏览器,得 fallback 到 ::after 伪元素方案mask-position: 0 100%,漏写这句就会满屏锯齿用两个伪元素分别画上、下锯齿,适合需要独立配色或 hover 动画的场景,但极易因 position: absolute 脱离文档流而引发父容器高度塌陷。
立即学习“前端免费学习笔记(深入)”;
position: relative,否则伪元素会相对于 body 定位height: 12px)和背景渐变的 background-size 必须严格对应,否则会出现齿距错位或空白缺口background-repeat: repeat-x 若未配合 background-position 对齐起点,首尾会露白缝will-change: transform 或临时套一层 transform: translateZ(0) 强制 GPU 加速当锯齿需随数据变化(如进度条齿数实时增减)、或要求像素级对齐(如打印导出),CSS 方案会力不从心,此时 Canvas 是唯一可靠选择。
strokeRect() 直接描边,它画不出齿——得用 beginPath() + lineTo() 手动连点,或用 arc() 在角上画半圆齿arc(x, 5, 5, ...) 表示顶部小圆齿,arc(x, height-5, 5, ...) 才是底部齿window.resize 并重新调用 canvas.width = canvas.offsetWidth 和重绘,否则锯齿会糊或错位真正难的不是画出锯齿,而是判断它该出现在哪一层:是作为装饰边框(用 mask-image),还是结构化组件的一部分(用 clip-path),又或者承载交互逻辑(用 canvas)。选错层级,后面全是补丁。