在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 相关文章推荐
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
Feb 07 Javascript
javascript设计模式 封装和信息隐藏(上)
Jul 24 Javascript
js根据日期判断星座的示例代码
Jan 23 Javascript
javascript 获取HTML DOM父、子、临近节点
Jun 16 Javascript
jQuery创建DOM元素实例解析
Jan 19 Javascript
JS实现网页表格自动变大缩小的方法
Mar 09 Javascript
Jquery实现上下移动和排序代码
Oct 17 Javascript
sea.js常用的api简易文档
Nov 15 Javascript
jQuery中.attr()和.data()的区别分析
Sep 03 jQuery
React 无状态组件(Stateless Component) 与高阶组件
Aug 14 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
Dec 11 jQuery
Vue 事件的$event参数=事件的值案例
Jan 29 Vue.js
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
ASP知识讲座四
2006/10/09 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
PHP开发中四种查询返回结果分析
2011/01/02 PHP
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
javascript this详细介绍
2016/09/19 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
Gap英国官网:Gap UK
2018/07/18 全球购物
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
模范家庭事迹材料
2014/02/10 职场文书
村干部培训方案
2014/05/02 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
单位员工收入证明样本
2014/10/09 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
初一年级组工作总结
2015/08/12 职场文书