当CSS3推出border-radius
属性时咱们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,而后又发现border-top-left/right-radius的水平半径之和大于元素宽度时,实际值会按比例分配元素宽度时,不由会问"我真的懂border吗?"。本系列将稍微深刻探讨一下那个貌似没什么好玩的border!
《CSS魔法堂:重拾Border之——解构Border》
《CSS魔法堂:重拾Border之——图片做边框》
《CSS魔法堂:重拾Border之——不只仅是圆角》
《CSS魔法堂:重拾Border之——更广阔的遐想》css
border-image
<style type="text/css"> div { border: double orange 1em; border-image: url("border.png") 27 round stretch; } </style> <div>........</div>
起初浏览一遍border-image的用法时,总觉得就是border变粗了,而后以图片做为Line Pattern,接着是各类平铺方式就完事了。后来细读W3C Spec,发现我仍是2 young 2 simply了,简称太2了。
要理解好border-image,那么先要理解它由那几类对象组成,对象间的关系和组合规则。html
用过PS或Flash的同窗应该都清楚图层的概念吧,反正我是如今才理解图层的:(
目标元素和贴图区分别位于两个图层,而且贴图区所在的图层位于目标元素所在的图层之上,而素材图片经切割后将在贴图区图层上做后期处理,最后做图层合成处理。
重申3点css3
在理解border-image的组成和总体处理流程后,咱们先经过属性来认识与图片和贴图区密切相关的知识——图片切割/切片和贴图区切割/切片flex
border-image-source
border-image-source:url("image url")
border-image-slice
border-image-source
引入的图片资源,以九宫格的形式做切片border-image-slice: [<percentage> | <number>]{1,4} fill?
border-width
一致(top,right,bottom,left),而其含义为距离图片各边(top/right/bottom/left)多远的位置上,画一条与对应边相互平衡的切割线。注意:切割线必须位于图片所在面积内<percentage>
:以图片的尺寸(宽、高)做为参考系,设置距离各边的距离。默认值为100%<number>
:设置距离各边的绝对距离,单位固定为pxfill
:设置是否将九宫格里正中间的切片,应用到贴图区中。默认值为禁用,即默认状况下九宫格中仅有8块切片会应用到贴图区中。注意
当水平方向(left/right)的切片重叠时,会致使top、middle和bottom切片的尺寸为0;
当垂直方向(top/bottom)的切片重叠时,会致使left、middle和right切片的尺寸为0;
所以默认状况下border-image-slice: 100%
,因此top/right/bottom/left/middle的切片尺寸均为0,而4个角top-left/right和bottom-left/right切片的尺寸为整张图片,所以最后结果仅看到边框4个角有图片,而4边却没有显示。flexbox
示意图:
4条灰色线表示切割线,它们和图片的4条边框一块儿把图片划分为九宫格,获得如下9幅切片。
url
相对目标元素和素材图片而言,贴图区因为没法直接观察,致使比较难理解。spa
默认状况下贴图区与目标元素彻底重叠;code
贴图区一样被划分红9块区域,分别对应素材图片的9块切片。默认状况下贴图区中除middle区域外,其余区域的尺寸与目标元素的border box一致。
htm
经过border-image-width
可修改各区域的尺寸;对象
经过border-image-outset
可修改贴图区的尺寸。
border-image-outset: 12px;
属性border-image-width
做用:以九宫格的形式对贴图区进行切片
语法:border-image-width: [<length> | <percentage> | <number> | auto]{1,4}
属性值的顺序和简写时语法扩展的规则与属性border-image-slice
一致(top,right,bottom,left),而其含义为距离贴图区各边(top/right/bottom/left)多远的位置上,画一条与对应边相互平衡的切割线。注意:切割线必须位于贴图区所在面积内
<length>
:设置距离各边的绝对距离,负数无效。
<percentage>
:以贴图区的尺寸(宽、高)为参考系,设置距离各边的距离
<number>
:以对应的border-width为参考系,设置距离各边的距离。默认值为1
auto
:设置为与素材图片中对应的切片一致
注意:若贴图区水平方向(left/right)或垂直方向(top/bottom)的区域发生重叠,则会对其进行缩放直到不发生重叠为止。计算缩放因子的公式f = min(width/(left + right), height/(top + bottom))
,而后left/right/top/bottom4个区域则按缩放因子进行缩放操做。
属性border-image-outset
做用:扩大贴图区所占的面积。
语法:border-image-ouset: [<length> | <number>]{1,4}
属性值的顺序和简写时语法扩展的规则与属性border-image-width
一致(top,right,bottom,left),而其含义为将贴图区各边(top/right/bottom/left)向外扩展多大距离。
<length>
:设置距离各边的绝对距离,负数无效。
<number>
:以对应的border-width为参考系,设置距离各边的距离。默认值为0
注意
经过border-image-outset
扩大贴图区的面积时,若border-image-width
采用
border-image-width
采用其余做属性值时,只会看到图片边框向外移动而已。
通过上述两步"图片切片"和"贴图区切片"后,是时候将二者糅合在一块儿了。具体逻辑以下:
border-image-repeat
属性值对切片尺寸进行调整。border-image-repeat
属性值为repeat时,切片位于对应贴图区域的中央位置,不然则紧贴对应贴图区域的左边框。border-image-repeat
属性值对切片进行复制、拉伸等平铺操做,而后将贴图区与目标元素所在的图层进行合成便可!合成过程当中有两点是相当重要的:
border-image-repeat
相关。border-image-repeat
语法:border-image-repeat: [stretch | repeat | round | space]{1,2}
第一个属性值为水平方向的平铺方式,第二个属性值为垂直方向的平铺方式。
stretch:拉伸图片切片,默认值。
repeat:复制平铺图片切片(不保证每幅图片切片副本刚好能完整显示)。
round:根据贴图区域尺寸调整图片切片尺寸,而后复制平铺图片切片,从而保证每幅图片切片副本刚好能完整显示。
space:复制平铺图片切片,并经过调整图片切片副本间的空白,从而保证每幅图片切片副本刚好能完整显示。(效果和flexbox中content-align设置为space-round差很少)
素材图片原尺寸:
最终效果:
你们能够看到最终效果里面4个角落的切片均缩小了,而left和right则是拉伸,top和bottom则是复制平铺。
粤语的"一铺搞定"其实就是一次完成所有工做的意思,上面关于border-image的属性,要是每次都逐个设置那要敲多少次键盘啊。。。其实咱们能够经过border-image
属性一次搞定。
语法:border-image: <‘border-image-source’> || <‘border-image-slice’> [ / <‘border-image-width’> | / <‘border-image-width’>? / <‘border-image-outset’> ]? || <‘border-image-repeat’>
粤语的"一铺清袋"其实就是把以前的成果一次性归零。当咱们辛辛苦苦设置好border-image后,一个不当心又设置了border属性,那么以前关于border-image的设置将所有失效。所以先设置border属性,而后再设置border-image最为稳妥。
总算折腾出来了,累啊!!!起初觉得花2个晚上就能理解好并记录下来,谁知道理解就花了2晚,而后各类试验。。。看来仍是过高估了本身了:(不过无论如何,弄明白后仍是以为很爽的哦!
尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/5449717.html_肥仔John
CSS Backgrounds and Borders Module Level 3 4. Borders 《图解CSS3核心技术与案例实战》——第3章 CSS3边框