搜尋

CSS 邏輯屬性 ( logical properties )

CSS 邏輯屬性 ( logical properties ) 提供了一種更具「語義化」和「自適應性」的方式來設定元素樣式,特別是針對不同書寫方向的語言環境( 左到右、右到左 )的語言環境中,可以很輕鬆的讓排版方向保持一致,大幅簡化開發流程並提高可維護性,這篇教學會介紹 CSS 的邏輯屬性。

快速導覽:

CSS 教學 - CSS 邏輯屬性 ( logical properties )

認識 CSS 邏輯屬性 ( logical properties )

在進行排版時,通常會使用 CSS 的物理屬性 ( Physical Properties ) 來設定元素的寬高或位置樣式,例如 widthheighttopleft 等,這些樣式屬性是基於「頁面物理方向」,因此如果切換不同方向的語系 ( 左到右變成右到左 ),在對齊或排版上就必須重新調整,造成維護與管理上的不方便,下方列出兩種模式的差異與說明:

特性 物理屬性 邏輯屬性
定義方式 基於「頁面方向」定義元素的樣式 基於「書寫方向」定義元素的樣式
適用場景 簡單佈局,單一語言網站 多語言網站,雙向文字網站,更彈性的佈局需求
方向依賴性 高度依賴頁面方向,在不同語言環境中樣式可能會發生變化 較少依賴頁面方向,在不同語言環境中樣式保持一致
程式碼複雜度 可能需要為不同方向撰寫不同的 CSS 規則 通常只需要一套 CSS 規則就可通用於所有方向
代表樣式 widthheighttopleftrightbottommargin-leftmargin-right,padding-leftpadding-right block-sizeinline-sizemargin-inline-startmargin-inline-endpadding-inline-startpadding-inline-end

下方範例中第一組 div 使用物理屬性的方式設定邊框,因為指定了「left」方向的邊框,不論文字方向如何設定,都只有左邊的邊框會改變粗細,但第二組 div 使用邏輯屬性裡的「start」方向進行設定,所以變粗的邊框一定是「流向開始」的位置

線上展示:https://codepen.io/oxxo/pen/RNbYwdb

<!-- HTML 程式碼-->
<div class="no_logical">
  <h3 class="a">水平左到右</h3>
  <h3 class="b">水平右到左</h3>
  <h3 class="c">垂直左到右</h3>
  <h3 class="d">垂直右到左</h3>
</div>
<div class="logical">
  <h3 class="a">水平左到右</h3>
  <h3 class="b">水平右到左</h3>
  <h3 class="c">垂直左到右</h3>
  <h3 class="d">垂直右到左</h3>
</div>

<!-- CSS 程式碼 -->
<style>
  div {
    float: left;
    margin: 20px;
  }
  h3 {
    width: 150px;
    height: 100px;
    border: 1px solid #000;
    margin: 10px;
    box-sizing: border-box;
  }
  .no_logical h3 {border-left-width: 10px;}      /* 左邊邊框變粗 */
  .logical h3 {border-inline-start-width: 10px;} /* 左右的開始處邊框變粗 */
  .b {direction: rtl;}
  .c {writing-mode: vertical-lr;}
  .d {writing-mode: vertical-rl;}
</style>

CSS 教學 - CSS 邏輯屬性 ( logical properties ) - 邏輯屬性與物理屬性的差異

邏輯寬高 block-size、inline-size

通常在設定元素尺寸時,會透過寬度 width 和高度 height 來處理,但如果語言從水平流量變成垂直流向,對於文字來說,寬度就會變成高度,而高度就會變成寬度,這時就必須進行額外的判斷處理,然而透過 block-sizeinline-size 邏輯屬性,就能在轉換方向時,一併轉換寬高的方向,下方列出這兩個樣式屬性的說明:

樣式屬性 屬性值 說明
inline-size auto ( 預設 )、長度單位數值 文字流向的「寬度」。
block-size auto ( 預設 )、長度單位數值 文字流向的「高度」。

下方的範例中橘色的元素是設定 widthheightdiv,藍色的元素是設定 inline-sizeblock-sizediv,可以看見在水平文字流向時沒有太大差異,但文字變成垂直流向時,設定 inline-sizeblock-sizediv 就會根據文字流向自動變換方向。

線上展示:https://codepen.io/oxxo/pen/NPKLWJb

