如何使用var函数动态修改css的属性


theme: fancy
highlight: atom-one-dark

1.概述

var()函数可以代替元素中任何属性中的值的任何部分。 var()函数不能作为属性名、选择器或者其他除了属性值之外的值。(这样做通常会产生无效的语法或者一个没有关联到变量的值。)

2.语法

方法的第一个参数是要替换的自定义属性的名称。函数的可选第二个参数用作回退值。如果第一个参数引用的自定义属性无效,则该函数将使用第二个值。

<var()> = 
  var( <custom-property-name> , <declaration-value>? ) 

备注:  自定义属性的回退值允许使用逗号。例如, var(--foo, red, blue) 将red, blue同时指定为回退值;即是说任何在第一个逗号之后到函数结尾前的值都会被考虑为回退值,简言之,前面的值不生效,会采用后面的值。

  • <custom-property-name> 自定义属性名

    • 在实际应用中它被定义为以两个破折号开始的任何有效标识符。自定义属性仅供作者和用户使用; CSS 将永远不会给他们超出这里表达的意义。
  • <declaration-value> 声明值(后备值)

    • 回退值被用来在自定义属性值无效的情况下保证函数有值。回退值可以包含任何字符,但是部分有特殊含义的字符除外,例如换行符、不匹配的右括号(如 )]或 })、感叹号以及顶层分号(不被任何非var()的括号包裹的分号,例如var(--bg-color, --bs;color)是不合法的,而var(--bg-color, --value(bs;color))是合法的)。

3.浏览器兼容性

image.png

4.基础用法

4.1 在 :root 上定义(全局变量)

:root {
  --main-bg-color: pink;
}

body {
  background-color: var(--main-bg-color);
}

:root中定义的变量,我们可以在任何元素上使用var()的方式引用。

4.2 在父元素中定义(局部变量)


/* 在父元素样式中定义一个值 */
.component {
  --text-color: #080; /* header-color 并没有被设定 */
}

/* 在 component 的样式中使用它: */
.component .text {
  color: var(--text-color, black); /* 此处 color 正常取值 --text-color */
}
.component .header {
  color: var(--header-color, blue); /* 此处 color 被回退到 blue */
}

4.3 动态修改css的属性

既然我们可以在css中这样写,能不能把变量定义在标签上呢?也就是下面这样子的

<div :style="declareColor" class="bg-color"></div>

这样我们只需要去动态的修改declareColor这个值就可以了,比如:

declareColor = --bg-color: red;
declareColor = --bg-color: blue;

有了这个思路,在input上绑定一个变量bgColor,我们输入颜色,然后用bgColor动态计算(computeddeclareColor的值不就可以了吗?下面是整体代码的实现。

<script setup lang="ts">
import { ref, computed } from "vue";
const bgColor = ref("blue");
const declareColor = computed(() => `--bg-color: ${bgColor.value}`);
</script>

<template>
  <div>
    <!-- 声明成计算属性 -->
    <div :style="declareColor" class="bg-color"></div>
    <input type="text" placeholder="输入颜色值" v-model="bgColor" />
  </div>
</template>
<style>
.bg-color {
  /* --bg-color: red; */
  height: 40px;
  background: var(--bg-color);
}
</style>

最后的效果像下面这样,只要输入一个有效的颜色值,它就会发生变化。

gifmk1870.gif

预览地址需要访问外网

思考

能不能用这种方式去做主题切换的功能呢?

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容