tags: CSS、CSS Units、px、%、em、rem
CSS Units - px、%、em、rem
Absolute Units vs. Relative Units
Absolute Units 絕對單位
- 不受父元素或視窗大小影響,在任何裝置和瀏覽器,始終保持相同尺寸
 - 如果不是做響應式網站/專案或 window 始終是固定尺寸,沒縮放需求,可以考慮使用
 - 常見的單位為: 
px、pt、cm、in等 
網頁開發最常用絕對單位為
px,剩下的比較常用於印刷排版領域,所以在開發時會比較少見
Relative Units 相對單位
- 相對於父元素或視窗大小進行縮放(取決於使用的單位)
 - 適合開發響應式網站
 - 常見的單位為: 
%、em、rem、vw、vh等 
常見單位介紹
px
- 絕對單位
 - 尺寸在不同裝置要都顯示一樣,可以直接使用
 
/* 手機或電腦上預覽,字體大小都會是一樣(16px) */
.text {
  font-size: 16px;
}
%
- 相對單位:相對於父元素的大小
 - 常用於調整 container 內的子元素大小或位置
 
/* 子元素寬度永遠是父元素的 30%,父層寬度只要一改變,子元素寬度也會一起更新 */
.child {
  width: 30%;
}
em
- 相對單位:視使用的情境,會有不同計算方式
font-size: 相對於元素的父元素的字體大小
i.e. 子元素的font-size: 0.5em,該子元素字體大小即為父元素的 0.5 倍other properties(非字型大小的屬性):相對於元素的當前字體大小
i.e. 元素的字體大小為16px,則width: 2em將等於32px(元素未設定字體大小,則繼承父元素的字體大小)
 - 方面實現元素內部組件之間的比例關係
i.e. 想基於父元素字體大小,客製內部大/中/小相對字體 
html {
  font-size: 16px;
}
.grandparent {
  font-size: 24px;
}
.parent {
  font-size: 20px;
}
.child {
  /* child 實際字體大小: 20px * 1.5 = 30px */
  font-size: 1.5em;
  /* child 內距(非字型大小的屬性,與本身的 font-size 相關): 30px * 2 = 60px */
  padding: 2em;
}
如果父元素未指定字型大小的值,則會在 DOM tree 向上尋找。如果一直到根元素(<html>)都沒有指定字型大小,則瀏覽器將使用預設值 16px。
html {
  font-size: 16px;
}
.grandparent {
  font-size: 24px;
}
/* .parent {
  font-size: 20px;
} */
.child {
  /* child 實際字體大小(往外找到 .grandparent): 24 * 1.5 = 36px */
  font-size: 1.5em;
  /* child 內距: 36px * 2 = 72px */
  padding: 2em;
}
rem (root em)
這邊基本關係就是: root = 根元素 =
<html>,<html>未設定則瀏覽器將使用預設值16px。
- 相對單位:相對於根元素的字型大小,根元素的字型大小為 
1rem - 不受父元素的字體大小影響,解決 
em缺點
i.e. 當標題設定為font-size: 2rem,使用在畫面任何一地方,標題大小都會相同 
vw
- 相對單位:相對於 viewport 的高度,
1vw= viewport 高度的 1/100 - 元素如果需要針對 viewport/window 大小、位置有特殊需求可使用
 
vh
- 相對單位:相對於 viewport 的寬度,
1vh= viewport 寬度的 1/100 - 元素如果需要針對 viewport/window 大小、位置有特殊需求可使用
i.e. 畫面如果要撐滿整個視窗,高度可設置 100vh 
em 和 rem 如何選擇
如果沒有特殊需求要使用絕對單位 i.e. px,大部分會選擇相對單位開發響應式頁面,即可以隨著頁面大小自適應。
大多數瀏覽器 1rem 和 1em 都等於 16px (root element),但因為 em 會自動繼承其父元素字體大小,如果 DOM 層級過深,很容易會發生預期以外的效果,所以通常網頁開發會優先選擇 rem,來保持一致性和可預測性,如 tailwindcss 用 rem 來制定寬度標準。
除非是在需要只考慮附近父元素字體大小,才會選擇 em,否則一率優先考慮 rem,總歸一句,先釐清設計需求,再進一步選擇需要的單位。
em
.parent {
  font-size: 10px;
}
.child {
  font-size: 2em;
}
<div class="parent">
  第一層 - 10px
  <div class="child">
    第二層 - 20px
    <div class="child">
      第三層 - 40px
      <div class="child">
        第四層 - 80px
      </div>
    </div>
  </div>
</div>
  第一層 - 10px
  
  第二層 - 20px
    
   第三層 - 40px
      
  
         第四層 - 80px
      
    rem
html {
  font-size: 16px;
}
.parent {
  font-size: 10px;
}
.child {
  font-size: 2rem;
}
<div class="parent">
  第一層 - 10px
  <div class="child">
    第二層 - 16px
    <div class="child">
      第三層 - 16px
      <div class="child">
        第四層 - 16px
      </div>
    </div>
  </div>
</div>
  第一層 - 10px
  
   第二層 - 16px
    
     第三層 - 16px
      
  
       第四層 - 16px
      
     CSSCSS Units
 Published on 06 Jun 2023
 Updated on 06 Jun 2023