CSS Modules 与 scoped 的不一样
What ?
css 的作用域表现。
Css modules
是一个CSS文件,其中所有类名和动画名称默认为局部作用域。
使用JS编译原生的CSS文件,使其具备模块化的能力,该文件需要import使用。
Scoped
在vue文件中的style标签上,有一个特殊的属性:scoped。
此样式仅适用于当前组件元素,从而使组件之间的样式不互相污染。
How ?
Css modules
实现原理
通过给样式名加hash字符串后缀的方式,实现特定作用域语境中的样式编译后的样式在全局唯一。
具体效果demo
// 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;
}
由此可见
- css module直接替换了类名,排除了用户设置类名影响组件样式的可能性。优点就是不必再担心命名约定。
- $style.green 是个变量,即可在js中引用,引用方式为:this.$style.green。
- modules 即为启用,localIdentName 是设置生成样式的命名规则。
应用场景
只应用于某个组件,其他组件不适用。
⚠️ 注意点
- 在处理动画animation的关键帧keyframes,动画名称必须先写:
- 比如,animation: deni .5s,能正常编译; animation: .5s deni, 则编译异常
- css modules生效方式:
- 需要css-loader配置才能生效。
- 若使用的是style-loader,则需配置更换为vue-style-loader才可生效。
css modules如何解决权重问题?
允许通过重命名或命名空间来封装样式规则,减少对选择器的约束,从而达到不需要特定方法就可舒服的使用类名。
当样式规则耦合到每个组件时,当不再使用组件时,样式也会被移除。
Scoped
实现原理
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样式优先级的特性,scoped处理会造成每个样式的权重加重了。
- 若组件内部包含有子组件,只会给子组件的最外层标签加上当前组件的data属性:
- 一般父组件如果加了scoped,会比已设置过自己样式的子组件内除最外层标签的内层标签的权重低,所以不会影响他们的样式。
- scoped会使标签选择器渲染变慢更多倍。
- 若用户再定义了相同的类名,也有可能会影响到组件的样式。
- 具有scoped属性的样式只会应用到当前元素和其子元素。Inline样式仍然比scoped样式优先级高,所以,最好避免使用inline样式。
Why ?
目的
- css 模块化
- css 私有化:不被污染
- css 复用性
- 解决CSS中的全局作用域问题
总结
实现同一目的,比较它们的优缺点,css modules 配置并不麻烦且实现的整体效果更优于scoped css,在此个人更推荐使用css modules。
参考资料
- https://github.com/css-modules/css-modules
- https://cn.vuejs.org/v2/guide/comparison.html#组件作用域内的-CSS
- https://vue-loader.vuejs.org/guide/css-modules.html#usage
- https://github.com/css-modules/webpack-demo
- https://webdesign.tutsplus.com/tutorials/solve-your-specificity-headaches-with-css-modules--cms-28973
CSS Modules 与 scoped 的不一样的更多相关文章
- [Vue]Scoped Css与Css Modules的区别
均为解决CSS全局作用域问题(样式冲突(污染))的一个解决方案. 1.Scoped CSS 当 <style> 标签有 scoped 属性时,相当于在元素中添加了一个唯一属性用来区分. & ...
- vue中scoped vs css modules
注意:此文是默认你已经具备scoped和css modules的相关基础知识,所以不做用法上的讲解. 在vue中,我们有两种方式可以定义css作用域,一种是scoped,另一种就是css module ...
- 在Angular1.X中使用CSS Modules
在Angular1.5中,增加了一个Component方法,并且定义了组件的若干生命周期hook,在代码规范中也是推崇组件化开发,但是很遗憾的是,CSS模块化组件化的问题并没有得到解决,大部分项目的打 ...
- 在vue中使用css modules替代scroped
前面的话 css modules是一种流行的模块化和组合CSS的系统. vue-loader提供了与css modules的集成,作为scope CSS的替代方案.本文将详细介绍css modules ...
- CSS Modules入门教程
为什么引入CSS Modules 或者可以这么说,CSS Modules为我们解决了什么痛点.针对以往我写网页样式的经验,具体来说可以归纳为以下几点: 全局样式冲突 过程是这样的:你现在有两个模块,分 ...
- CSS modules 与 React中实践
最近一直在学习React,看上去蛮简单的内容,其实学习曲线还是比较高的. 目前学到css绑定的问题,看到有一篇好的文章,就转过来了. CSS 模块化的解决方案有很多,但主要有两类.一类是彻底抛弃 CS ...
- 在React中使用CSS Modules设置样式
最近,一直在看React...那真的是一个一直在学的过程啊,从配置环境webpack,到基础知识jsx,babel,es6,没有一个不是之前没有接触的.其实,我内心是兴奋的啊,毕竟,活着就是要接触一些 ...
- Webpack 2 视频教程 012 - 理解Webpack 中的 CSS 作用域与 CSS Modules
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- css模块化及CSS Modules使用详解
什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方 ...
随机推荐
- python基础之Day14
一.生成器 1.什么是生成器 在函数内但凡出现yield关键字,再调用函数就不会执行函数体代码,会返回一个值,该值称之为生成器,生成器本质就是迭代器 2.为什么要有生成器 生成器是一种自定义迭代器的方 ...
- mac系统 pip3 install scrapy 失败 No local packages or working download links found for incremental>=16.10.1
使用pip3 install scrapy命令之后,会出现如下问题: Collecting scrapy Downloading Scrapy-1.4.0-py2.py3-none-any.whl ( ...
- Python从入门到精通之Forth!
Python基本数据类型之列表 补充:range()方法 python2: range 立即创建 xrange for循环的时候才一个一个创建 Python3: range for循环的 ...
- Python Day 8
阅读目录: 内容回顾 三种字符串 文件操作三步骤 基础的读 基础的写 with...open()语法 文件的操作模式 文件的操作编码问题 文件的复制 游标操作 ##内容回顾 类型转换 #1.数字类 ...
- 使用kbmMWConfiguration 让 kbmmw smartservice 更聪明
以前的文章介绍了 很多 kbmmw smartservice 的使用,尤其是 rest 服务,所有的的配置都是通过 开发时写编码实现的,这样就可能导致,针对不同的应用环境,我们要重新编译代码,当然也可 ...
- Django的MVT模式与MVC模式
Django的MVT模式与MVC模式 在正式开始coding之前,我觉得有必要探讨下Django的MVT模式,理论和实践相结合,才能更好的掌握一门技术.Django中的MVT模式,Django就是属于 ...
- 《Linux就该这么学》第十九天课程
今天对“Linux就该这么学”课程做个收尾 最后一张使用LNMP架构部署动态网站环境 第1步:下载及解压源码包文件.为了方便在网络中传输,源码包文件通常会在归档后使用gzip或bzip2等格式进行压缩 ...
- java程序员随笔
之前坚持过一段时间的博客,不过后来因为一些琐事,也因为自己的懒惰,没坚持下来.一晃本科毕业到现在已经快9年了,本科毕业的时候经常想,自己十年之后会是什么样子,那时候筹措满志,心里的每一个答案,都离现在 ...
- flume接收http请求,并将数据写到kafka
flume接收http请求,并将数据写到kafka,spark消费kafka的数据.是数据采集的经典框架. 直接上flume的配置: source : http channel : file sink ...
- WPF中的数据绑定
WPF中的数据绑定 基础概念 System.Windows.Data.Binding,他会把两个对象(UI对象与UI对象之间,UI对象与.NET数据对象之间)按照指定的方式粘合在一起,并在他们之间建立 ...