前言

 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-top-left/right-radius的水平半径之和大于元素宽度时,实际值会按比例分配元素宽度时,不禁会问"我真的懂border吗?"。本系列将稍微深入探讨一下那个貌似没什么好玩的border!
《CSS魔法堂:重拾Border之——解构Border》
《CSS魔法堂:重拾Border之——图片作边框》
《CSS魔法堂:重拾Border之——不仅仅是圆角》
《CSS魔法堂:重拾Border之——更广阔的遐想》

解构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,那么先要理解它由那几类对象组成,对象间的关系和组合规则。

3个和尚有水喝

  1. 目标元素本身(即上面的div元素)
  2. 用作边框素材的图片(即上面的border.png)
  3. 贴图区(Border Image Area)

引入图层概念

 用过PS或Flash的同学应该都清楚图层的概念吧,反正我是现在才理解图层的:(
目标元素和贴图区分别位于两个图层,并且贴图区所在的图层位于目标元素所在的图层之上,而素材图片经切割后将在贴图区图层上作后期处理,最后作图层合成处理。
重申3点

  1. 目标元素和素材的图片分别在各自独立的图层上绘制;
  2. 图片会经过切割后,按规则在所属图层上的贴图区内作定位和平铺处理;
  3. 图片所属图层在目标元素所在图层之上。

透过属性看本质

 在理解border-image的组成和整体处理流程后,我们先通过属性来认识与图片和贴图区密切相关的知识——图片切割/切片贴图区切割/切片

图片切割/切片

  1. 属性border-image-source
    作用:引入用作边框素材的图片资源
    语法:border-image-source:url("image url")
    url入参为图片路径,可以是HTTP或HTTPS Scheme URI下的绝对或相对路径,或采用Data Scheme URI。
  2. 属性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>:设置距离各边的绝对距离,单位固定为px
    fill:设置是否将九宫格里正中间的切片,应用到贴图区中。默认值为禁用,即默认情况下九宫格中仅有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边却没有显示。

示意图:

4条灰色线表示切割线,它们和图片的4条边框一起把图片划分为九宫格,得到以下9幅切片。

贴图区(Border Image Area)切割/切片

 相对目标元素和素材图片而言,贴图区由于无法直接观察,导致比较难理解。

  1. 默认情况下贴图区与目标元素完全重叠;
  2. 贴图区同样被划分成9块区域,分别对应素材图片的9块切片。默认情况下贴图区中除middle区域外,其他区域的尺寸与目标元素的border box一致。
  3. 通过border-image-width可修改各区域的尺寸;
  4. 通过border-image-outset可修改贴图区的尺寸。

    border-image-outset: 12px;

  5. 属性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个区域则按缩放因子进行缩放操作。
  6. 属性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采用作属性值,则同时扩大除middle区域外其他区域的尺寸;当border-image-width采用其他作属性值时,只会看到图片边框向外移动而已。

合成的法则

 经过上述两步"图片切片"和"贴图区切片"后,是时候将两者糅合在一起了。具体逻辑如下:

  1. 初次调整图片切片尺寸
    1.1. 将素材图片各切片移至贴图区中对应的区域;
    1.2. top/bottom图片切片的高度缩放至于对应的贴图区域的高度一致,并以相同的缩放比来调整图片切片的宽度;
    1.3. left/right图片切片的宽度缩放至于对应的贴图区域的宽度一致,并以相同的缩放比来调整图片切片的高度;
    1.4. top-left/right和bottom-left/right图片切片的宽度和高度则各自缩放至于对应的贴图区域一致即可
  2. 深度调整图片切片尺寸
    2.1. 根据border-image-repeat属性值对切片尺寸进行调整。
  3. 定位切片
    3.1. 当border-image-repeat属性值为repeat时,切片位于对应贴图区域的中央位置,否则则紧贴对应贴图区域的左边框。
  4. 3秒の合体:),即根据border-image-repeat属性值对切片进行复制、拉伸等平铺操作,然后将贴图区与目标元素所在的图层进行合成即可!

 合成过程中有两点是至关重要的:

  1. "初次调整图片切片尺寸"是基础,而且要注意的是,是以相同的缩放比来调整图片,而不是直接让图片切片的尺寸与对应的贴图区域尺寸一致;
  2. "深度调整图片切片尺寸"、"定位切片"和平铺方式均与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边框

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!

分类: CSS
好文要顶 关注我 收藏该文

^_^肥仔John
关注 - 85
粉丝 - 707

+加关注

2
0

« 上一篇:CSS魔法堂:重拾Border之——解构Border
» 下一篇:CSS魔法堂:重拾Border之——不仅仅是圆角

posted @ 2016-05-03 08:55 ^_^肥仔John 阅读(2084) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。
【推荐】超50万VC++源码: 大型工控、组态\仿真、建模CAD源码2018!
【推荐】加入腾讯云自媒体扶持计划,免费领取域名&服务器
最新IT新闻:
· 兴趣降温 安卓厂商无意模仿iPhone X推出3D识别
· 乐视云更名新乐视云联:仍未获云服务牌照
· 微软搜索引擎Bing改进航班 电影和比赛结果查询
· 彭博商业周刊:硅谷悄然掀起中国技术人员回国潮
· 英特尔宣布为2018平昌冬奥会提供VR赛事直播技术
» 更多新闻...
最新知识库文章:

