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