使用CSS原生的 if() 語法實現動態設計

CSS 的 if() 搭配變數系統attr(),讓我們能直接用 CSS 判斷條件或 HTML 屬性自動達成樣式變化,在某些情況下不再需要寫任何 JavaScript。

CSS if else

範例

我們可以用不同 class 搭配變數不同的值,再加上 if 和 else 判斷來自動設定 background-color 的值:


:root {
  --color: #333;
}
.element {
  background-color: if(
    style(--color: #fafafa): black;
    style(--color: #ed5fe8): #000a75;
    else: white);
}
.dark {
  --color: #fafafa;
}
.esport {
  --color: #ed5fe8;
}

你可以注意到,寫複數個判斷條件還可以實現「else if」的效果。

但直接使用的缺點也很明顯,就是直接判斷變數的值太不直觀了,所以我們還可以用上 attr() 來改良。

用 attr() 優化 if() 的判斷條件

這裡我們使用 attr() 搭配 if() 判斷狀態(data-status)來給不同的值,程式寫起來就會直觀很多。


<div class="container">
  <div class="card" data-status="success"></div>
  <div class="card" data-status="warning"></div>
  <div class="card" data-status="success"></div>
  <div class="card" data-status="error"></div>
  <div class="card" data-status="warning"></div>
</div>

.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  grid-auto-rows: min-content;
  gap: 8px;
}
.card {
  --status: attr(data-status type(<custom-ident>));
  box-shadow: 0 0 0 1px #333;
  border-radius: 4px;
  padding: 1rem;
  background-color: if(
    style(--status: success): #7dfaa5;
    style(--status: error): #ff3874;
    else: #fccd81);
  grid-row: if(
    style(--status: error): 1;
    style(--status: warning): 2;
    else: 3);
}

實際應用

我們可以運用 if() 自動分類物件,例如使用在儀表版中,自動給予不同狀態的元素相對應的顏色,甚至可以自動將各種狀態的元素分類排放。

CSS if() and grid
運用 if() 自動給予相對的顏色與位置(在 codepen 查看

但使用時要注意,目前只有 chrome 137 之後的版本(包含 Edge)支援 if() 的語法,但過不了多久應該所有瀏覽器都會跟上。

留言

這個網誌中的熱門文章

如何產生醒目顯示文字的連結?讓使用者一目瞭然的功能(Scroll to Text Fragment)

用CSS的 min max與vw cqw,設計有極限值的RWD響應式文字

Google Search Console 網頁發現方式多了「參照網頁」