在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中$之选择器用法介绍
Apr 05 Javascript
jquery创建并行对象或者合并对象的实现代码
Oct 10 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
Dec 27 Javascript
jquery对象和DOM对象的区别介绍
Aug 09 Javascript
JQuery下拉框应用示例介绍
Apr 23 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
Apr 23 Javascript
JavaScript实现继承的4种方法总结
Oct 16 Javascript
js实现a标签超链接提交form表单的方法
Jun 24 Javascript
分享一个原生的JavaScript拖动方法
Sep 25 Javascript
JS中事件冒泡和事件捕获介绍
Dec 13 Javascript
JavaScript多线程运行库Nexus.js详解
Dec 22 Javascript
关于uniApp editor微信滑动问题
Jan 15 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
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
js获取当前select 元素值的代码
2010/04/19 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
Django 前后台的数据传递的方法
2017/08/08 Python
pycharm设置鼠标悬停查看方法设置
2019/07/29 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
python中append函数用法讲解
2020/12/11 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
教师实习自我鉴定
2013/12/18 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
装修公司管理制度
2015/08/05 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers
图神经网络GNN算法
2022/05/11 Python