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。
参考资料