點燈坊

失くすものさえない今が強くなるチャンスよ

使用 CSS Variable 管理重複值

Sam Xiao's Avatar 2021-02-06

若多個 CSS Selector 共用相同的設定,可將其設定抽成 CSS Variable 方便日後維護。

Version

CSS 3

Global CSS Variable

var001

<div> 的紅色由 global CSS variable 定義。

<template>
  <div class="bar"/>
</template>

<style>
:root {
  --bgColor: #f00;
}

.bar {
  height: 30px;
  background-color: var(--bgColor);
}
</style>

第 6 行

:root {
  --bgColor: #f00;
}
  • :root 下定義 --bgColor

10 行

.bar {
  height: 30px;
  background-color: var(--bgColor);
}
  • var() 使用 --bgColor

Global CSS variable 顧名思義所有 CSS selector 都可使用,不限於目前 selector

Local CSS Variable

var000

box1 下的 item1sub1 都能套用 local CSS variable 而變色,但 box2 則無法使用。

<template>
  <div class="box1">
    <div class="item1">
      box1 item1
      <div class="sub1">
        box1 sub1
      </div>
    </div>
  </div>
  <div class="box2">
    box2
  </div>
</template>

<style scoped>
.box1 {
  --my-color1: #f00;
  --my-color2: #0f0;
}

.box1 .item1 {
  color: var(--my-color1)
}

.box1 .sub1 {
  color: var(--my-color2)
}

.box2 {
  color: var(--my-color1)
}
</style>

16 行

.box1 {
  --my-color1: #f00;
  --my-color2: #0f0;
}

--my-color1--my-color2 定義在 .box1 下。

21 行

.box1 .item1 {
  color: var(--my-color1)
}

.box1 .sub1 {
  color: var(--my-color2)
}

item1sub1 都在 .box1 下,因此都可套用 --my-color1--my-color2

29 行

.box2 {
  color: var(--my-color1)
}

.box2 則無法使用 .box1 下的 --my-color1--my-color2

Conclusion

  • 當使用 global CSS variable 時,在 Vue 只能使用 <style>,不能使用 <style scoped>
  • 若想建立 local CSS variable 不影響其他 selector,可使用 CSS class 建立 scope,將 CSS variable 包在該 class 內

Reference

MDN, Using CSS custom properties