# [CSS] 常見單位 ###### tags: `CSS` * [絕對單位](#絕對單位):px、pt、pc、cm、mm、in、Q * [相對單位](#相對單位):%、em、rem、ch、ex、lh、rlh * [Viewport 單位](#Viewport-單位) * vw、vh、vmax、vmin、vi、vb * lvw、lvh、lvmax、lvmin、lvi、lvb * svw、svh、svmax、svmin、svi、svb * dvw、dvh、dvmax、dvmin、dvi、dvb * [容器查詢單位](#容器查詢單位):cqw、cqh、cqi、cqb、cqmax、cqmin * [角度單位](#角度單位):deg、turn、rad、grad * [時間單位](#時間單位):s、ms * Flex 單位:fr 分數 * Resolution 解析度單位:dpcm、dpi、dppx、x * 用在 `@media` * Safari 不支援 * Frequency 頻率單位:Hz、kHz * 2024-02-24 目前未在任何 CSS 屬性中使用,沒有瀏覽器支援此單位 ## 絕對單位 網頁排版中較常使用 px,其他絕對單位大多數用於列印 * px * 1px 是設備的一個點 * 固定值,不會因父元素或視窗的尺寸變動而改變 * pt:常見於文書處理軟體中 * pc:與印刷有關的單位 ## 相對單位 * % * 相對於父元素的值的百分比 * 將設計稿尺寸換算成 % 後,建議值的小數點可寫到後六位(五位數仍有機會跑版,六位數比較沒問題) * 使用在 `font-size`:相對於父元素的字體大小的百分比 * 使用在尺寸時,以父元素的 content-box 計算 * 若本身設定絕對定位,則以具定位設定的父元素的 padding-box 計算 ```htmlembedded <div class="parent"> <div class="child"></div> </div> ``` ```css .parent { width: 220px; height: 150px; padding: 30px; } /* 以父元素的 content-box 計算 */ .child { padding: 10%; /* 22px,父元素的 width 的 10% */ width: 50%; /* 110px,父元素的 width 的 50% */ height: 50%; /* 75px,父元素的 height 的 50% */ } ``` ```css .parent { width: 220px; height: 150px; padding: 30px; position: relative; } /* 以具定位設定的父元素的 padding-box 計算 */ .child { padding: 10%; /* 28px */ width: 50%; /* 140px */ height: 50%; /* 105px */ position: absolute; } ``` * em * 依使用情境計算基準不同 * 使用在 `font-size`:相對於父元素的字體大小做倍數計算 * 使用在其他屬性:相對於本身字體大小做倍數計算 * 由於是繼承父元素的字體大小,在多層排版上可能造成混亂 * 範例: ```htmlembedded <div class="parent"> <p class="child">text</p> </div> ``` ```css .parent { font-size: 14px; } .child { font-size: 2em; /* 28px */ height: 3em; /* 84px */ } ``` * rem * 相對於根元素 `html` 的字體大小做倍數計算 * 若未設定,預設值為 16px * ch:數字 0 的大小,會因字體不同而導致不同的寬度 * ex:英文小寫 x 的高度 * lh * 相對於本身的行高 * 應用情境 * [文字區塊的背景](https://codepen.io/yuna9068/pen/PoLrqYX):搭配 `repeating-linear-gradient` 製作斑馬紋文字、每行文字加上底線 * rlh:相對於根元素 `html` 的行高 ## Viewport 單位 * viewport:視口,視窗的可視範圍。不包含卷軸。 * 目前共有 24 種單位,依開頭英文字母可分為 Default、Large、Small、Dynamic 四大類 ### Default * vw:viewport 寬度 * 100vw 是視窗左側邊緣到視窗右側邊緣,使用時可能會因為有直向卷軸而超出可視範圍,導致出現橫向捲軸 * vh:viewport 高度 * vmax:viewport 比較長的那側(vw、vh 兩者中較大的值) * vmin:viewport 比較短的那側(vw、vh 兩者中較小的值) * vi:viewport inline size,比較偏向邏輯屬性 * 會受到 `writing-mode` 屬性影響 * 值為 `horizontal-tb`:等同 vw * 值為 `vertical-lr` 或 `vertical-rl`:等同 vh * vb:viewport block size,比較偏向邏輯屬性 * 會受到 `writing-mode` 屬性影響 * 值為 `horizontal-tb`:等同 vh * 值為 `vertical-lr` 或 `vertical-rl`:等同 vw ### Large * lvw、lvh、lvmax、lvmin、lvi、lvb * 當網址列或 tab bar 消失時的 viewport(瀏覽器 UI 最小,網站內容最大時的大小) * 本質等同 Default ### Small * svw、svh、svmax、svmin、svi、svb * 當網址列或 tab bar 出現時的 viewport(瀏覽器 UI 最大,網站內容最小時的大小) ### Dynamic * dvw、dvh、dvmax、dvmin、dvi、dvb * 動態的值,會隨著 viewport 變化而改變 * 因值會隨著滾動頁面而改變,可能會影響使用者體驗(可考慮加 `transition` 使改變過程看起來順暢一點),也影響到效能 ![Two mobile browser visualizations positioned next to each other. One has an element sized to be 100svh and the other 100lvh.](https://web.dev/static/blog/viewport-units/image/two-mobile-browser-visual-ca2bb505efaf1_1920.png "The large, small, and dynamic viewport units") ## 容器查詢單位 :::warning * [須留意瀏覽器支援度](https://caniuse.com/mdn-css_types_length_container_query_length_units) * 查詢的父層容器要加上 `container-type`、`container-name` 屬性,簡寫 `container: container-name / container-type;` ::: * cqw:查詢容器寬占比 * cqh:查詢容器高占比 * cqi:container query inline,等同 cqw * cqb:container query block,等同 cqh * cqmax:container query 較長的那側(cqi、cqb 兩者中較大的值) * cqmin:container query 較短的那側(cqi、cqb 兩者中較小的值) ## 角度單位 起始點為 12 點鐘方向 * deg 度:一圈是 `360deg`,順時針為正值,逆時針為負值 * turn 圈:一圈是 `1turn` * rad 弧度:一圈大約是 `6.28318rad`,順時針為正值,逆時針為負值 * grad 梯度:一圈是 `400grad` ## 時間單位 **數值為 0 時也要寫上單位,不可省略** * s:秒 * ms:毫秒 ## 參考資料 * [CSS values and units - CSS: Cascading Style Sheets | MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Values_and_Units) * [CSS values and units - Learn web development | MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units#what_is_a_css_value) * [CSS *vh (dvh, lvh, svh) and *vw units](https://dev.to/frehner/css-vh-dvh-lvh-svh-and-vw-units-27k4) * [The large, small, and dynamic viewport units](https://web.dev/blog/viewport-units) * [CSS Values and Units Module Level 4](https://www.w3.org/TR/css-values-4/#viewport-relative-lengths) * [李建杭(Amos),《金魚都能懂的CSS必學屬性:網頁設計必備寶典》(博碩文化,2022),頁20-25。](https://www.drmaster.com.tw/bookinfo.asp?BookID=MP22113) --- :::info 建立日期:2024-02-23 更新日期:2024-02-24 :::