CSS中实现双重/多重边框的方式

by 毛三十 2018-08-07

简述

目前最优雅地实现多重边框的方案是利用 CSS3 的box-shadow属性,但如果要兼容老的浏览器,则需要选择其它的方案。本文简要地列举了几种多重边框的实现方案,大家可以根据项目实际及兼容性要求等情况,选择最适合的实现方案。

  1. 利用描边(outline)属性
  2. 利用额外的DIV嵌套
  3. 利用伪元素
  4. 利用border-image属性
  5. 利用box-shadow属性

利用描边outline属性

利用描边outline属性结合border属性实现双重边框。实现方式简单,兼容性好,能兼容除IE6,7以外的多数浏览器。

.borders {
  border: solid 6px #fff;
  outline: solid 6px #888;  
}
  • 只能实现双重边框
  • 边框样式灵活,可以实现虚线等样式的边框
  • 描边在盒模型之外,会与外部元素发生重叠

查看演示代码

利用额外的DIV嵌套

利用额外的DIV嵌套的方式实现多重边框。这也是唯一不存在兼容性问题的方案。

.outer {
    border: solid 6px #888;
    background: #fff;
}
.inner {
    background: #222;
    margin: 6px;
}
  • 兼容性好
  • 可以实现多重边框,虚线边框等样式
  • 需要额外的DIV元素,增加了代码复杂性

查看演示代码

利用伪元素

利用伪元素:before的方式实现双重边框。实现代码略复杂,属于hack的实现方式,不推荐。

.borders {
    border: solid 6px #fff;
    position: relative;
}
.borders:before {
    content: "";
    position: absolute;
    top: -12px; left: -12px; 
    right: -12px; bottom: -12px;
    border: solid 6px #888;
}
  • IE6,7,8 不兼容
  • :after也可以
  • 结合:before:after可以实现三重边框

查看演示代码

利用border-image属性

利用 CSS3 的border-image属性实现多重边框。实现方法简单,但额外需要一张边框图片,且兼容性较差。

.borders {
    border: solid 12px transparent;
    border-image: url('bs.jpg') 12 12 12 12 repeat;
}

利用border-image-slice将边框图片分割成9个区域,其中四个角(1,2,3,4),四条边(5,6,7,8)以及中间区域(9)。repeat表示四条边都在相应的边框上重复地平铺。

查看演示代码

利用box-shadow属性

利用box-shadow属性是最简单,最直接地实现多重边框的方式。一行代码就可以实现多重边框效果。利用box-shadow实现边框多少有一些hack的味道。

.borders {
    box-shadow: 0 0 0 6px #fff, 0 0 0 12px #888;
}

为了用阴影模拟边框,本例中使用了两个阴影效果,设置偏移值和模糊值为0,并适当地设置阴影的尺寸,从而实现了双重边框的效果。因为一个阴影重叠在另一个阴影之上,第二个阴影的尺寸要设置成第一个阴影尺寸的两倍。关键部分是将模糊值设成0,从而产生像边框一样的纯色阴影,看起来和边框一样。

box-shadow属性可能会和周边元素发生重叠,因此要适当地设置元素的外边距。兼容性一般。

查看演示代码

结语

本文简述了5种双重/多重边框的实现方式,各有其优缺点,大家可以根据项目实际要求进行选择。

文中所述部分文字及代码汇编于网络。因时间不足,能力有限等原因,存在文字阐述不准及代码测试不足等诸多问题。

参考文献

  1. MDN border-image
  2. MDN box-shadow
  3. Multiple Borders with CSS
  4. CSS-tricks Multiple Borders
by 毛三十
2 赞 125 阅