CSS中的border-image-slice属性详解
字数 2377 2025-12-10 04:02:33

CSS中的border-image-slice属性详解


1. 描述

border-image-slice属性是CSS中用于控制“边框图片”如何被切割和映射到元素边框的关键属性。它通常与border-image-sourceborder-image-widthborder-image-outsetborder-image-repeat属性一起,构成完整的CSS边框图片(Border Image)功能。这个属性决定了如何将一张图片分割成9个区域,并指定哪些部分用于填充边框的边、角以及中间内容区域。

核心概念:想象你把一张图片覆盖在元素边框区域上。border-image-slice的作用是定义从图片的四个边向内“切割”的偏移量,将图片切成9块(就像九宫格),然后这9块分别对应到元素边框的4个角、4条边以及中间区域。


2. 属性和值

border-image-slice的语法如下:

border-image-slice: [<number> | <percentage>]{1,4} fill?
  • <number>:无单位数字,表示在图片上的偏移量(基于图片的坐标单位,例如位图像素)。例如,30表示从图片边缘向内偏移30个像素(或点)的位置进行切割。
  • <percentage>:百分比,相对于图片的尺寸。例如,25%表示从边缘向内偏移图片宽度(水平边)或高度(垂直边)的25%。
  • {1,4}:可以设置1到4个值,遵循CSS的“上右下左”顺序规则(类似marginpadding)。
    • 1个值:四个方向使用同一个值。
    • 2个值:第一个值用于上下,第二个值用于左右。
    • 3个值:第一个值用于上,第二个值用于左右,第三个值用于下。
    • 4个值:按上、右、下、左的顺序分别设置。
  • fill:可选关键字。如果加上fill,图片的第9块(中间区域)也会被保留并填充到元素的内容区域(背景之上)。默认情况下,中间区域是丢弃的。

注意

  • 数字值带单位,但它不是长度,而是基于图片自身的坐标。在矢量图(如SVG)中,它参考用户坐标。
  • 切割线之间的区域就是最终的“切片”。

3. 切割原理(九宫格)

假设你有一张图片,你通过border-image-slice指定了四个切割值(例如30):

  1. 从图片的上边缘向下30像素画一条水平切割线。
  2. 右边缘向左30像素画一条垂直切割线。
  3. 下边缘向上30像素画一条水平切割线。
  4. 左边缘向右30像素画一条垂直切割线。

这4条线将图片分割为9个区域:

  • 区域1、3、7、9:四个角(左上、右上、左下、右下)。
  • 区域2、4、6、8:四个边(上、右、下、左)。
  • 区域5:中间。

在默认情况下(无fill):

  • 四个角(1,3,7,9)被直接放置到元素边框的四个角,不会拉伸或重复
  • 四个边(2,4,6,8)根据border-image-repeat属性(默认为stretch)进行拉伸或重复,以填充边框的边。
  • 中间区域(5)被丢弃。

如果加上fill,中间区域会像背景一样填充元素的内容框(在背景之上,内容之下)。


4. 示例和步骤

步骤1:准备图片和元素
假设有一张 90px × 90px 的PNG图片(border.png),它被设计成一个圆角矩形边框,中心是透明的。我们将其应用到一个div上。

div {
  width: 200px;
  height: 150px;
  border: 30px solid transparent; /* 为边框图片预留空间 */
  border-image-source: url('border.png');
  border-image-width: 30px; /* 边框图片显示的宽度 */
  border-image-outset: 0;   /* 图片向外扩展,这里为0 */
  border-image-repeat: stretch; /* 边的图片如何适应 */
}

步骤2:应用border-image-slice
我们希望从图片的每个边缘向内切割30像素(因为图片正好是90×90,30像素刚好是三分之一)。

div {
  border-image-slice: 30;
}

由于图片尺寸是90×90,30等价于33.333%(30/90)。此时:

  • 四个角(30×30像素的小方块)对应边框的四个角。
  • 四个边(上、下边的30×30区域,左、右边的30×30区域)会被拉伸以填满边框的边。

步骤3:观察效果

  • 如果border-image-repeat: stretch;(默认),边区域会被拉伸,可能导致圆角变形。
  • 可以改为border-image-repeat: round;repeat,让边区域平铺。

步骤4:使用fill
如果希望中间区域也显示(比如图片中间有花纹),可以:

div {
  border-image-slice: 30 fill;
}

此时中间区域会填充内容区。注意,如果图片中间是透明的,则会显示元素背景色。


5. 百分比和数字混合使用

你可以为每个方向指定不同的切割值:

border-image-slice: 20% 15 10% 5%;

意思是:上边缘向内20%,右边缘向内15(像素),下边缘向内10%,左边缘向内5%。


6. 注意事项

  • border-image-width的关系border-image-slice控制图片如何切割border-image-width控制切割后的切片在元素边框上显示的宽度。两者可以不同,切片会被缩放以适应border-image-width设置的边框宽度。
  • 透明边框:为了让边框图片显示,通常需要设置border-style: solidborder-color: transparent,或者直接设置border: 30px solid transparent,为图片预留空间。
  • 矢量图:对于SVG,数字值参考SVG的坐标系统。
  • 缩写border-image缩写属性可以一次性设置sourceslicewidthoutsetrepeat。例如:
    border-image: url('border.png') 30 / 30px / 0 stretch;
    
    其中30就是slice

