在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游戏之优化篇
Nov 08 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
Dec 29 Javascript
jQuery实现友好的轮播图片特效
Jan 12 Javascript
javascript异步编程代码书写规范Promise学习笔记
Feb 11 Javascript
JavaScript 表单处理实现代码
Apr 13 Javascript
JS打字效果的动态菜单代码分享
Aug 21 Javascript
利用types增强vscode中js代码提示功能详解
Jul 07 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
vue-froala-wysiwyg 富文本编辑器功能
Sep 19 Javascript
uni-app使用countdown插件实现倒计时
Nov 01 Javascript
Vue获取微博授权URL代码实例
Nov 04 Javascript
vue+Element-ui实现登录注册表单
Nov 17 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
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
基于jquery的商品展示放大镜
2010/08/07 Javascript
图片Slider 带左右按钮的js示例
2013/08/30 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
2014/05/22 Javascript
JS实现控制表格内指定单元格内容对齐的方法
2015/03/30 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
详解python的几种标准输出重定向方式
2016/08/15 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
python多线程http压力测试脚本
2019/06/25 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
为数据库创建索引都需要注意些什么
2012/07/17 面试题
社区学习十八大感想
2014/01/22 职场文书
销售会计岗位职责
2014/03/15 职场文书
商场主管竞聘书
2014/03/31 职场文书
消防宣传口号
2014/06/16 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2014年团支部工作总结
2014/11/17 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers