css 的做用域表現。css
是一個CSS文件,其中全部類名和動畫名稱默認爲局部做用域。 使用JS編譯原生的CSS文件,使其具有模塊化的能力,該文件須要import使用。
在vue文件中的style標籤上,有一個特殊的屬性:scoped。 此樣式僅適用於當前組件元素,從而使組件之間的樣式不互相污染。
實現原理html
經過給樣式名加hash字符串後綴的方式,實現特定做用域語境中的樣式編譯後的樣式在全局惟一。vue
具體效果demowebpack
// webpack.config.js { test: /\.css$/, loader: 'style!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]' }
編譯前 - vue 環境 <template> <div :class="$style.green">demo demo</div> </template> <style module> .green { color: green; } </style> 編譯後 - vue 環境 <div class="green_3UI7s9iz">demo demo</div> .green_3UI7s9iz { color: green; }
因而可知git
應用場景github
只應用於某個組件,其餘組件不適用。web
⚠️ 注意點less
css modules如何解決權重問題?dom
容許經過重命名或命名空間來封裝樣式規則,減小對選擇器的約束,從而達到不須要特定方法就可舒服的使用類名。ide
當樣式規則耦合到每一個組件時,當再也不使用組件時,樣式也會被移除。
實現原理
vue經過在DOM結構以及css樣式上加惟一不重複的標記,以保證惟一,達到樣式私有化模塊化的目的。
具體效果demo
// 編譯前 demo.vue <template> <div class="demo-c">hello world!</div> </template> <style lang="less" scoped> .demo-c { width: 100%; height: 100px; background-color: green; color: #fff; } </style>
// 編譯後-dom <div data-v-48baf84c="" class="demo-c">hello world!</div> // 編譯後-css .demo-c[data-v-48baf84c] { width: 100%; height: 1.333333rem; background-color: green; color: #fff; }
應用場景
scoped css能夠直接在能跑起來的vue項目中使用,且對應的樣式只對該組件有效,不被其餘組件污染。
⚠️ 注意點
「權重加劇」的意思: 若是咱們要去修改這個樣式,須要更高的權重去覆蓋其樣式。
實現同一目的,比較它們的優缺點,css modules 配置並不麻煩且實現的總體效果更優於scoped css,在此我的更推薦使用css modules。
參考資料