你们好,我是卡颂。css
不知道平时在项目里你怎么处理CSS
呢?html
咱们知道,因为原生CSS
存在一些问题,好比:vue
社区涌现出不少解决方案,好比:编程
BEM
规范)CSS
预处理器(好比Less
)CSS In JS
CSS
框架(Tailwind CSS
)......segmentfault
若是咱们按如下三个维度评判这些方案:api
CSS
越接近,越好上手CSS
的问题会发现每一个方案都有本身的优点与短板。浏览器
好比:框架
CSS In JS
方案用JS
写CSS
,拥有极高灵活性,但加大了上手难度Less
(CSS
预处理器)能够看做CSS
的超集,上手难度低、有必定编程能力,可是CSS
自身的问题他也存在业界常见作法是:同时使用BEM
规范(解决命名冲突问题)+ CSS
预处理器。模块化
咱们用这三个维度分析下Vue
的SFC
(Single-File-Component,单文件组件):url
<template> <p>xxx</p> </template> <script> // ... </script> <style scoped> p { color: #0f0; } </style>
<style>
标签内书写,与原生CSS
别无二致,上手简单,符合直觉scoped
标识提供了模块化能力能够看到,Vue SFC
采用的是一种各方面没有明显短板,局部很突出(上手难度低)的CSS
方案。
随着Vue
3.2发布,Vue SFC
中的CSS
属性得到了响应式更新能力,使其灵活性大大提高。
对于以下Vue SFC
:
<template> <div class="text">hello</div> </template> <script> export default { data() { return { color: 'red' } } } </script> <style> .text { color: v-bind(color); } </style>
<script>
标签内定义了状态color = 'red'
.text
使用v-bind
为color
属性绑定该状态。效果以下:
为了验证响应式更新能力, 为div
增长点击事件:
<div class="text" @click="color= color === 'red' ? 'green' : 'red'">hello</div>
点击后会让color
状态在red
与green
间切换。能够看到,页面样式也会同步变化:
Demo地址
不只是color
,你能够为任何CSS
属性绑定状态。
那么这个特性是如何实现的呢?
每一个使用v-bind
绑定到CSS
属性的状态对应一个CSS
变量,该CSS
变量会做为style
属性赋值给组件最外层DOM
。
在咱们的例子中:
.text { color: v-bind(color); }
其中v-bind(color)
会成为CSS
变量:
并做为style
属性赋值给div
:
.text
通过编译会使用该CSS
变量:
.text { // 编译前 /* color: v-bind(color); */ // 编译后 color: var(--469af010-color); }
当颜色变化后,CSS
变量的值随之变化:
因此,要使用这个特性须要目标浏览器支持CSS
变量。
Vue3
放弃IE
这但是说到作到的。
Vue
官方称该特性为State-Driven Dynamic CSS。
通过这波操做,Vue SFC
的CSS
灵活性有了很大提升。
而且,有了v-bind
这个开头,相信将来会出现更多与响应式更新挂钩的自定义CSS指令。
以前的自定义指令都是运行时的,之后的指令可能会是基于AST
的编译时了。这种转变,你接受吗?