iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 6
0
Modern Web

CSS Secrets 導讀系列 第 6

Secret 4: 內部圓角

有時我們會需要讓邊界裡面是圓角,但是外面還是維持直角。

https://ithelp.ithome.com.tw/upload/images/20181021/20091606N2h4LLMbsV.png

最直覺的做法是用二個 <div> 一個做內框一個做外框,外框的背景顏色是邊界的顏色。

<div class="container">
    <div>
        I'm putting myself to the fullest possible use, which is all I think that any conscious entity can ever hope to do.
    </div>
</div>
.container {
    background: black;
    padding: .8em;
}

.container > div {
    background: coral;
    border-radius: .8em;
    padding: 1em;
}

不過這樣做要用到二個元素,違反了 HTML 的語意原則。那有沒有只用一個元素的方法呢?

有的,但是這個技巧有其限制,下面要介紹的方法只能限制邊界是單一的顏色,如果邊界要有花紋的話只能使用前面展示的方法。


還記得之前的文章提過的「多重邊界」技巧嗎?用box-shadowoutline偽裝成border。在這裡我們重施故技,再加上運用「outline不受border-radius影響,但是box-shadow會」的特性。

圖片示範比較清楚:

這個是圓角元素的 outline
https://ithelp.ithome.com.tw/upload/images/20181021/20091606FJuEf1lGWh.png

這個是圓角元素的 box-shadow
https://ithelp.ithome.com.tw/upload/images/20181021/20091606FvtPtdRM9I.png

發現差別了嗎?outline內外八個角仍然維持直角,不會受元素border-radius的影響。

當 outline 和 box-shadow 顏色都是一樣的時候,重疊在一起看起來就像一個邊界。

所以我們唯一的挑戰就是要填滿內角的四個空隙,這張圖box-shadow用檸檬綠替換,大家看得比較清楚。
https://ithelp.ithome.com.tw/upload/images/20181021/20091606dutMOv9dwC.png

那麼最少要多大的 spread 值才能填滿這個空隙呢?這個時候就要把小時候的數學拿出來用了!

https://ithelp.ithome.com.tw/upload/images/20181021/20091606zSYXFDMsyN.jpg

以範例中border-radius: .8em,代入公式再進位到小數點以下二位可得到 .34em 的 spread 值,懶得計算的話記得取border-radius的一半為 spread 值就夠了。

此時細心一點的人應該會發現,今天教的偽裝邊界手法,有一個限制就是outline值不能比box-shadow spread 值小,如果邊界很細的話就遮不住box-shadow的圓角,只能使用第一種方法了。

最後要注意的是,這個方法運用了「outline不受border-radius影響」的特性,但不能保證 CSS WG 將來不會變更這個設定。

CodePen


上一篇
Secret 3: 靈活的背景定位
下一篇
Secret 5: 條紋背景
系列文
CSS Secrets 導讀30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言