在vue中使用css modules替代scroped的方法


Posted in Javascript onMarch 10, 2018

前面的话

css modules是一种流行的模块化和组合CSS的系统。 vue-loader提供了与css modules的集成,作为scope CSS的替代方案。本文将详细介绍css modules

引入

最开始使用Vue的时候,提倡并大量使用的是scoped这种技术

<style scoped>
 @media (min-width: 250px) {
  .list-container:hover {
   background: orange;
  }
 }
</style>

这个可选 scoped 属性会自动添加一个唯一的属性 (比如 data-v-21e5b78) 为组件内 CSS 指定作用域,编译的时候 .list-container:hover 会被编译成类似 .list-container[data-v-21e5b78]:hover

但是,它并不能完全避免冲突

<span data-v-0467f817 class="errShow">用户名不得为空</span>

以上面的代码为例,使用scoped之后,它在元素上添加了一个唯一的属性'data-v-0467f817',CSS样式被编译如下

.errShow[data-v-0467f817] {
  font-size: 12px;
  color: red;
}

但是,如果用户也定义了一个errShow类名,会影响到所有定义为errShow类名的组件的显示

而CSS modules则做的更彻底,它不是添加属性,而是直接改变类名

<span class="_3ylglHI_7ASkYw5BlOlYIv_0">用户名不得为空</span>

这样,大大降低了冲突的可能性,只要不是用户直接给span标签设置样式,基本上不会影响组件的显示

模块化

CSS Modules既不是官方标准,也不是浏览器的特性,而是在构建步骤中对CSS类名选择器限定作用域的一种方式(通过hash实现类似于命名空间的方法)。类名是动态生成的,唯一的,并准确对应到源文件中的各个类的样式

实际上,CSS Modules只是CSS模块化的一种方式。为什么我们需要CSS模块化呢?

CSS的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。于是,亟待解决的就是样式冲突(污染)的问题。一般地,为了解决冲突,会把class命名写长一点,降低冲突几率;加上父元素的选择器,来限制范围等

CSS模块化就是来解决这个问题的,一般地,分为三类

1、命名约定类

该类CSS模块化方案主要用来规范CSS命名,最常见的是BEM,当然还有OOCSS等,在构建工具出现之前,大多数都是在CSS命名上做文章

2、CSS in JS

彻底抛弃CSS,用javascript来写CSS规则,常见的有styled-components

3、使用JS来管理样式

使用JS编译原生的CSS文件,使其具备模块化的能力,最常见的就是CSS Modules

随着构建工具的兴起,越来越多的人开始使用后两者方案,书写CSS时,不用再特意地关心样式冲突问题。只需要使用约定的格式编写代码即可

写法

下面来介绍CSS modules的写法

在style标签中添加module属性,表示打开CSS-loader的模块模式

<style module>
.red {color: red;}</style>

在模板中使用动态类绑定:class,并在类名前面加上'$style.'

<template>
 <p :class="$style.red">
  This should be red
 </p>
</template>

如果类名包含中划线,则使用中括号语法

<h4 :class="$style['header-tit']">类别推荐</h4>

也可以使用数组或对象语法

<p :class="{ [$style.red]: isRed }">
   Am I red?
  </p>
  <p :class="[$style.red, $style.bold]">
   Red and bold
  </p>

更复杂的对象语法

<ul 
  :class="{
    [$style.panelBox]:true,
    [$style.transitionByPanelBox]:needTransition
   }"

更复杂的数组语法

<li
   :class="[
    $style['aside-item'],
    {[$style['aside-item_active']]:(i === index)}
   ]"

配置

css-loader关于CSS modules的默认配置如下

{
 modules: true,
 importLoaders: 1,
 localIdentName: '[hash:base64]'
}

可以使用vue-loader的cssModules选项为css-loader进行自定义的配置

module: {
 rules: [
  {
   test: '\.vue$',
   loader: 'vue-loader',
   options: {
    cssModules: {
     localIdentName: '[path][name]---[local]---[hash:base64:5]',
     camelCase: true
    }
   }
  }
 ]
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 实现双色表格实现代码
Nov 24 Javascript
autoPlay 基于jquery的图片自动播放效果
Dec 07 Javascript
JavaScript操纵窗口的方法小结
Jun 28 Javascript
父节点获取子节点的字符串示例代码
Feb 26 Javascript
JavaScript定时器和优化的取消定时器方法
Jul 03 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
Jan 21 Javascript
利用JavaScript如何查询某个值是否数组内
Jul 30 Javascript
js生成word中图片处理方法
Jan 06 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
Aug 05 Javascript
vue开发拖拽进度条滑动组件
Sep 21 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
Sep 28 Javascript
Vue学习之axios的使用方法实例分析
Jan 06 Javascript
redux-saga 初识和使用
Mar 10 #Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 #Javascript
vue获取当前点击的元素并传值的实例
Mar 09 #Javascript
vue.js获得当前元素的文字信息方法
Mar 09 #Javascript
vue element-ui 绑定@keyup事件无效的解决方法
Mar 09 #Javascript
jquery点击回车键实现登录效果并默认焦点的方法
Mar 09 #jQuery
在vue里面设置全局变量或数据的方法
Mar 09 #Javascript
You might like
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
php多任务程序实例解析
2014/07/19 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
php实现文章评论系统
2019/02/18 PHP
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
大学学年自我鉴定
2013/10/28 职场文书
公关关系专员的自我评价分享
2013/11/20 职场文书
大学生村官心得体会范文
2014/01/04 职场文书
学习新党章思想汇报
2014/01/09 职场文书
七匹狼男装广告词
2014/03/21 职场文书
小学毕业演讲稿
2014/04/25 职场文书
优质服务活动实施方案
2014/05/02 职场文书
教师个人培训总结
2015/02/11 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
python中requests库+xpath+lxml简单使用
2021/04/29 Python
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python