border-image属性分析

border-image是CSS3的一个属性,由于比较复杂,总是处于一知半解的状态,今天下定决心,花时间整理了一下,供大家共勉和学习。

border-image的用处

没用border-image之前,觉得css的属性基本够用,border-image完全是将简单的工作复杂化,当学习完该属性以后,发现该属性的运用能够大大节省编码时间和效率,总结一下,大致适用于以下两个场景:

1.元素边框不规则的情况。这时候,就需要用设计图作为边框背景,border-image与background-image相比,好处是更具灵活性,可以用代码控制边框背景的拉伸和重复,因而能够创造出更多样的效果

2.按钮宽高不确定的情况。用border-image来制作按钮,可以用同一张背景图,制造出各种宽高的按钮。

border-image属性分析

border-image-source

边框背景图片。格式为:url(“…”)。

border-image-slice

图片边框向内偏移的距离。格式:border-image-slice:top right bottom left。分别指切割背景图片的四条线距离上右下左的距离。 如下图所示: 

01

该距离接受数值,百分数。默认数值的单位是px,但是不能在数值后面加px,否则这句css将不被浏览器解析。 
用法和margin,padding类似。这里以数值举例,百分数同理。

border-image-slice: 10;   /*距离上下左右均为10px;*/
border-image-slice: 10 30;   /*距离上下10px,左右30px;*/
border-image-slice: 10 30 20;   /*距离上10px,下20px,左右30px;*/
border-image-slice: 10 30 20 40;   /*距离上10px,右30px,下20px,左40px;*/

四条线将背景图分割成了9个部分,其中1,2,3,4,6,7,8,9这八个区域将会被切割,作为图片边框,如果除了设置数值或者百分数,还加了一个“fill”,那么区域5就会作为背景填充进元素content,如:

border-image-slice: 25 11 fill;

注意:slice不接受负值;如果slice切割的左右距离之和大于背景图的宽,则上下边框不显示。如果slice切割的上下距离之和大于背景图的高,则左右边框不显示。

border-image-width

图片边框的宽度。只接受数值,且不能加单位。

border-image-repeat

图像边框是否应平铺(repeat)、铺满(rounded)或拉伸(stretch)。而无论怎样铺,四个角,即区域1,3,7,9是不会重复铺,只会被相应拉伸。下面以最为经典的图为例吧:

原图如下:

02

stretch(默认值)

.box{
            width: 50px;
            height: 50px;
            border: 40px solid transparent;
            border-image-source: url("img/border.png");
            border-image-slice: 27 fill;
            border-image-repeat: stretch;
    }
<div class="box"></div>

效果如图:

03

可以看到每个区域都被横向和纵向拉伸了

repeat

.box{
            width: 100px;
            height: 100px;
            border: 40px solid transparent;
            border-image-source: url("img/border.png");
            border-image-slice: 27 fill;
            border-image-repeat: repeat;
    }
<div class="box"></div>

效果如图: 

04

可以看到背景在以原形状等比例缩放以后,持续平铺,容易出现断层。

round

.box{
            width: 100px;
            height: 100px;
            border: 40px solid transparent;
            border-image-source: url("img/border.png");
            border-image-slice: 27 fill;
            border-image-repeat: round;
    }
<div class="box"></div>

效果如图: 

05

同样是重复平铺,但是round会处理得更平滑,不会出现断层情况,因此round通常比repeat更常用。

border-image-outset

边框图像区域超出边框的量。格式:border-image-outset : length | number。length是数值加单位“px”,number指的是相对于边框宽度增加的倍数。下面举例来说明:

length

box{
            width: 50px;
            height: 50px;
            border: 27px solid transparent;
            border-image-source: url("img/border.png");
            border-image-outset: 10px;
            border-image-slice: 27 fill;
            border-image-repeat: round;
    }
<div class="box"></div>

效果如图: 

06

其中青绿色的区域是扩展出来的内容宽度10px

number

body{
        padding: 60px;
    }
box{
            width: 50px;
            height: 50px;
            border: 27px solid transparent;
            border-image-source: url("img/border.png");
            border-image-outset: 1;
            border-image-slice: 27 fill;
            border-image-repeat: round;
    }
<div class="box"></div>

效果如图: 

07

border的宽度是27px,设置超出1倍,就是超出27px,即图中青绿色区域。大家可以试试不加body的padding属性,会发现div显示不完整。所以,想要扩展div的大小直接设置width和height就好了,用boder-image-outset有点鸡肋。

不得不说的border-image坑

新版Chrome浏览器border-image属性不生效

    在stack overflow找到答案,说是在用border-image属性之前加上该属性即可:border:27px solid transparent;后看到国内某博主说只要设置成border: 27px soild就行。后经尝试,确实如此 。

复合属性需要添加浏览器前缀,单个属性不需添加前缀

    当使用复合属性时,需要添加前缀,像这样:

border-image: url("img/border.png") fill 10;    /*IE11*/
-webkit-border-image: url("img/border.png") 10;    /*Chrome和Safari*/
-moz-border-image: url("img/border.png") fill 10;    /*Firefox*/
-o-border-image: url("img/border.png") 10;    /*Opera*/

注意:IE和火狐都添加了fill,否则背景不会自动填充到元素的content。一旦使用了单个属性,那么就不能添加前缀,否则不生效。

按钮示例

背景图片如下: 

08

先来一个短一点的按钮。

.box{
            width: 100px;
            height: 30px;
            border: 14px solid transparent;
            border-image-source: url("img/btn.png");
            border-image-slice: 14 fill;
       }
<div class="box"></div>

效果如图:

09

现在仅仅修改“width:200px”,结果按钮的长度就自动增加了,是不是很方便?


(1)