vue 開發常用工具及配置八:scoped CSS 模組化
- 2020 年 1 月 14 日
- 筆記
目錄 1、為什麼需要使用 scoped 2、scoped 穿透問題
1、為什麼需要使用 scoped ?
當一個style
標籤擁有scoped
屬性時,它的CSS
樣式就只能作用於當前的組件。通過該屬性,可以使得組件之間的樣式不互相污染,相當於實現了樣式的模組化。
scoped
模組化是通過PostCSS
插件實現的,實現原理是怎樣的?
如下所示,是編譯前的源碼:
<style scoped> .example { color: red; } </style> <template> <div class="example">hi</div> </template>
編譯後為:
<style> .example[data-v-5558831a] { color: red; } </style> <template> <div class="example" data-v-5558831a>hi</div> </template>
在CSS語法中,div[data-v-5558831a]
表示匹配所有帶有data-v-5558831a
屬性的div
標籤。如下所示程式碼:
a[href] {color:red;}
只對有href
屬性的a
標籤應用樣式。
在編譯階段,PostCSS
插件通過給html
標籤添加data-v-5558831a
屬性,並且同時給樣式類.example
添加同名修飾符,自動實現了css
模組化。
這便是 scoped
模組化的實現原理。
2、scoped 穿透問題
當在項目中引用了第三方組件,而第三方組件使用了scoped
模組化。此時需要在己方組件中局部修改第三方組件的樣式,便涉及到了穿透問題。
由於第三方組件被自動添加了隨機的類data-v-5558831a
屬性,此時消費方在外圍即使使用!important
也是無濟於事的。
假設項目中使用element-ui
的table
組件,此時想在己方組件中修改table
組件標題高度。通過檢視組件程式碼發現,其標題類名為.el-table__header-wrapper
。使用穿透法解決問題應如下編碼:
<style lang="less" scoped> .el-contain-row /deep/ .el-table__header-wrapper { height: 20px; } </style>
在sass
和less
樣式中穿透 使用/deep/
。
又例,在vue
項目中使用了vuetify
框架,如下所示,如果想改變這個按鈕的文本顏色:
<v-btn small color="primary" id="button2">測試scoped穿透</v-btn>
外圍的穿透樣式可以寫:
#button2.v-btn /deep/ .v-btn__content{ color: @theme-color; }
源碼
https://git.code.tencent.com/shiqiaomarong/vue-go-rapiddev-example/tags/v20200104
參考鏈接
- http://www.wulinghui.com/show-14-41-1.html
- https://segmentfault.com/a/1190000017508285
- https://2ue.github.io/2017/11/15/vue-style-scoped/
- https://segmentfault.com/q/1010000017229930
專欄列表
基於 vue+go 如何快速進行業務迭代?