CSS 專家密技/CSS Protips 01-06

GitHub CSS 專家密技 / CSS Protips 第 01-06 項的筆記

Jane Lin
JL's note
7 min readFeb 28, 2019

--

Photo by Lee Campbell on Unsplash

02/26 跟了 Amos 的直播,看完之後收穫很多。除了學到新的技巧,也釐清一些觀念,所以趕快記錄下來。以下有原文的部分內容、Amos 的說明跟補充,也加入我的想法和整理。

▎01. 使用 CSS Reset

因為各家瀏覽器的內部設定不同(比如:內距、行高),CSS Reset 可以幫你在不同的瀏覽器上維持一致的樣式風格。你可以使用 CSS Reset 套件:

  • Reset.css:有部分的人覺得這個套件矯枉過正,比如 head, blod 的粗體都拿掉。
  • Normalize.css:有需要格式一樣的才一樣,不需要的就不去 reset。

或使用更簡潔的 CSS Reset 方法:

*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}

[ 返回目錄 ]

▎02. 繼承 box-sizing

這裡原文說的是讓 box-sizing 屬性自動從 html 元素繼承下來 :

html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}

不過 Amos 在這部分的補充讓我了解 box-sizing: border-box 原來是這麼一回事!

我原本以為 padding (內距) 跟 margin (外距) 是距離,而 border (邊框) 是框線,充其量屬最裡面的 content (內容) 算是一個實體的 box。但看了 Amos 的說明之後才知道原來 box model 真的是 box model (不然還有假的嗎?)。

這麼說好了,可以想像 div 是俄羅斯娃娃,由多個大小不一的 box 層疊而成。由內而外為:content box → padding box → border box → margin box

Box model

舉例:

  1. 指定一個 div 的 width: 300px,這時候 border-box 跟 content-box 寬度都是 300px。
  2. 加上 padding: 100px 之後,會把 border 向外撐開,所以:
  • border-box 總寬度是 500px (左內距 100px + 內容寬度 300px + 右內距 100px)。
  • content-box 總寬度仍然是 300px

3. 如果我們要讓 div 最寬只有 300px,同時又有內距 100px,通常會加上box-sizing: border-box 。這時候:

  • border-box 總寬度是 300px。因為你讓 box-sizing 等於 border-box 了。
  • content-box 總寬度內縮成 100px。要讓 div 總寬度是 300px ,又希望邊框和內容之間有 100px 的距離,那就只能縮裡面的 content-box 了。

之前使用 box-sizing: border-box 的時候不會聯想到 box model,現在總算將這個 border-box 跟 box model 聯想在一起了。

[ 返回目錄 ]

▎03. 使用 unset 而不是重置所有屬性

當重置元素的屬性時,並不需要重置元素中每個屬性:

button {
background: none;
border: none;
color: inherit;
font: inherit;
outline: none;
padding: 0;
}

你可以用 all 來代表元素中所有的樣式屬性。 將該值設定為 unset 意味著將元素中所有樣式屬性回復到預設值:

button {
all: unset;
}

注意: 目前 all 屬性在 IE11 並不支援,而目前 Edge 瀏覽器則正在考慮支援。IE11 不支援 unset 用法!

[ 返回目錄 ]

▎04. 使用 :not() 選擇器決定表單是否顯示邊框

假設你用以下樣式先替元素新增邊框

/* 新增邊框 */
.nav li {
border-right: 1px solid #666;
}

然後在最後一個元素去除邊框

/* 去掉邊框 */
.nav li:last-child {
border-right: none;
}

不過你可以改用 :not() 偽類別 (pseudo-class) 來做到完全相同的效果:

.nav li:not(:last-child) {
border-right: 1px solid #666;
}

[ 返回目錄 ]

▎05. 將 line-height 加入到 body 元素

你不必為分別為每一個 <p><h*> 元素加入 line-height 樣式,相反的,你應該直接新增到 body 元素,所有的文字元素預設就會繼承 body 的樣式。

body {
line-height: 1.5;
}

[ 返回目錄 ]

▎06. 為表單元素設置 focus

給予使用者回饋,讓使用者可以距焦、確定所在位置。

a:focus,
button:focus,
input:focus,
select:focus,
textarea:focus {
box-shadow: none;
outline: #000 dotted 2px;
outline-offset: .05em;
}

▎可以玩表單的延伸效果

有些表單的一端會有個放大鏡圖示,但表單寬度為 0px。當使用者把滑鼠移到放大鏡圖示時,表單會增加寬度,製造出表單從放大鏡圖示延伸出來的效果。像是 這支影片

滑鼠移入前
滑鼠移入後

▎focus 也可以用在超連結中

考量到 CSS 的優先權 (寫在下面的 > 寫在上面的),以及為了讓使用者有良好體驗,在超連結中要注意擺放順序,由上而下依序為:

a:link {}
a:visited {}
a:focus {}
a:hover {}
a:active {}
  • 有沒有加 :link 的差別:
    有加的話,只針對超連結去作用;沒有加的話,會連錨點一起作用。所以有加 :link 會是比較標準的做法。

[ 返回目錄 ]

▎後記

本次筆記分享到這邊,剩下的就跟著 Amos 的進度走囉,新的內容會另外開新的文章。另外,雖然知道用 GitHub gist 嵌入程式碼有 highlight 看起來比較舒適,不過程式碼太多段,就懶得用了~

CSS 專家密技系列

如果想看更多文章,點擊以下連結可以看到我的文章清單:
* 所有文章清單
如果您喜歡這篇文章,或覺得這篇文章有幫到您,想給我一些支持,可以這麼做:
1. 登入 Liker 點擊下方 LikeButton 免費按讚(按5下),或直接打賞 LikeCoin
2. 透過街口支付請我喝杯咖啡!
3. 拍拍手(1~50下) 給我一些鼓勵。
點擊 LikeButton 可幫助作者得到回饋
透過街口支付小額支持作者

--

--

Jane Lin
JL's note

迷上網頁與程式,學到新東西都會開心好一陣子,想著要怎麼拿去改以前寫過的 code 。