7. 常见应用场景

  • 创建可变宽高的圆角边框,不受传统border-radius限制。
  • 游戏UI、按钮、对话框等需要复杂边框样式的界面。
  • 将一张大图分割,高效用于不同尺寸的元素。

掌握border-image-slice的关键是理解“九宫格切割”和“边角映射”的原理,它让边框设计从单一颜色/样式解放出来,进入可任意图形的丰富世界。

CSS中的border-image-slice属性详解 1. 描述 border-image-slice 属性是CSS中用于控制“边框图片”如何被切割和映射到元素边框的关键属性。它通常与 border-image-source 、 border-image-width 、 border-image-outset 和 border-image-repeat 属性一起,构成完整的CSS边框图片(Border Image)功能。这个属性决定了如何将一张图片分割成9个区域,并指定哪些部分用于填充边框的边、角以及中间内容区域。 核心概念 :想象你把一张图片覆盖在元素边框区域上。 border-image-slice 的作用是定义从图片的四个边向内“切割”的偏移量,将图片切成9块(就像九宫格),然后这9块分别对应到元素边框的4个角、4条边以及中间区域。 2. 属性和值 border-image-slice 的语法如下: \<number\> :无单位数字,表示在图片上的偏移量(基于图片的坐标单位,例如位图像素)。例如, 30 表示从图片边缘向内偏移30个像素(或点)的位置进行切割。 \<percentage\> :百分比,相对于图片的尺寸。例如, 25% 表示从边缘向内偏移图片宽度(水平边)或高度(垂直边)的25%。 {1,4} :可以设置1到4个值,遵循CSS的“上右下左”顺序规则(类似 margin 和 padding )。 1个值:四个方向使用同一个值。 2个值:第一个值用于上下,第二个值用于左右。 3个值:第一个值用于上,第二个值用于左右,第三个值用于下。 4个值:按上、右、下、左的顺序分别设置。 fill :可选关键字。如果加上 fill ,图片的第9块(中间区域)也会被保留并填充到元素的内容区域(背景之上)。默认情况下,中间区域是丢弃的。 注意 : 数字值 不 带单位,但它不是长度,而是基于图片自身的坐标。在矢量图(如SVG)中,它参考用户坐标。 切割线之间的区域就是最终的“切片”。 3. 切割原理(九宫格) 假设你有一张图片,你通过 border-image-slice 指定了四个切割值(例如 30 ): 从图片的 上边缘 向下30像素画一条水平切割线。 从 右边缘 向左30像素画一条垂直切割线。 从 下边缘 向上30像素画一条水平切割线。 从 左边缘 向右30像素画一条垂直切割线。 这4条线将图片分割为9个区域: 区域1、3、7、9:四个角(左上、右上、左下、右下)。 区域2、4、6、8:四个边(上、右、下、左)。 区域5:中间。 在默认情况下(无 fill ): 四个角(1,3,7,9)被直接放置到元素边框的四个角, 不会拉伸或重复 。 四个边(2,4,6,8)根据 border-image-repeat 属性(默认为 stretch )进行拉伸或重复,以填充边框的边。 中间区域(5)被丢弃。 如果加上 fill ,中间区域会像背景一样填充元素的内容框(在背景之上,内容之下)。 4. 示例和步骤 步骤1:准备图片和元素 假设有一张 90px × 90px 的PNG图片( border.png ),它被设计成一个圆角矩形边框,中心是透明的。我们将其应用到一个 div 上。 步骤2:应用border-image-slice 我们希望从图片的每个边缘向内切割30像素(因为图片正好是90×90,30像素刚好是三分之一)。 由于图片尺寸是90×90, 30 等价于 33.333% (30/90)。此时: 四个角(30×30像素的小方块)对应边框的四个角。 四个边(上、下边的30×30区域,左、右边的30×30区域)会被拉伸以填满边框的边。 步骤3:观察效果 如果 border-image-repeat: stretch; (默认),边区域会被拉伸,可能导致圆角变形。 可以改为 border-image-repeat: round; 或 repeat ,让边区域平铺。 步骤4:使用fill 如果希望中间区域也显示(比如图片中间有花纹),可以: 此时中间区域会填充内容区。注意,如果图片中间是透明的,则会显示元素背景色。 5. 百分比和数字混合使用 你可以为每个方向指定不同的切割值: 意思是:上边缘向内20%,右边缘向内15(像素),下边缘向内10%,左边缘向内5%。 6. 注意事项 与 border-image-width 的关系 : border-image-slice 控制 图片如何切割 , border-image-width 控制 切割后的切片在元素边框上显示的宽度 。两者可以不同,切片会被缩放以适应 border-image-width 设置的边框宽度。 透明边框 :为了让边框图片显示,通常需要设置 border-style: solid 和 border-color: transparent ,或者直接设置 border: 30px solid transparent ,为图片预留空间。 矢量图 :对于SVG,数字值参考SVG的坐标系统。 缩写 : border-image 缩写属性可以一次性设置 source 、 slice 、 width 、 outset 和 repeat 。例如: 其中 30 就是 slice 。 7. 常见应用场景 创建可变宽高的圆角边框,不受传统 border-radius 限制。 游戏UI、按钮、对话框等需要复杂边框样式的界面。 将一张大图分割,高效用于不同尺寸的元素。 掌握 border-image-slice 的关键是理解“九宫格切割”和“边角映射”的原理,它让边框设计从单一颜色/样式解放出来,进入可任意图形的丰富世界。