vue2还可以这样使用css变量

891 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

vue3如何做的

在我之前的文章里,有介绍到vue3对css变量的一个辅助方法,v-bind,它是这样使用的

<template>
    <p>123</p>
</template>
<script setup>
 const a = ref('red')
 settimeout(()=>{
  a.value = 'blue'
 })
</script>
<style scoped>
    p{ color:v-bind('a') }
</style>

在vue3中其实通过编译器去处理这个问题,你很难把这个功能移植到vue2里,但是我们可以通过另一个方法实现:那就是自定义指令

什么是自定义指令

vue中的指令就是普通dom执行一些底层操作的一个方便接口。例如我们常用的v-show,v-if,这些是官方指令。vue2还运行我们自定义指令已完成一些自己需要的操作。

我大概写一下官方的api

Vue.directive('any', {
    bind:function(e){
         //指令第一次绑定到元素时调用,仅执行一次
    },
    inserted: function (el) { 
        // 当被绑定的元素插入到 DOM 中时
    },
    update:function(e){
        // 虚拟dom更新时
    },
    componentUpdated:function(e){
        // 指令所在组件更新了
    },
    unbind:function(e){
        // 指令解绑
    }
})

使用的时候就是

<template>
<p v-any="xxx" >123</p>
</template>

css变量API

我这里简单介绍一下css变量,如果需要更详细的解读,建议你阅读这篇文章www.ruanyifeng.com/blog/2017/0…

我们现在在body下新建一个css变量

:root{
    --color:red;
}
  • 使用css变量
p{
 color:var(--color)
}
  • js读取css变量
document.body.style.getPropertyValue('--color');
  • js更新css变量
document.body.style.setProperty('--color','blue');
  • js删除css变量
document.body.style.removeProperty('--color');

下面,我们就将这些组装起来,通过vue directive API。

v-css-var

我们知道vue插件都需要导出一个install函数。

export default {
    intall:function(){}
}

为了保险起见,我们需要判断一下当前浏览器支不支持css变量,哪怕现在css变量的支持已经很好了。

const isSupported = window.CSS && window.CSS.supports && window.CSS.supports('--a','0')

这样我们就有了基本的结构,我的实现如下,大家也可以直接安装我写的npm包. www.npmjs.com/package/v-c…

image.png

什么时候使用css变量

其实我写css变量写的很多,但其实在vue里,大部分人可能会更习惯使用v-show,或者拼接style字符串,其实这样就已经相当于大部分css变量的功能了,因此大家无需迷信css变量,但是在主题色,暗黑模式的时候,使用css变量确实毕竟方便