大家好,我是卡颂。
不晓得平时在我的项目里你怎么解决CSS
呢?
咱们晓得,因为原生CSS
存在一些问题,比方:
- 复用时容易款式抵触
- 没有作用域、没有模块化
- 没有编程能力
社区涌现出很多解决方案,比方:
- 命名标准(比方
BEM
标准) - 模块标准(CSS Modules)
CSS
预处理器(比方Less
)CSS In JS
CSS
框架(Tailwind CSS
)
......
如果咱们按以下三个维度评判这些计划:
- 上手难度:与原生
CSS
越靠近,越好上手 - 灵活性:领有越强编程能力,越灵便
- 能力:能解决多少原生
CSS
的问题
会发现每个计划都有本人的劣势与短板。
比方:
CSS In JS
计划用JS
写CSS
,领有极高灵活性,但加大了上手难度Less
(CSS
预处理器)能够看作CSS
的超集,上手难度低、有肯定编程能力,然而CSS
本身的问题他也存在
业界常见做法是:同时应用BEM
标准(解决命名抵触问题)+ CSS
预处理器。
进击的Vue 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
属性取得了响应式更新能力,使其灵活性大大晋升。
响应式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
的编译时了。这种转变,你承受吗?