CSS Modules 用法教程

2024-05-09 18:48

本文主要是介绍CSS Modules 用法教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学过网页开发就会知道,CSS 不能算编程语言,只是网页样式的一种描述方法。

为了让 CSS 也能适用软件工程方法,程序员想了各种办法,让它变得像一门编程语言。从最早的Less、SASS,到后来的 PostCSS,再到最近的 CSS in JS,都是为了解决这个问题。

本文介绍的 CSS Modules 有所不同。它不是将 CSS 改造成编程语言,而是功能很单纯,只加入了局部作用域和模块依赖,这恰恰是网页组件最急需的功能。

因此,CSS Modules 很容易学,因为它的规则少,同时又非常有用,可以保证某个组件的样式,不会影响到其他组件。

零、示例库

我为这个教程写了一个示例库,包含六个Demo。通过它们,你可以轻松学会CSS Modules。

首先,克隆示例库。


$ git clone https://github.com/ruanyf/css-modules-demos.git

然后,安装依赖。


$ cd css-modules-demos
$ npm install

接着,就可以运行第一个示例了。


$ npm run demo01

打开浏览器,访问http://localhost:8080,查看结果。其他示例的运行方法类似。

一、局部作用域

CSS的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。

产生局部作用域的唯一方法,就是使用一个独一无二的class的名字,不会与其他选择器重名。这就是 CSS Modules 的做法。

下面是一个React组件App.js


import React from 'react';
import style from './App.css';export default () => {return (<h1 className={style.title}>Hello World</h1>);
};

上面代码中,我们将样式文件App.css输入到style对象,然后引用style.title代表一个class


.title {color: red;
}

构建工具会将类名style.title编译成一个哈希字符串。


<h1 class="_3zyde4l1yATCOkgn-DBWEL">Hello World
</h1>

App.css也会同时被编译。


._3zyde4l1yATCOkgn-DBWEL {color: red;
}

这样一来,这个类名就变成独一无二了,只对App组件有效。

CSS Modules 提供各种插件,支持不同的构建工具。本文使用的是 Webpack 的css-loader插件,因为它对 CSS Modules 的支持最好,而且很容易使用。顺便说一下,如果你想学 Webpack,可以阅读我的教程Webpack-Demos

下面是这个示例的webpack.config.js


module.exports = {entry: __dirname + '/index.js',output: {publicPath: '/',filename: './bundle.js'},module: {loaders: [{test: /\.jsx?$/,exclude: /node_modules/,loader: 'babel',query: {presets: ['es2015', 'stage-0', 'react']}},{test: /\.css$/,loader: "style-loader!css-loader?modules"},]}
};

上面代码中,关键的一行是style-loader!css-loader?modules,它在css-loader后面加了一个查询参数modules,表示打开 CSS Modules 功能。

现在,运行这个Demo。


$ npm run demo01

打开 http://localhost:8080 ,可以看到结果,h1标题显示为红色。

二、全局作用域

CSS Modules 允许使用:global(.className)的语法,声明一个全局规则。凡是这样声明的class,都不会被编译成哈希字符串。

App.css加入一个全局class


.title {color: red;
}:global(.title) {color: green;
}

App.js使用普通的class的写法,就会引用全局class


import React from 'react';
import styles from './App.css';export default () => {return (<h1 className="title">Hello World</h1>);
};

运行这个示例。


$ npm run demo02

打开 http://localhost:8080,应该会看到h1标题显示为绿色。

CSS Modules 还提供一种显式的局部作用域语法:local(.className),等同于.className,所以上面的App.css也可以写成下面这样。


:local(.title) {color: red;
}:global(.title) {color: green;
}

三、定制哈希类名

css-loader默认的哈希算法是[hash:base64],这会将.title编译成._3zyde4l1yATCOkgn-DBWEL这样的字符串。

webpack.config.js里面可以定制哈希字符串的格式。


module: {loaders: [// ...{test: /\.css$/,loader: "style-loader!css-loader?modules&localIdentName=[path][name]---[local]---[hash:base64:5]"},]
}

运行这个示例。


$ npm run demo03

你会发现.title被编译成了demo03-components-App---title---GpMto

四、 Class 的组合

在 CSS Modules 中,一个选择器可以继承另一个选择器的规则,这称为"组合"("composition")。

App.css中,让.title继承.className 。


.className {background-color: blue;
}.title {composes: className;color: red;
}

App.js不用修改。


import React from 'react';
import style from './App.css';export default () => {return (<h1 className={style.title}>Hello World</h1>);
};

运行这个示例。


$ npm run demo04

打开http://localhost:8080,会看到红色的h1在蓝色的背景上。

App.css编译成下面的代码。


._2DHwuiHWMnKTOYG45T0x34 {color: red;
}._10B-buq6_BEOTOl9urIjf8 {background-color: blue;
}

相应地, h1class也会编译成<h1 class="_2DHwuiHWMnKTOYG45T0x34 _10B-buq6_BEOTOl9urIjf8">

五、输入其他模块

选择器也可以继承其他CSS文件里面的规则。

another.css


.className {background-color: blue;
}

App.css可以继承another.css里面的规则。


.title {composes: className from './another.css';color: red;
}

运行这个示例。


$ npm run demo05

打开http://localhost:8080,会看到蓝色的背景上有一个红色的h1

六、输入变量

CSS Modules 支持使用变量,不过需要安装 PostCSS 和 postcss-modules-values。


$ npm install --save postcss-loader postcss-modules-values

postcss-loader加入webpack.config.js


var values = require('postcss-modules-values');module.exports = {entry: __dirname + '/index.js',output: {publicPath: '/',filename: './bundle.js'},module: {loaders: [{test: /\.jsx?$/,exclude: /node_modules/,loader: 'babel',query: {presets: ['es2015', 'stage-0', 'react']}},{test: /\.css$/,loader: "style-loader!css-loader?modules!postcss-loader"},]},postcss: [values]
};

接着,在colors.css里面定义变量。


@value blue: #0c77f8;
@value red: #ff0000;
@value green: #aaf200;

App.css可以引用这些变量。


@value colors: "./colors.css";
@value blue, red, green from colors;.title {color: red;background-color: blue;
}

运行这个示例。


$ npm run demo06

打开http://localhost:8080,会看到蓝色的背景上有一个红色的h1

 

这篇关于CSS Modules 用法教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974201

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN