CSS Variable变量(Css自定义属性)

前端印记

共 5917字,需浏览 12分钟

 ·

2021-10-25 04:57


var 变量

小知识点

变量声明:--color
变量命名:变量名可以是数字、字母、下划线、中横线、中文
变量赋值:--color: red; --color1: #def;
变量获取:color: var(--color);
默认值:var(变量名, 可选的默认值1, 可选的默认值2...),如果引用的变量没有定义,则按默认值的顺序依次取默认值进行使用。默认值比较适合calc计算时,万一计算结果非法,可以用默认值。
变量取值:颜色值、字符串、多个值的组合、函数等。注意,带单位的值和颜色值不用加引号包成字符串,示例:--borderC: green;--fontSize: 12px;变量值不合法:使用默认值。比如var(--color, red);中,--color 值如果非法,不会使用 red,而是使用样式表中继承的/默认的样式值来代替
权重层级:遵循 css 选择器的权重等级,比如:内联样式 > id > class > 标签 > *

作用域:

如下几条规则

  1. 放在 :root 根选择器的变量,所有选择器里都能用;
  2. 放在私有选择器的只能自己及下级使用。类似函数作用域的规律。
  3. 结合 sassless 等预处理器的选择器嵌套功能使用时,父作用域的变量子作用域也可以用。
  4. 结合@media实现响应式变化不同作用域的变量值
<style>
  :root {
    /* 全局作用域的变量 */
    --color: blue;
    --borderC: green;
    --变量名: '变量名可以是数字、字母、下换线、中横线、中文';
  }

  div {
    --color: pink;
  }

  div.father {
    /* 私有作用域 */
    --color: red;
    color: var(--color);
    position: relative;
    transition: color 0.3s ease-in-out;
  }

  div.father::after {
    content: var(--变量名);
    color: var(--color);
    border: 1px solid var(--borderC);
    transition: color 0.3s ease-in-out;
  }

  div.father .child {
    --color: rgb(255, 60, 190);
    color: var(--color);
  }

  /* 结合`@media`实现响应式变化不同作用域的变量值 */
  @media screen and (min-width: 768px) {
    :root {
      --color: orange;
    }

    div.father {
      --color: black;
    }
  }

  /* 兼容性判断 - css */
  @supports ((--color: 0)) {
    div.father::before {
      content: '当前浏览器支持css variables';
      color: red;
      border: 3px lodash var(--borderC);
    }
  }

  @supports (not (--color: 0)) {
    div.father::before {
      content: '不支持';
      color: var(--color);
      border: 3px lodash var(--borderC);
    }
  }
</style>
<div class="father" id="father">
  用变量修改颜色值
  <span class="child"> 子作用域 </span>
</div>
<button id="getBtn">获取css var变量值</button>
<button id="setBtn">设置css var变量值</button>
<button id="deleteBtn">删除css var变量值</button>


作用域效果

兼容性

各浏览器兼容情况:https://caniuse.com/?search=css%20var

兼容性判断

/* 兼容性判断 - css */
@supports ((--color: 0)) {
  div.father::before {
    content'当前浏览器支持css variables';
  }
}

@supports (not (--color: 0)) {
  div.father::before {
    content'不支持';
  }
}
(() => {
  console.log('当前页面是否支持Css变量'window.CSS.supports('--color'0))
})()

JS 操作 CSS 变量

var root = getComputedStyle(document.documentElement);
var divFather = getComputedStyle(father);
console.log(root, divFather)
//  读取 变量值
getBtn.onclick = () => {
  var var1 = root.getPropertyValue('--color').trim();
  console.log(var1);
}
// 新增 / 修改变量值
setBtn.onclick = () => {
  father.style.setProperty('--color''#111def');
  var var2 = divFather.getPropertyValue('--color').trim();
  console.log(var2);
}
// 删除 变量值
deleteBtn.onclick = () => {
  father.style.removeProperty('--color');
  var var3 = divFather.getPropertyValue('--color').trim();
  console.log(var3);
}

优势

  • 含有作用域、能继承、能组合calc、@media等特性使用
  • 实时计算、运行时、动态
  • 可交互(配合js)
  • 可配合预处理器使用(sass、less等)

劣势

  • 低版本浏览器兼容性考虑



愿你历尽千帆,归来仍是少年。


让我们一起携手同走前端路!

关注公众号回复【加群】即可

● 工作中常见页面布局的n种实现方法

● 三栏响应式布局(左右固宽中间自适应)的5种方法

● 两栏自适应布局的n种实现方法汇总

● 工作中常见的两栏布局案例及分析

● 垂直居中布局的一百种实现方式

● 常用九宫格布局的几大方法汇总

● 为什么操作DOM会影响WEB应用的性能?

● 移动端滚动穿透的6种解决方案

● Vue + TypeScript 踩坑总结


浏览 77
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报