· 步入云计算
· 以操作系统的角度述说线程与进程
· 软件测试转型之路
· 门内门外看招聘
· 大道至简,职场上做人做事做管理

» 更多知识库文章...

公告

肥仔John@github
作品:
iScheme—Scheme解释器
本文转自

^_^肥仔John博客园博客,原文链接:http://www.cnblogs.com/fsjohnhuang/p/5449717.html,如需转载请自行联系原作者

CSS魔法堂:重拾Border之——图片作边框相关推荐

  1. CSS魔法堂:重拾Border之——更广阔的遐想

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  2. css直角线_CSS魔法堂:重拾Border之——不仅仅是圆角

    前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-to ...

  3. CSS魔法堂:说说Float那个被埋没的志向

    前言  定位系统中第一难理解就是Normal flow,而第二就非Float莫属了,而Float难理解的原因有俩,1. 一开头我们就用错了:2. 它跟Normal flow靠得太近了.本文尝试理清Fl ...

  4. CSS魔法堂:深入理解line-height和vertical-align

    前言 一直听说line-height是指两行文本的基线间的距离,然后又说行高等于行距,最近还听说有个叫行间距的家伙,@张鑫旭还说line-height和vertical-align基情四射,贵圈真乱啊 ...

  5. CSS魔法堂:你一定误解过的Normal flow

    前言  刚接触CSS时经常听到看到一个词"文档流",那到底什么是"文档流"呢?然后会看到"绝对定位和浮动定位能脱离文档流",从这句可以看到文 ...

  6. CSS魔法堂:重新认识Box Model、IFC、BFC和Collapsing margins

    前言   盒子模型作为CSS基础中的基础,曾一度以为掌握了IE和W3C标准下的块级盒子模型即可,但近日在学习行级盒子模型时发现原来当初是如此幼稚可笑.本文尝试全面叙述块级.行级盒子模型的特性.作为近日 ...

  7. CSS魔法堂:那个被我们忽略的outline

    前言  在CSS魔法堂:改变单选框颜色就这么吹毛求疵!中我们要模拟原生单选框通过Tab键获得焦点的效果,这里涉及到一个常常被忽略的属性--outline,由于之前对其印象确实有些模糊,于是本文打算对其 ...

  8. CSS魔法堂:那个被我们忽略的outline 1

    前言  在CSS魔法堂:改变单选框颜色就这么吹毛求疵!中我们要模拟原生单选框通过Tab键获得焦点的效果,这里涉及到一个常常被忽略的属性--outline,由于之前对其印象确实有些模糊,于是本文打算对其 ...

  9. CSS魔法堂:更丰富的前端动效by CSS Animation

    前言  在<CSS魔法堂:Transition就这么好玩>中我们了解到对于简单的补间动画,我们可以通过transition实现.那到底多简单的动画适合用transtion来实现呢?答案就是 ...

最新文章

  1. mysql转换double_MySQL 字符串转in/double类型——CAST/CONVERT函数的用法
  2. lnmp一键包的thinkphp5 nginx配置分享
  3. iOS: 转载CoreData数据库框架
  4. SQL 性能优化梳理 —— 基本概念、创建时优化、查询时优化
  5. 插件properties_Mybatis3系列 - 4. mybatis-config的properties属性详解
  6. InnoDB原理篇:为什么使用索引会变快?
  7. static and const
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的保险销售管理系统
  9. WPF: 本地化(Localization) 实现
  10. SM2算法+开发中注意事项
  11. iOS开发-沙盒(sandbox)机制
  12. 中国科学院院士徐宗本:人工智能的基石是数学
  13. 从键盘输入一个年份和月份,输出该月有多少天(考虑闰年, 闰年的条件是:(1)能被4整除,并且不能被100整除;(2)能被400整除)。
  14. 福禄克9100校准仪维修案例
  15. jsp文件的上传与下载
  16. java设置ContentType,设置下载文件名称
  17. CAD C#二次开发自动注册代码片段
  18. 如何隐藏一个盘让其他人搜索不到
  19. 深度残差网络原理理解
  20. Unity3D鼠标&Touch拖拽控制节点绕任意轴旋转的实现

热门文章

  1. NLP中的词向量及其应用
  2. 如何成为一名优秀CTO
  3. 干货丨综述卷积神经网络:从基础技术到研究前景
  4. 资讯丨NVIDIA自造AI超级计算机:轻松进入世界前五
  5. 万字深度好文!视觉-语言(VL)智能:任务、表征学习和大型模型
  6. 212页PPT详解MEMS微传感器的工作原理(深入全面!)
  7. 深度学习与工业互联网安全:应用与挑战
  8. 图神经网络的表达能力,究竟有多强大?
  9. 全球首个AI宇宙模拟器不仅有6亿光年宽度,还“自行”跑出了暗物质
  10. Nature展示迄今为止最详细的“人脑零部件清单”