在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 相关文章推荐
javascript 兼容所有浏览器的DOM扩展功能
Aug 01 Javascript
JS实现QQ图片一闪一闪的效果小例子
Jul 31 Javascript
浅谈javascript六种数据类型以及特殊注意点
Dec 20 Javascript
jQuery之Deferred对象详解
Sep 04 Javascript
详解获取jq ul第一个li定位的四种解决方案
Nov 23 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
Dec 25 Javascript
干货!教大家如何选择Vue和React
Mar 13 Javascript
详解webpack编译速度提升之DllPlugin
Feb 05 Javascript
django js 实现表格动态标序号的实例代码
Jul 12 Javascript
js实现select下拉框选择
Jan 11 Javascript
node.js开发辅助工具nodemon安装与配置详解
Feb 06 Javascript
react-router-dom 嵌套路由的实现
May 02 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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
jquery插件制作 提示框插件实现代码
2012/08/17 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
基本DOM节点操作
2017/01/17 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
js仿微信抢红包功能
2020/09/25 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
python控制台中实现进度条功能
2015/11/10 Python
python如何查看系统网络流量的信息
2016/09/12 Python
Python 函数返回值的示例代码
2019/03/11 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Oracle快照(snapshot)
2015/03/13 面试题
八年级语文教学反思
2014/02/11 职场文书
学生打架检讨书
2014/02/14 职场文书
教师党员个人总结
2015/02/10 职场文书
建国大业观后感800字
2015/06/01 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python
Python图像处理库PIL详细使用说明
2022/04/06 Python
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL