站長資訊網
        最全最豐富的資訊網站

        詳細解答css作用域之scoped css和css module的區別

        本篇文章給大家帶來了scoped css和css module的區別的相關知識,scoped css和css module都是為了控制css的局部作用域,防止類名重復等問題,那么兩者有什么區別呢,希望對大家有幫助。

        詳細解答css作用域之scoped css和css module的區別

        前言

        scoped css和css module都是為了控制css的局部作用域,防止類名重復等問題。那么兩者有什么區別呢?

        一、css module

        1.1.解釋
        為所有類名重新生成類名,有效避開了css權重和類名重復的問題。css module直接替換了類名,排除了用戶設置類名影響組件樣式的可能性,這樣就不必為了命名絞盡腦汁。
        1.2實現原理
        通過給樣式名加hash字符串后綴的方式,實現特定作用域語境中的樣式編譯后的樣式在全局唯一。
        1.3使用方法

        • 在webpack.base.conf.js文件中,向 css-loader 傳入 modules: true 來開啟CSS Module。localIdentName 是設置生成樣式的命名規則。
        //webpack.base.conf.jsmodule: {     rules: [       // ... 其它規則省略       {         test: /.css$/,         use: [           'vue-style-loader',           {             loader: 'css-loader',             options: {               // 開啟 CSS Modules               modules: true,               // 自定義生成的類名               localIdentName: '[local]_[hash:base64:8]'             }           }         ]       }     ]   }
        • 在 < style >標簽添加 module 屬性
        <style module>.red {   color: red;}.bold {   font-weight: bold;}</style>
        • 在vue模板中通過一個動態類綁定來使用它
        <template>   <p :class="$style.red">     This should be red  </p></template><template>   <p>     <p :class="{ [$style.red]: isRed }">       Am I red?     </p>     <p :class="[$style.red, $style.bold]">       Red and bold    </p>   </p></template>
        • 在js中使用
        <script>export default {   created () {     console.log(this.$style.red)     // -> "red_1VyoJ-uZ"     // 一個基于文件名和類名生成的標識符   }}</script>

        1.4使用效果

        <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;}

        1.5注意點

        • 在處理動畫animation的關鍵幀keyframes,動畫名稱必須先寫。比如,animation: deni .5s,能正常編譯; animation: .5s deni, 則編譯異常
        • 記得配置css-loader,否則不會生效。
        • 若使用的是style-loader,則需配置更換為vue-style-loader才可生效。
        • css modules如何解決權重問題?
          允許通過重命名或命名空間來封裝樣式規則,減少對選擇器的約束,從而達到不需要特定方法就可舒服的使用類名。
          當樣式規則耦合到每個組件時,當不再使用組件時,樣式也會被移除。

        二、Scoped

        2.1實現原理
        vue通過在DOM結構以及css樣式上加唯一不重復的標記,以保證唯一,達到樣式私有化模塊化的目的。無法完全避開css權重和類名重復的問題。
        2.2使用方法
        在 < style >標簽添加 scoped屬性
        2.3使用效果

        <style scoped>h1 {  color: #f00;}</style>

        編譯后結果:

        h1[data-v-4c3b6c1c] {  color: #f00;}

        2.4缺點

        • 如果用戶在別處定義了相同的類名,也許還是會影響到組件的樣式。
        • 根據css樣式優先級的特性,scoped這種處理會造成每個樣式的權重加重,引用 使用了scoped的組件
          作為子組件,修改子組件的樣式變得很難,可能迫不得已只能用!important
        • scoped會使 標簽選擇器 渲染變慢很多倍,用標簽選擇器時scoped會嚴重降低性能,而使用class或id則不會

        三、總結

        css module實際效果要比scoped較好,而且css module配置并不難,所以我更推薦css module。

        (學習視頻分享:css視頻教程)

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 99国产精品国产免费观看| 国内精品免费久久影院| 国产香蕉国产精品偷在线| 国内精品久久久久久久97牛牛| 精品国产免费人成网站| 久久国产精品久久国产精品| 四虎国产成人永久精品免费| 久久99精品久久久久久秒播| 欧美精品天天操| 凹凸国产熟女精品视频app| 热re99久久6国产精品免费| 久久久99精品成人片中文字幕| 亚洲国语精品自产拍在线观看| 亚洲精品无码久久久久sm| 国产精品日韩深夜福利久久 | 久久亚洲国产成人精品性色| 久久久久一级精品亚洲国产成人综合AV区| 欧美精品国产精品| 国产精品素人搭讪在线播放| 精品无人区一区二区三区| 亚洲永久精品ww47| 亚洲精品99久久久久中文字幕| 男女男精品网站免费观看 | 精品福利一区二区三区精品国产第一国产综合精品 | 精品无码日韩一区二区三区不卡 | 精品无人区无码乱码毛片国产| 98精品国产自产在线XXXX| 91精品视频在线| 国产91精品一区二区麻豆亚洲| 亚洲国产综合91精品麻豆| 久久国产精品-久久精品| 国产精品亚洲片夜色在线| 国产精品久久精品| 欧美亚洲国产精品久久蜜芽| 精品一区二区三区在线视频| 精品一区二区三区四区| 日本精品不卡视频| 99九九精品免费视频观看| 国产成人精品怡红院在线观看 | 自怕偷自怕亚洲精品| 99在线精品免费视频|