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
css命名冲突解决方法的更多相关文章
-
Jquery库及其他库之间的$命名冲突解决办法
首先我们应该知道,在jquery中,$(美元符号)就是jquery的别名,也就是说使用$和使用jquery是一样的,在很多时候我们命名空间时,正是因为这个$而产生的冲突的发生.比如说:$('#xmla ...
-
css 命名冲突 &; solution
css 命名冲突 & solution 类似这样,为了解决模块间可能存在的 css 命名冲突问题,需要单独提供给模块开发者一套模块开发环境:同时,文档上要有如何使用的规范说明. CSS 建议: ...
-
IIS上虚拟站点的web.config与主站点的web.config冲突解决方法 分类: ASP.NET 2015-06-15 14:07 60人阅读 评论(0) 收藏
IIS上在主站点下搭建虚拟目录后,子站点中的<system.web>节点与主站点的<system.web>冲突解决方法: 在主站点的<system.web>上一级添 ...
-
IIS上虚拟目录下站点的web.config与根站点的web.config冲突解决方法
IIS7.5上在站点下部署虚拟目录,访问虚拟目录下的项目提示与父节点配置冲突.,节点与的<system.web>节点与主站点的<system.web>冲突解决方法: 在站点下的 ...
-
转:git合并冲突解决方法
git合并冲突解决方法 1.git merge冲突了,根据提示找到冲突的文件,解决冲突 如果文件有冲突,那么会有类似的标记 2.修改完之后,执行git add 冲突文件名 3.git commit注意 ...
-
apache与IIS共用80端口冲突解决方法
如果同一台电脑安装了apache和iis,会提示80端口冲突,如何解决apache与iis 80端口冲突的问题呢,并且同时使用apache和iis 将apache设为使用80端口,IIS使用其它端口, ...
-
汇总Anaconda与ROS冲突解决方法
汇总一下在网上找到的Anaconda与ROS冲突解决方法,如果还有其他人找到其他方法,欢迎留言. anaconda和ros的安装就不介绍了. 1. 在某视频网站上一个印度小哥提出的方法 安装完成后,在 ...
-
tornado和vue的模板冲突解决方法
tornado和vue的模板冲突解决方法 Vue的插值表达式和tornado的模板都为一对花括号,可以通过修改vue的插值表达式的符号来解决这个问题,具体方法如下: var vm = new Vue( ...
-
常见JS(JavaScript)冲突解决方法
1.一般JS冲突解决办法 a.最容易出现的就是js的命名冲突 ①.变量名冲突 变量有全局变量和局部变量当全局变量变量和局部变量名称一致时,就会js冲突,由于变量传递数值或地址不同就会产生JavaScr ...
随机推荐
-
关于HTML5 Audio线程问题
移动端果然很坑! 在移动端IOS平台上用new Audio每次调用这个API都会创建一个新的线程,而且还不能销毁...直到拖死应用 后来改进了换了AudioContext,线程问题解决了 https: ...
-
初学C++ 之 auto关键字(IDE:VS2013)
/*使用auto关键字,需要先赋初值,auto关键字是会根据初值来判断类型*/ auto i = ; auto j = ; cout << "auto i = 5" & ...
-
windowsAPI遍历文件夹(速度高于递归)
#region API 遍历文件夹及其子文件夹和子文件 #region 声明WIN32API函数以及结构 ************************************** [DllImpo ...
-
sqoop1.4.6+hadoop2.6.0 转载
转载地址:http://blog.csdn.net/zhangzhaokun/article/details/44313531 (1)安装环境 操作系统:Linux(centos6.5 ...
-
答:SQLServer DBA 三十问之三:有哪些操作会使用到TempDB;如果TempDB异常变大,可能的原因是什么,该如何处理
3. 有哪些操作会使用到TempDB:如果TempDB异常变大,可能的原因是什么,该如何处理: tempdb的用途:1)存储专用和全局临时变量,不考虑数据库上下文: 2)与Order by 子句,游标 ...
-
兼容amd,commonjs和browser的模块写法
从uuid.js中抽出来的写法. (function() { var _global = this; // Export public API var obj = {}; obj.attr = fun ...
-
输出进程相关联的环境变量信息(使用GetEnvironmentStrings取得信息,然后使用StringCchCopyN和StringCchPrintf保证字符串不会越界)
void DumpEnvironmentStrings() { #define MAX_ENVIRONMENT_NAME_LENGTH (128) #define MAX_ENVIRONMEN ...
-
HW3.24
public class Solution { public static void main(String[] args) { int number = (int)(Math.random() * ...
-
搭建golang的beego注意事项
大家都知道,在学golang的时候,大家都会去关注谢大的beego快速开发架构. 首先,小弟是win7 32bit系统,在这里,我要把我学习golang的过程和小心得记录起来. 相信想学的人一定会早早 ...
-
IoC in Spring
写两个关于Spring中使用IoC的小例子,一个是半动态创建Bean,另一个是全动态创建Bean,它们适合不同的应用场景. 一.半动态:在一个实际项目中遇到过这样的问题,项目组开发的某个系统具备在LE ...