CSS 父子元素 border-radius 继承之背景空隙处理

老牛浏览 1527评论 0发表于

1. 问题说明

比如我们要实现一个圆角边框的卡片,很容易想到下面的代码实现:

html

html
<div class="card">
    <div class="card-header">header</div>
    <div class="card-body">body</div>
</div>

css

css
.card {
    width: 200px;
    height: 100px;
    background-color: #000;
    border: 1px solid #d9d9d9;
    border-radius: 10px;
}

.card-header {
    height: 40px;
    background-color: #fafafa;
    border-top-left-radius: inherit;
    border-top-right-radius: inherit;
}

.card-body {
    height: calc(100% - 40px);
    background-color: #fff;
    border-bottom-left-radius: inherit;
    border-bottom-right-radius: inherit;
}

效果如下:

86b96324-4896-4a73-8150-2dac962de991

我们发现子元素圆角边框外还能看见父元素的黑色背景,也就是当父元素设置边框后,子元素继承 border-radius 会留下空隙。产生该问题的原因是父子元素 border-radius 半径不一样,差一个边框的宽度。

2. 解决方案

以下总结了两种解决方案:

  1. 子元素不设置 border-radius,为父元素设置 overflow: hidden

  2. 修正子元素 border-radius,将子元素 border-radius 设置为父元素 border-radius 减去父元素边框宽度。

2.1 设置 overflow: hidden

css

css
.card {
    width: 200px;
    height: 100px;
    background-color: #000;
    border: 1px solid #d9d9d9;
    border-radius: 10px;
    overflow: hidden;
}

.card-header {
    height: 40px;
    background-color: #fafafa;
}

.card-body {
    height: calc(100% - 40px);
    background-color: #fff;
}

效果如下:

461558ff-73a7-4a71-90ba-1204a56c45bf

该方案的缺点是:由于设置了 overflow,超出父元素的部分会被隐藏,像使用 box-shadow 为父元素添加阴影时会不显示(可以通过添加合适的 margin 解决)。

2.2 修正子元素 border-radius

css

css
.card {
    width: 200px;
    height: 100px;
    background-color: #000;
    border: 1px solid #d9d9d9;
    border-radius: 10px;
}

.card-header {
    height: 40px;
    background-color: #fafafa;
    border-top-left-radius: 9px;
    border-top-right-radius: 9px;
}

.card-body {
    height: calc(100% - 40px);
    background-color: #fff;
    border-bottom-left-radius: 9px;
    border-bottom-right-radius: 9px;
}

效果如下:

020c2a29-b50f-4587-80d6-45c26eb5d2b3

推荐使用该方案。

3. 总结

很多 UI 框架在处理类似问题时都是简单的将父子元素设置相同的 border-radius,当背景不明显时可能注意不到,但是放大后仔细观察就会发现存在空隙。

点赞
收藏
暂无评论,快来发表评论吧~
私信
老牛@ilaoniu
老牛,俗称哞哞。单纯的九零后理工小青年。喜欢折腾,爱玩,爱音乐,爱游戏,爱电影,爱旅游...
最后活跃于