<!-- HTML 程式碼-->
<div class="a">STEAM 教育學習網讓所有人都能輕鬆跨入 STEAM 的學習領域。</div>
<div class="b">STEAM 教育學習網讓所有人都能輕鬆跨入 STEAM 的學習領域。</div>
<div class="a size">STEAM 教育學習網讓所有人都能輕鬆跨入 STEAM 的學習領域。</div>
<div class="b size">STEAM 教育學習網讓所有人都能輕鬆跨入 STEAM 的學習領域。</div>


<!-- CSS 程式碼 -->
<style>
  div {
    width: 200px;
    height: 80px;
    border: 1px solid #000;
    margin: 10px;
    background: #f90;
    float: left;
  }
  .size {
    background: #0cf;
    inline-size: 200px;   /* 邏輯寬度 */
    block-size: 80px;     /* 邏輯高度 */
  }
  .b {writing-mode: vertical-rl;}   /* 文字垂直 */
</style>

CSS 教學 - CSS 邏輯屬性 ( logical properties ) - 邏輯寬高 block-size、inline-size

開始與結束 start、end

除了寬度和高度,元素許多樣式屬性也都有「方向性」,例如邊框 border、內邊距 padding、外邊界 margin 等,為了因應這些具有方向性的樣式屬性,CSS 提供了 *-start*-end 結尾結尾的樣式屬性,分別代表指定樣式位於「文字流向的開始處或結尾處」。

開始與結束邏輯 說明 水平左到右 水平右到左 垂直
*-start 文字開始方向 左方 右方 上方
*-end 文字結尾方向 右方 左方 下方

CSS 邏輯屬性列表

如果將 *-start*-endblock-sizeinline-size 搭配組合,就成為 CSS 所提供的邏輯屬性,下方列出這些邏輯屬性:

邊框 border 邏輯屬性

下方列出 border 相關邏輯屬性,設定的屬性值與 border 完全相同,參考「邊框 border」。

