css的命名衝突目前有幾種解決方法:
1.命名約定
人為的制定一下命名規則以避免衝突,例如字首,巢狀等
2.CSS in JS
在JavaScript中寫CSS,使用工具編譯為css,最常見的是styled-components
3.使用編譯工具改變css類名
最常見的是CSS Modules
4.HTML5的style scoped
可以部分解決css重名問題,缺陷很多
1. CSS Modules
CSS Modules只轉換 class 和 id 選擇器。在 js 中 styles 就像一個物件一樣使用,因此如果樣式名為 .site-wrapper,那麼在使用時應該寫成 styles['site-wrapper']。我們可以設定 css-loader 的 camelCase 引數為 true 來啟動自動轉換,這樣在 js 中就可以通過 styles.siteWrapper 使用
支援的工具有webpack的css-loader和postcss的postcss-modules
例如css-loader:
module: { loaders: [ // ... { test: /\.css$/, loader: "style-loader!css-loader?modules&localIdentName=[path][name]---[local]---[hash:base64:5]" }, ] }
1. CSS Modules支援全域性和區域性作用域
:local(.title) { color: red; } :global(.title) { color: green; }
2.CSS Modules在vue元件中可以直接使用,方式如下
<template> <p :class="$style.gray"> Im gray </p> </template> <style module> .gray { color: gray; } </style>
編譯為:
<p class="gray_3FI3s6uz">Im gray</p> .gray_3FI3s6uz { color: gray; }
由此可見,css module直接替換了類名,排除了使用者設定類名影響元件樣式的可能性。
這樣$style.red就可以當做一個變數,並且可以在js中使用,如下:
<script> export default { created () { console.log(this.$style.gray) // -> "gray_3FI3s6uz" // 一個基於檔名和類名生成的識別符號 } } </script>
我們可以看到,module在使用時多出了繫結和$style,如果你想更優雅,可以看一下這個vue-css-modules
2. css scoped
<style scoped>
.example {
color: red;
}
</style>
<template>
<div class="example">hi</div>
</template>
會轉換為:
<style> .example[data-v-f3f3eg9] { color: red; } </style> <template> <div class="example" data-v-f3f3eg9>hi</div> </template>
1. scoped在DOM中新增了一個唯一的屬性data-v-f3f3eg9,在css中也新增了一個屬性.example[data-v-f3f3eg9]
來保證唯一性,這樣如果外部使用了同名的class,依然有可能影響元件的樣式
2. scoped使用了屬性選擇器,會使得選擇的效率降低
3. scoped在html和css中都新增了雜湊值,會使得兩者的提交都變大,降低載入速度,影響渲染效率
4. scoped修改子元件的樣式,必須使用深度選擇器,形式如下:
<template> <div id="app"> <gHeader></gHeader> </div> </template> <style lang="css" scoped> .gHeader /deep/ .name{ //第一種寫法 color:red; } .gHeader { /deep/ .name{ color:red; } } .gHeader >>> .name{ //第二種寫法 color:red; } </style> <div class="gHeader"> <div class="name"></div> </div>
總體而言,CSS Modules優於scoped,提倡使用CSS Modules。
參考:https://www.cnblogs.com/macq/archive/2018/05/17/9051097.html
https://blog.csdn.net/hezh1994/article/details/78899641
http://www.ruanyifeng.com/blog/2016/06/css_modules.html