box-shadow方案
前置知识:
box-shadow
接受 x偏移量 | y偏移量 | 阴影模糊半径 | 阴影扩散半径 | 阴影颜色
这五个参数。- 如果使用
box-shadow
简写属性:
- 参数为两个数字:x偏移量、y偏移量
- 参数为三个数字:第三个数字被解释为模糊半径
<blur-radius>
的大小。 - 参数为四个数字:第四个数字被解释为扩展半径
<spread-radius>
的大小 。
方案:
- 如果
box-shadow
的模糊半径和两个偏移量都为0,而扩展半径为10px,那么展示效果同一个10px的实心边框。 - 并且与
border
不同的是,box-sizing
支持以逗号分隔的任意数量的投影,我们可以借助这个特性创建多个边框。
box-shadow: 0 0 0 10px green,0 0 0 20px yellow;
- 从示例也可以看出,虽然两层投影一个宽度写的是10px,一个写的是20px,但是投影是一样大的,这是因为
box-shadow
是层层叠加的,第一层投影位于最顶层。
局限:
- 用
box-shadow
模拟外边框,只适用于实线边框的情况,遇到虚线边框就无法模拟了。
注意点:
- 投影不会影响布局,它不会撑大一个元素占用的空间(见下图
margin:0;padding:0;
),所以需要手动使用外边距or内边距(如果是inset的话)来调整距离。
- 如果需要通过
box-shadow
创造出来的边框,跟元素本身响应相同的事件,那么需要使用inset属性模拟box-sizing: border-box;
,将边框放置在元素的内部。并且此时也需要增加额外的内边距来腾出足够的空隙。
outline方案
前置知识:
outline
是outline-style
, outline-width
和outline-color
三个属性的缩写,outline-style
的取值与border-style
的取值基本相同。outline-offset
可以用来控制outline与元素边缘之间的间距,这个属性同样接受负值。
方案:
- 当只需要双层描边的时候,可以使用border做第一层描边,然后用outline做第二层描边。
.outline {
outline: dashed 10px #786;
outline-offset: 0;
border: 10px dashed yellow;
width: 500px;
height: 200px;
background: rgb(190, 106, 106);
background-clip: border-box;
}
局限:
- 只能用于双层描边的情况,不适用于多层描边。
- 边框不贴合圆角(下图)(这种行为日后可能会被修复)。