【CSS Secrets】边框技巧

最近在阅读CSS Secrets这本书,发现作者讲解了很多容易被忽略的CSS小技巧,感受到作者在写代码的过程中,不仅仅只是思考如何实现各种效果,更多的会去思考和权衡代码如何写出来更优雅、更简洁,并且后期维护更方便

我在阅读的过程中,整理了这些技巧,并且按照自己的理解制作了简单的demo。

1. 半透明边框

有时候我们希望父容器的背景能够通过子容器的边框透出来,一般我们会通过设置子容器边框的透明度来实现。但事实上,父容器的背景只会延伸到子容器边框的外延,容器边框半透明只会显示当前容器的背景。


默认半透明边框

这是因为子容器background-clip属性的默认值为border-box,表示父容器的背景在子容器的边框外延被裁掉。因此设置子容器的background-clip:padding-box就能实现半透明边框。

另外扩展一下,如果background-clip的属性为content-box,那么父容器的背景就能延伸到子容器的内边距里了。

下图是background-clip的属性值不同时的表现:

background-clip

笔记
  • 直接给border的颜色hsla或者rgba实现半透明,不会将背景通过边框透出来
  • 默认情况下,背景会延伸到边框所在的区域下层
  • 利用CSS3属性background-clip:padding-box可以让背景在内边距的外延被裁掉,而不是边框。

2. 多重边框

实现多重边框的方式很多,兼容性最好的应该是利用多个容器嵌套制造视觉上的边框假象。但是Lea Verou总是强调代码DRY,多个容器嵌套会造成代码的冗余,因此她介绍了通过box-shadowoutline实现多重边框。

2.1 多重边框(box-shadow)

利用box-shadow实现边框的重点是利用了box-shadow属性中的spread,即只给第四个参数赋值。由于box-shadow支持逗号分隔,因此可以创建无限个投影边框。
由于box-shadow会相互叠加,因此每一层投影的spread都应该比前一层更大才能实现多重投影。
此外,box-shadow不会影响布局,因此如果使用该属性产生边框的话,应该提前预留其所占据的空间。

下面是利用box-shadow实现的简单案例和关键代码:


多重边框box-shadow.png
笔记
  • 扩张半径(第四个参数)指定边框宽度,偏移量和模糊值为0
  • 可创建任意数量的投影
  • 每一层的投影相互叠加
  • 不影响布局和鼠标事件
  • 利用inset关键字和元素的内边距可以让投影出现的元素内圈
  • 不能实现虚线边框
  • 代码书写重点:box-shadow: 0 0 0 10px red,0 0 0 15px yellow

2.2 多重边框(outline)

outline的兼容性相对于box-shadow要好一点,不过其最多只能实现两重边框,而且不支持圆角。

下面是利用outline实现的简单案例和关键代码:


多重边框outline.png
笔记
  • 可以实现带虚线的边框
  • 最多只能定义两重边框
  • 不能贴合border-radius产生的圆角

3.边框内圆角

理想实现效果是:容器边框的内侧是圆角,外侧依旧保持直角。

主要有两种方案来实现这个效果,方案一是利用两个容器,子容器拥有圆角,父容器稍大于子容器且为直角。方案二是结合box-shadowoutline实现。

3.1 边框内圆角(2 divs)

这种方案不做过多的阐述,直接上图和关键代码:


内圆角2div.png

3.2 边框内圆角(1 divs)

由于outline不会填补圆角而box-shadow会,因此利用outline实现边框,而boxshadow来填补outline和容器之间的圆角空隙。

内圆角1div.png

笔记
  • 结合box-shadow和outline
  • outline不会填补元素的圆角,而box-shadow会
  • box-shadow阴影的扩张值计算公式:0.414 * r < x ≤ w (其中x:阴影的扩张值;r:圆角半径;w:outline宽度)
  • 设置技巧:x=w,box-shadow的color与outline的color值一致

结语

Lea Verou介绍的这几种关于border的设置技巧,让作为网页重构菜鸟的我受益匪浅。这些属性其实是最常见的,平时工作中或多或少都会用到,但是利用它们的特征去巧妙地实现一些看似不相关的视觉效果却是我们很少想到的。也许在工作中,有些方法并不能满足我们向下兼容各种低级浏览器的需求,但是技术一直在更新,有时候需要在保证可读性的前提下,适当摒弃低级浏览器的视觉效果。即使不能放弃低级浏览器,Lea Verou也推荐了一些解决兼容性的方法。

附上文中整理出来的简单demo的地址:http://www.qdfuns.com/notes/41216/d247b7c530352ed22245aacabbc18a5f.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,050评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,538评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,673评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,622评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,047评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,974评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,129评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,893评论 0 209
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,654评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,828评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,297评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,619评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,326评论 3 243
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,176评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,975评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,118评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,909评论 2 278

推荐阅读更多精彩内容

  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,691评论 0 2
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,279评论 0 11
  • 所有图都在body背景设置为green下的截图,请不要把最外层的绿色当成边框 半透明边框 如果我们想给一个容器设置...
    hcxowe阅读 3,740评论 0 6
  • 我还记得国外某位大牛在一篇文章中写道,CSS is fine, it's just really hard。读完他...
    garble阅读 1,053评论 0 0
  • 1.多重边框 我们可以通过使用border-image来写一个多重边框,或使用多个元素来模拟多重边框,不过我们有更...
    FlyingWWS阅读 2,386评论 2 5