你們好,我是卡頌。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
的編譯時了。這種轉變,你接受嗎?