用 border-image 做图案边框的关键是九宫格切图与属性协同:border-image-slice 按像素值切分 3×3 区域,必须配合 border-image-source 和非零 border-width 才生效;推荐 border-image-repeat: round,并注意素材尺寸、透明背景及导出细节对切图精度的影响。
直接用 border-image 做图案边框,关键不是“能不能”,而是“图怎么切、属性怎么配”——多数失败都卡在切图方式和 border-image-slice 的数值上。
border-image 内部按 3×3 九宫格解析图片:四个角保留、四条边重复/拉伸、中间区域丢弃。切分依据是 border-image-slice 的四个值(上右下左),单位默认为像素,且不写单位时就是像素值。
border-image-slice: 30(等价于 30 30 30 30)fill 关键字才能让中间区域显示(如 border-image-slice: 30 fill),但绝大多数图案边框不需要它只设 border-image-source 没用,浏览器会忽略;只设 border-image-slice 更没用——这两个是联动开关。还得配 border-image-repeat 控制边缘填充方式。
border-image-repeat: repeat:平铺(适合无缝纹理)border-image-repeat: round:缩放至整数倍再平铺(避免截断,推荐首选)border-image-repeat: stretch:直接拉伸(易失真,慎用)border-width,否则边框无宽度,图案不显示div.pattern-border {
border: 20px solid transparent;
border-image-source: url("frame.png");
border-image-slice: 40;
border-image-repeat: round;
border-image-width: 20px;
}
控制台没报错,但边框不出现?大概率是这三件事之一没做:
border-image-source 不受 CORS 影响,但本地 file:// 协议下会被浏览器拦截)border-width 为 0 或没设(border: none 或 border: 0 会彻底关掉边框渲染通道)border-image-slice: 60),此时整个边框退回到纯色 fallback真正难调的永远不是语法,而是那张图的像素边界在哪、有没有抗锯齿毛边、是否被 PS 导出时自动加了 1px 白边——这些细节决定了 slice 值差 1 都
