如何玩转var函数来让你的CSS变得更加灵动

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.浏览器兼容性

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> 

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

预览地址需要访问外网

思考一下,能不能用这种方式去做主题切换的功能呢?下面我们继续来实现一下

5.最简单的主题切换功能

我们可以在body身上来下功夫,首先定义两种样式,

第一种为默认,第二种为切换以后的样式

:root { --vt-c-white-soft: #f8f8f8; --vt-c-black-soft: #222222;
}

body {background: var(--vt-c-white-soft);
}

body:dark {background: var( --vt-c-black-soft);
} 

给按钮绑定一个事件,来控制样式的切换

<button @click="handleChangeTheme">切换主题</button>

const handleChangeTheme = () => {if (!document.body.className) {document.body.className = "dark";} else {document.body.className = "";}
}; 

这就OK了!!! 看效果

当然主题切换不止于此,还有主题定制化等等,道阻且长,后续会继续在本篇文章的基础上更新!!!

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值