body {
  --box-color: #4d4e53;
  --box-padding: 0 10px;
}

声明custom properties

使用custom properties

.box {
    color: var(--box-color);
}
.anotherbox {
    padding: var(--box-padding);
}

也叫 CSS Variables

:root {
  --main-color: #4d4e53;
  --main-bg: rgb(255, 255, 255);
  --logo-border-color: rebeccapurple;

  --header-height: 68px;
  --content-padding: 10px 20px;

  --base-line-height: 1.428571429;
  --transition-duration: .35s;
  --external-link: "external link";
  --margin-top: calc(2vh + 20px);

  /* Valid CSS custom properties can be reused later in JavaScript. */
  --foo: if(x > 5) this.width = 10;
}

任何合法的 CSS 属性值都可以作为 custom property的值:

a color, a string, a layout value, even an expression

.box {
    --box-color:#4d4e53;
    --box-padding: 0 10px;

    /* 10px is used because --box-margin is not defined. */
    margin: var(--box-margin, 10px);
}

var() 可以传入第二个参数作为默认值

可以使用现有的 variables 定义新的 variable

.box {
    padding: var(--box-padding, var(--main-padding));
    --box-text: 'This is my box';

    /* Equal to --box-highlight-text:'This is my box with highlight'; */
    --box-highlight-text: var(--box-text)' with highlight';
}
:root{
    --indent-size: 10px;

    --indent-xl: calc(2*var(--indent-size));
    --indent-l: calc(var(--indent-size) + 2px);
    --indent-s: calc(var(--indent-size) - 2px);
    --indent-xs: calc(var(--indent-size)/2);

    --spacer: 10;
}

.box{
    padding: var(--spacer)px 0; /* DOESN'T work */
    padding: calc(var(--spacer)*1px) 0; /* WORKS */
}

使用 calc() 获得计算值

和一般的 CSS properties 一样,custom properties 也具有层叠性

.box {
    --box-color: green;
}

div {
    --box-color: red;
    --background-color: yellow;
}

div.box {
    color: var(--box-color);
    background: var(--background-color);
}

custom properties 具有继承性

.box {
    --box-color: green;
}

.box > .sub {
    color: var(--box-color);
}

😛小问题常见的 CSS 属性中,哪些具有继承性,哪些没有?

感受一下与预处理器中的变量作用域的差别

感受一下与预处理器中变量作用域的差别

$globalVar: 10px;

.container {
    $containerVar: 20px;

    .sub {
        $subVar: 30px;

        font-size: $globalVar + $containerVar + $subVar;
    }
}

预处理区不知道 HTML 结构

和一般的 CSS properties 一样,custom properties 是

动态的

$globalVar: 10px;

.container {
    $containerVar: 20px;

    .sub {
        $subVar: 30px;

        font-size: $globalVar + $containerVar + $subVar;

        $subVar: 40px;
    }
}
:root {
    --globalVar: 10px;
}

.parent {
    --parentVar: 20px;
}

.sub {
    --subVar: 30px;

    font-size: calc(var(--subVar) + var(--parentVar) + var(--globalVar));

    --subVar: 40px;
}

custom properties 使用场景

模拟单个属性:translateX/Y/Z box-shadow-color

.test {
  --box-shadow-color: yellow;
  box-shadow: 0 0 30px var(--box-shadow-color);
}

.test:hover {
  --box-shadow-color: orange;
  /* Instead of: box-shadow: 0 0 30px orange; */
}

页面主题切换

custom properties 使用场景

解耦 CSS 与 JavaScript

function readCssVar(element, varName){
    const elementStyles = getComputedStyle(element);
    return elementStyles.getPropertyValue(`--${varName}`).trim();
}

function writeCssVar(element, varName, value){
    return element.style.setProperty(`--${varName}`, value);
}

CSS 负责样式,JavaScript 负责逻辑,JavaScript 通过 custom properties 传递参数

.button {
  position: relative;
  transform: scale(1);
}
 
.button.js-toggled {
  transform: scale(1.5);
}

const button = document.querySelector('.button');
button.addEventListener('click', () => {
  button.classList.toggle('js-toggled');
});

CSS Custom Properties

By yiliang_wang

CSS Custom Properties

  • 23