樣式屬性 說明
border-inline 同時設定 border-inline-startborder-inline-end
border-inline-start 邏輯左右開始方向的邊框樣式。
border-inline-start-color 邏輯左右開始方向的邊框顏色。
border-inline-start-style 邏輯左右開始方向的邊框風格。
border-inline-start-width 邏輯左右開始方向的邊框寬度。
border-inline-end 邏輯左右結束方向的邊框樣式。
border-inline-end-color 邏輯左右結束方向的邊框顏色。
border-inline-end-style 邏輯左右結束方向的邊框風格。
border-inline-end-width 邏輯左右結束方向的邊框寬度。
border-inline-color 邏輯左右的邊框顏色。
border-inline-style 邏輯左右邊框的風格。
border-inline-width 邏輯左右邊框的寬度。
border-block 同時設定 border-block-start 和 `border-block-end。
border-block-start 邏輯上方的邊框樣式。
border-block-start-color 邏輯上方的邊框顏色。
border-block-start-style 邏輯上方的邊框風格。
border-block-start-width 邏輯上方的邊框寬度。
border-block-end 邏輯下方的邊框樣式。
border-block-end-color 邏輯下方的邊框顏色。
border-block-end-style 邏輯下方的邊框風格。
border-block-end-width 邏輯下方的邊框寬度。
border-block-color 邏輯上下的邊框顏色。
border-block-style 邏輯上下的邊框風格。
border-block-width 邏輯上下的邊框寬度。
border-start-end-radius 邏輯左下邊框圓角 ( 水平左往右 )。
border-start-start-radius 邏輯左上邊框圓角 ( 水平左往右 )。
border-end-start-radius 邏輯右上邊框圓角 ( 水平左往右 )。
border-end-end-radius 邏輯右下邊框圓角 ( 水平左往右 )。

下方範例會使用 border 相關邏輯屬性,展示水平與垂直轉換後「物理屬性」和「邏輯屬性」差異。

線上展示:https://codepen.io/oxxo/pen/ZYzMEPv

<!-- HTML 程式碼-->
<div class="a">oxxo</div>
<div class="b rl">oxxo</div>
<div class="c">oxxo</div>
<div class="d rl">oxxo</div>
<div class="a-size">oxxo</div>
<div class="b-size rl">oxxo</div>
<div class="c-size">oxxo</div>
<div class="d-size rl">oxxo</div>

<!-- CSS 程式碼 -->
<style>
  div {
    width: 100px;
    height: 100px;
    border: 1px solid #000;
    margin: 10px;
    background: #f90;
    box-sizing: border-box;
    float: left;
  }
  .rl {writing-mode: vertical-rl;}
  .a, .b {border-left: 20px solid #000;}  /* 普通物理屬性寫法 */
  .c, .d {border-top-left-radius: 50px;}  /* 普通物理屬性寫法 */
  .rl {writing-mode: vertical-rl;}        /* 有這個類型的會轉成垂直書寫 */
  .a-size, .b-size {
    background: #0cf;
    border-inline-start: 20px solid #000; /* 邏輯屬性寫法 */
  }
  .c-size, .d-size {
    background: #0cf;
    border-start-start-radius: 50px;      /* 邏輯屬性寫法 */
  }
</style>

CSS 教學 - CSS 邏輯屬性 ( logical properties ) - 邊框 border 邏輯屬性

外邊界 margin 邏輯屬性

下方列出 margin 相關邏輯屬性,設定的屬性值與 margin 完全相同,參考「外邊界 margin」。

樣式屬性 說明
margin-inline 同時設定邏輯左右的外邊界。
margin-inline-start 邏輯左右開始方向的外邊界。
margin-inline-end 邏輯左右結束方向的外邊界。
margin-block 同時設定邏輯上下的外邊界。
margin-block-start 邏輯上方的外邊界。
margin-block-end 邏輯下方的外邊界。

下方範例會使用 margin 相關邏輯屬性,展示水平與垂直轉換後「物理屬性」和「邏輯屬性」差異。

線上展示:https://codepen.io/oxxo/pen/xbKaxBy

<!-- HTML 程式碼-->
<div><div class="a">oxxo</div></div>
<div><div class="b rl">oxxo</div></div>
<div><div class="a-size">oxxo</div></div>
<div><div class="b-size rl">oxxo</div></div>


<!-- CSS 程式碼 -->
<style>
  div:not([class]){
    width: 200px;
    height: 200px;
    border: 1px solid #000;
    float: left;
    margin: 10px;
  }
  div div {
    width: 100px;
    height: 100px;
    border: 1px solid #000;
    background: #f90;
    box-sizing: border-box;
  }
  .a, .b {
    margin-left: 20px;
    margin-top: 50px;
  }
  .rl {
    writing-mode: vertical-rl;  /* 有這個類型的會轉成垂直書寫 */
  }
  .a-size, .b-size {
    background: #0cf;
    margin-inline-start: 20px;  /* 邏輯屬性寫法 */
    margin-block-start: 50px;   /* 邏輯屬性寫法 */
  }
</style>

CSS 教學 - CSS 邏輯屬性 ( logical properties ) - 外邊界 margin 邏輯屬性

內邊距 padding 邏輯屬性

下方列出 padding 相關邏輯屬性,設定的屬性值與 padding 完全相同,參考「內邊距 padding」。

樣式屬性 說明
padding-inline 同時設定邏輯左右的內邊距。
padding-inline-start 邏輯左右開始方向的內邊距。
padding-inline-end 邏輯左右結束方向的內邊距。
padding-block 同時設定邏輯上下的內邊距。
padding-block-start 邏輯上方的內邊距。
padding-block-end 邏輯下方的內邊距。

下方範例會使用 padding 相關邏輯屬性,展示水平與垂直轉換後「物理屬性」和「邏輯屬性」差異。

線上展示:https://codepen.io/oxxo/pen/VYZGwRO

<!-- HTML 程式碼-->
<div class="a"><div>oxxo</div></div>
<div class="b rl"><div>oxxo</div></div>
<div class="a-size"><div>oxxo</div></div>
<div class="b-size rl"><div>oxxo</div></div>

<!-- CSS 程式碼 -->
<style>
  div[class]{
    width: 200px;
    height: 200px;
    border: 1px solid #000;
    float: left;
    margin: 10px;
    box-sizing: border-box;
  }
  div div {
    width: 100px;
    height: 100px;
    border: 1px solid #000;
    background: #f90;
  }
  .a, .b {
    padding-left: 20px;
    padding-top: 50px;
  }
  .rl {writing-mode: vertical-lr;}
  .a-size, .b-size {
    padding-inline-start: 20px;  /* 邏輯屬性寫法 */
    padding-block-start: 50px;   /* 邏輯屬性寫法 */
  }
  .a-size div, .b-size div{background: #0cf;}
</style>

CSS 教學 - CSS 邏輯屬性 ( logical properties ) - 內邊距 padding 邏輯屬性

內嵌寬度 inset 邏輯屬性

下方列出 inset 相關邏輯屬性,設定的屬性值與 inset 完全相同,參考「內嵌寬度」。

樣式屬性 說明
inset-inline 內嵌寬度邏輯左右偏移。
inset-inline-start 內嵌寬度邏輯左右開始方向偏移。
inset-inline-end 內嵌寬度邏輯左右結束方向偏移。
inset-block 內嵌寬度邏輯上下偏移。
inset-block-start 內嵌寬度邏輯上方偏移。
inset-block-end 內嵌寬度邏輯下方偏移。

下方範例會使用 inset 相關邏輯屬性,展示水平與垂直轉換後「物理屬性」和「邏輯屬性」差異。

線上展示:https://codepen.io/oxxo/pen/ByBOaEK

<!-- HTML 程式碼-->
<div><div class="a">oxxo</div></div>
<div><div class="b rl">oxxo</div></div>
<div><div class="a-size">oxxo</div></div>
<div><div class="b-size rl">oxxo</div></div>


<!-- CSS 程式碼 -->
<style>
  div:not([class]){
    width: 200px;
    height: 200px;
    border: 1px solid #000;
    float: left;
    margin: 10px;
    box-sizing: border-box;
    position: relative;
  }
  div div {
    width: 100px;
    height: 100px;
    border: 1px solid #000;
    background: #f90;
    position: absolute;
  }
  .a, .b {
    left: 20px;  /* 定位物理屬性寫法 */
    top: 80px;   /* 定位物理屬性寫法 */
  }
  .rl {writing-mode: vertical-lr;}
  .a-size, .b-size {
    background: #0cf;
    inset-inline-start: 20px;  /* 邏輯屬性寫法 */
    inset-block-start: 80px;   /* 邏輯屬性寫法 */
  }
</style>

CSS 教學 - CSS 邏輯屬性 ( logical properties ) - 內嵌寬度 inset 邏輯屬性

小結

從這邊教學得範例中可以發現,透過 CSS 邏輯屬性 ( logical properties ) 可以針對文字的方向,自動改變設定的方向,雖然在大部分的情形都不會遇到 ( 網站為了瀏覽的使用者體驗,大多都是水平排版,很少直書 ),但如果真的有相關需求,透過邏輯屬性進行設定是相當方便的。

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則 CSS 常用樣式屬性

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 使用巢狀結構語法 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

關鍵字與文字數值 長度與角度單位 位置名稱與時間單位

規則與定義

變數 ( Variables ) 媒體查詢 ( @media ) 容器查詢 ( @container ) 自訂屬性值 ( @property ) 匯入樣式 ( @import ) 分層優先順序 ( @layer ) 定義字型 ( @font-face ) 計數規則 ( @counter-style ) 列印網頁 ( @page )

函式類型

數學計算 文字與清單計數 形狀與線段 路徑 ( path ) 生成內容與引號

顏色與濾鏡

顏色單位 色彩模型 漸層色 影像濾鏡 ( filter ) 背景濾鏡 ( backdrop-filter ) 混合模式 ( mix-blend-mode )

文字與段落

設定字型 ( font-family ) 使用外部字型 文字尺寸 文字樣式 ( 常用 ) 文字樣式 ( 其他實用 ) 文字樣式 ( 特殊用途 ) 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 文字自動分欄

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬度與高度 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 ( border-radius ) 影像邊框 ( border-image ) 輪廓 ( outline ) 內容溢出與裁切 ( overflow ) 內容範圍 ( contain ) 可見性與透明度

背景與陰影

背景顏色 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 ( shape-* ) 定位 ( position ) 邏輯屬性 ( logical properties )

Flex 彈性排版

Flexbox 彈性盒子 Flex 對齊方式 Flex 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 自訂動畫路徑 ( offset ) 動畫觸發事件 多重動畫的權重與順序

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask ) 物件填滿方式與定位 轉換函式 ( transform ) 平移、旋轉與縮放 3D 轉換與透視 3D 正多面體

視窗與使用者行為

捲軸樣式 ( scrollbar ) 滑鼠游標圖示 ( cursor ) 滑鼠事件 ( pointer-events ) 使用者選取 ( user-select ) 捲動行為 ( scroll、overscroll ) 列印換頁 ( break-* )

範例效果

CSS 圓餅圖 CSS 跑馬燈 Google 載入動畫 漸層色的轉場與動畫 電子時鐘數字 不規則形狀動畫