你们好,我是卡颂。javascript
不知道平时在项目里你怎么处理CSS
呢?css
咱们知道,因为原生CSS
存在一些问题,好比:html
复用时容易样式冲突vue
没有做用域、没有模块化java
没有编程能力编程
社区涌现出不少解决方案,好比:api
命名规范(好比BEM
规范)浏览器
模块规范(CSS Modules)markdown
CSS
预处理器(好比Less
)框架
CSS In JS
CSS
框架(Tailwind CSS
)
......
若是咱们按如下三个维度评判这些方案:
上手难度:与原生CSS
越接近,越好上手
灵活性:拥有越强编程能力,越灵活
能力:能解决多少原生CSS
的问题
会发现每一个方案都有本身的优点与短板。
好比:
CSS In JS
方案用JS
写CSS
,拥有极高灵活性,但加大了上手难度
Less
(CSS
预处理器)能够看做CSS
的超集,上手难度低、有必定编程能力,可是CSS
自身的问题他也存在
业界常见作法是:同时使用BEM
规范(解决命名冲突问题)+ CSS
预处理器。
咱们用这三个维度分析下Vue
的SFC
(Single-File-Component,单文件组件):
<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
间切换。能够看到,页面样式也会同步变化:
不只是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
的编译时了。这种转变,你接受吗?