前段時間試譯了Keith J.Grant的CSS好書《CSS in Depth》,其中的第二章《Working with relative units》,書中對relative units的講解和舉例能夠說至關全面,看完以後發現本身並不太懂CSS相對單位,也但願分享給你們,因此有了這個譯文系列。(如有勘誤或翻譯建議,歡迎 Github PR ^_^
)css
《別說你懂CSS相對單位》系列譯文:前端
本文對應的章節目錄:git
譯者說:本節的內容比較短,可是內容相對獨立,故沒有跟其餘小節合併。
有一些屬性能夠接收不帶單位的數值(意思就是一個不帶長度單位的數字),如line-height
、z-index
和font-weight
(700等於bold,400等於normal,如此類推)。你也能夠在須要長度單位的地方(如px、em、rem)使用一個不帶單位的0
,由於長度已是0了,帶不帶單位也無所謂了 —— 0px 等於 0% 等於 0em。
github
警告不帶單位的
0
只能夠表示長度單位和百分比的值,譬如padding
、border
和width
。而對於一些特殊的狀況,如度數(degrees)或者像秒這樣基於時間的值(time-based values),是不可使用不帶單位的0
的。瀏覽器
line-height
屬性最特別的地方,在於同時支持帶單位和不帶單位的值。你應該保持使用不帶單位的數值,由於這樣就能夠從父元素繼承。咱們在頁面上寫點文字,看看它是怎麼表現的吧。把下面代碼添加到你的樣式表。less
[ 代碼片斷 2.20 繼承line-height
的模板 ]post
<body> <p class="about-us"> We have built partnerships with small farms around the world to hand-select beans at the peak of season. We then carefully roast in small batches to maximize their potential. </p> </body>
給body
聲明一個line-height
,而後文檔的其餘元素會從這裏繼承。頁面的展現符合預期,無論你對頁面的其餘元素的字號大小作了什麼改變。
ui
[ 圖 2.11 不帶單位的行高,會在每一個後代元素下從新計算出實際值 ]spa
把代碼片斷2.21的內容添加到你的樣式表。段落(<p>
)繼承了1.2的行高。由於字號是32px(2em
16px,瀏覽器默認字號大小),因此本地的行高計算值是38.4px(32px 1.2)。這會給段落的行間距留下比較合適的空間。翻譯
[ 代碼片斷 2.21 對line-height使用不帶單位的值 ]
body { line-height: 1.2; 1 } .about-us { font-size: 2em; }
若是你給行高設定了一個帶單位的值,你可能會獲得意想不到的結果,如圖2.12那樣,行間文字互相重疊了,代碼片斷2.22則是形成這個結果的CSS代碼。
[ 圖 2.12 繼承行高形成的行間互疊 ]
[ 代碼片斷 2.22 帶單位的行高值形成意外的結果 ]
body { line-height: 1.2em; 1 } .about-us { font-size: 2em; 2 }
這樣的結果源於一次奇怪的繼承:當一個元素是用帶單位的值聲明的,那麼它的後代元素會繼承計算結果值。當行高屬性是用相似em來聲明時,它的值會先被計算,而後計算後的值會傳到任何繼承它的後代元素。對於line-height
這個屬性來講,若是子元素有跟父元素不同字號大小的狀況,就會致使意想不到的結果,譬如文字間的遮擋。
長度 —— CSS中用來描述距離測量的正式用語。它是一個帶單位的數字,如5px。長度有兩種類型:絕對的和相對的。百分比跟長度很相似,但嚴格來講,百分比不能叫長度。
當你(對某個屬性)使用不帶單位的數字,聲明的值會被繼承,也就是說這個值會在子元素中用來從新計算子元素域下的值,而這個一般是你想要的效果。使用不帶單位的數字,可讓你在body上設定一個行高,而後什麼都不用管,頁面上其餘元素會默認繼承,除非在某個特定的地方你想要作一個額外的樣式。
(未完待續,還有最後一篇《CSS Variables》)
《別說你懂CSS相對單位》系列譯文:
章節:
2.1 相對單位值的魔力
2.2 em和rem
2.2.1 對font-size使用em
2.2.2 對font-size使用rem
2.3 中止使用像素思惟去思考
2.4 視口相關單位(viewport-relative units)
2.6 自定義屬性(也叫「CSS變量」)
原著版權信息:做者:Keith J.Grant
書籍:CSS in Depth
章節:Working with relative units
筆者 @Yuying Wu,前端愛好者 / 鼓勵師 / 新西蘭打工度假 / 鏟屎官。目前就任於某大型電商的B2B前端團隊。
感謝你讀到這裏,對上文如有任何疑問或建議,歡迎留言。
若是你和我同樣喜歡前端,喜歡搗騰獨立博客或者前沿技術,或者有什麼職業疑問,歡迎關注我以及各類交流哈。
獨立博客:wuyuying.com
知乎ID:@Yuying Wu
Github:Yuying Wu