CSS Module 常用笔记

Date: January 30, 2025

CSS

先介绍下普通 CSS,再简明介绍下 css module 的使用

普通 CSS

内联 style

定义:

  • 内联 style 是通过在元素的 style 属性中直接设置 CSS 样式。
  • 这种方式允许我们直接在 JSX 中为组件或元素添加样式。

写法:

<div style={{ color: 'red', fontSize: '20px' }}>This is a red text with font size 20px.
</div>

className

定义:

  • className 是通过 CSS 类为元素设置样式。在 React 中,使用 className 替代传统的 class 属性。
  • className 通过引用外部样式表来定义样式,适合复用和组织大规模的样式。

写法:

<div className="red-text large-text">This is a styled text.
</div>


CSS Module

概念:

CSS Module 是一种局部作用域的CSS方案,它通过将CSS类名局部化,避免了全局命名冲突的问题。每个CSS类都默认是局部的,只有在特定的组件中才有效。

特点:

  1. 局部作用域:每个CSS类都只作用于当前组件,避免了全局样式污染。
  2. 自动命名:CSS类名会自动生成一个唯一的标识符,以确保类名不重复。
  3. 与组件绑定:CSS模块与React(或其他框架)中的组件紧密绑定,每个组件都有独立的样式。

工作原理:

CSS文件中的类名会被编译器处理成唯一的类名(例如:Button__primary__1k2jd),这个类名与组件的作用域绑定,避免了全局命名冲突。

使用方式:

  1. 创建一个 .module.css 的CSS文件:

    /* Button.module.css */
    .primary {color: red;background-color: blue;
    }
  2. 在组件中导入并使用:

    import styles from './Button.module.css';function Button() {return <button className={styles.primary}>Click me</button>;
    }
  3. 自动生成的类名styles.primary 实际上会被编译成一个唯一的类名,如 Button_primary__1k2jd

特点:

优点:

  • 避免类名冲突:每个组件的样式是局部的,不会与其他组件的样式发生冲突。
  • 模块化管理:样式与组件紧密绑定,便于管理和维护。

缺点:

  • 不能全局复用:样式是局部的,如果需要全局样式,则需要使用全局CSS或CSS变量。
  • 需要构建工具支持:如Webpack配置支持CSS Module(通过 css-loader 等)。

安装与配置

webpack配置 css-module

如果你正在使用 Webpack,需要安装 css-loaderstyle-loader

npm install css-loader style-loader --save-dev

webpack.config.js 中配置 CSS Module:

module.exports = {module: {rules: [{test: /\\.module\\.css$/,  // 只针对带有 .module.css 的文件use: ['style-loader', 'css-loader?modules']  // 启用 CSS Module}]}
};

创建 CSS Module 文件

创建一个带有 .module.css 扩展名的 CSS 文件。注意,.module.css 表示这个文件是一个 CSS Module 文件。

/* Button.module.css */
.button {background-color: blue;color: white;padding: 10px;border-radius: 5px;
}.buttonHover {background-color: darkblue;
}

具体使用

导入和使用 CSS Module:

在组件中导入 CSS Module 文件,并应用类名。CSS类名将会被本地化,避免全局污染。

// Button.jsx
import React from 'react';
import styles from './Button.module.css';  // 导入CSS Moduleconst Button = () => {return (<button className={styles.button}>Click Me</button>  // 使用样式);
};export default Button;

生成的类名:

CSS Module 在编译时会为每个类名生成唯一的哈希值。例如,button 类可能会变成 Button_button__1a2b3,从而保证不会与其他组件的样式产生冲突。

<button className="Button_button__1a2b3">Click Me</button>

高级用法

动态类名

CSS Module 可以和 JavaScript 动态交互,允许根据状态或条件动态设置类名。

import React, { useState } from 'react';
import styles from './Button.module.css';const Button = () => {const [isHovered, setIsHovered] = useState(false);return (<buttonclassName={isHovered ? styles.buttonHover : styles.button}onMouseEnter={() => setIsHovered(true)}onMouseLeave={() => setIsHovered(false)}>Hover Over Me</button>);
};export default Button;

合并多个类名:

有时你可能需要将多个类名结合起来,可以使用 JavaScript 的 classnames 库(或者其他库)来处理这种情况。

npm install classnames
import React from 'react';
import classNames from 'classnames';
import styles from './Button.module.css';const Button = ({ isPrimary, isDisabled }) => {const buttonClass = classNames(styles.button, {[styles.primary]: isPrimary,[styles.disabled]: isDisabled,});return <button className={buttonClass}>Click Me</button>;
};export default Button;

样式组合:

CSS Module 中可以引入其他 CSS 文件,避免代码重复。在 CSS Module 中也可以使用 composes 关键字来合并其他类。

/* BaseButton.module.css */
.baseButton {padding: 10px;font-size: 16px;border: none;
}.primary {composes: baseButton from './BaseButton.module.css';background-color: blue;color: white;
}.secondary {composes: baseButton from './BaseButton.module.css';background-color: gray;color: black;
}

处理全局样式

CSS Module 默认样式是局部的,但有时你可能希望某些样式是全局的,可以使用 :global 来标记全局样式。

/* Global.module.css */
:global .global-class {color: red;
}
// App.jsx
import './Global.module.css';function App() {return <div className="global-class">This is a global style</div>;
}


总结:

  • CSS Module 通过将每个 CSS 类的作用域限制在组件内部,避免了全局样式的污染。
  • 它支持动态类名、样式组合以及通过 composes 关键字复用样式。
  • 适用于大型应用中的样式管理,尤其在组件化的开发中能大大提高维护性和可扩展性。
  • 对于全局样式需求,可以通过 :global 来解决。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 中的堆

文章目录 小根堆的特点Python 中的 heapq 模块1. heapq.heappush(heap, item)2. heapq.heappop(heap)3. heapq.heapify(x)4. heapq.heappushpop(heap, item)5. heapq.heapreplace(heap, item)6. heapq.nsmallest(n, iterable)7. heapq.nlargest(n, iterable) 小根堆的应用场景示…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开&#xff0c;我们尝试自己创建一个数据生成器&#xff0c;用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

【RocketMQ】RocketMq之IndexFile深入研究

一&#xff1a;RocketMq 整体文件存储介绍 存储⽂件主要分为三个部分&#xff1a; CommitLog&#xff1a;存储消息的元数据。所有消息都会顺序存⼊到CommitLog⽂件当中。CommitLog由多个⽂件组成&#xff0c;每个⽂件固定⼤⼩1G。以第⼀条消 息的偏移量为⽂件名。 ConsumerQue…

注解与反射基础

注解 概述 注解&#xff08;Annotation&#xff09;&#xff0c;从jdk5.0引入。 作用 不是程序本身&#xff0c;可以对程序作出解释&#xff08;这一点和注释没什么区别&#xff09;可以被其他程序读取 格式 注释是以“注释名”在代码中存在的&#xff0c;还可以添加一些…

WebSocket——环境搭建与多环境配置

一、前言&#xff1a;为什么要使用多环境配置&#xff1f; 在开发过程中&#xff0c;我们通常会遇到多个不同的环境&#xff0c;比如开发环境&#xff08;Dev&#xff09;、测试环境&#xff08;Test&#xff09;、生产环境&#xff08;Prod&#xff09;等。每个环境的配置和需…

SliverAppBar的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了SliverGrid组件相关的内容&#xff0c;本章回中将介绍SliverAppBar组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的SliverAppBar和普通的AppBar类似&#xff0c;它们的…

BFS(广度优先搜索)——搜索算法

BFS&#xff0c;也就是广度&#xff08;宽度&#xff09;优先搜索&#xff0c;二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS&#xff08;深度优先搜索&#xff09;。从字面意思也很好理解&#xff0c;DFS就是一条路走到黑&#xff0c;BFS则是一层一层地展开。…

【Java基础-42.3】Java 基本数据类型与字符串之间的转换:深入理解数据类型的转换方法

在 Java 开发中&#xff0c;基本数据类型与字符串之间的转换是非常常见的操作。无论是从用户输入中读取数据&#xff0c;还是将数据输出到日志或界面&#xff0c;都需要进行数据类型与字符串之间的转换。本文将深入探讨 Java 中基本数据类型与字符串之间的转换方法&#xff0c;…

数据库 - Sqlserver - SQLEXPRESS、由Windows认证改为SQL Server Express认证进行连接 (sa登录)

本文讲SqlServer Express版本在登录的时候&#xff0c; 如何由Windows认证&#xff0c;修改为Sql Server Express认证。 目录 1&#xff0c;SqlServer Express的Windows认证 2&#xff0c;修改为混合认证 3&#xff0c;启用sa 用户 4&#xff0c;用sa 用户登录 下面是详细…

机器学习--学习计划

3周机器学习速成计划 基于「28原则」&#xff0c;聚焦机器学习20%的核心概念&#xff0c;覆盖80%的常见应用场景。计划分为 理论学习 项目实战&#xff0c;每周学习后通过5个递进项目巩固知识。 &#x1f4c5; 第1周&#xff1a;数据与监督学习基础 学习目标&#xff1a;掌握…

CNN的各种知识点(四): 非极大值抑制(Non-Maximum Suppression, NMS)

非极大值抑制&#xff08;Non-Maximum Suppression, NMS&#xff09; 1. 非极大值抑制&#xff08;Non-Maximum Suppression, NMS&#xff09;概念&#xff1a;算法步骤&#xff1a;具体例子&#xff1a;PyTorch实现&#xff1a; 总结&#xff1a; 1. 非极大值抑制&#xff08;…

GWO优化SVM回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;&#xff0c;是由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出的群智能优化算法。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;核心思想是对灰狼社会的结构与行为模式进行模仿。 …

elasticsearch8.15 高可用集群搭建(含认证Kibana)

文章目录 1.资源配置2.系统参数优化3.JDK17安装4.下载&安装ES 8.155.生成ES的证书(用于ES节点之间进行安全数据传输)6.修改ES 相关配置文件7.创建es用户并启动8.配置ES的账号和密码(用于ES服务端和客户端)9.下载和安装Kibana10.编辑Kibana配置文件11.启动Kiabana12.访问Kia…

地址查询API接口:高效查询地址信息,提升数据处理效率

地址查询各省市区API接口 地址查询是我们日常生活中经常遇到的一个需求&#xff0c;无论是在物流配送、地图导航还是社交网络等应用中&#xff0c;都需要通过地址来获取地理位置信息。为了满足这个需求&#xff0c;我们可以使用地址查询API接口来高效查询地址信息&#xff0c;提…

3、C#基于.net framework的应用开发实战编程 - 实现(三、三) - 编程手把手系列文章...

三、 实现&#xff1b; 三&#xff0e;三、编写应用程序&#xff1b; 此文主要是实现应用的主要编码工作。 1、 分层&#xff1b; 此例子主要分为UI、Helper、DAL等层。UI负责便签的界面显示&#xff1b;Helper主要是链接UI和数据库操作的中间层&#xff1b;DAL为对数据库的操…

leetcode解题思路分析(一百六十三)1409 - 1415 题

查询带键的排列 给定一个正整数数组 queries &#xff0c;其取值范围在 1 到 m 之间。 请你根据以下规则按顺序处理所有 queries[i]&#xff08;从 i0 到 iqueries.length-1&#xff09;&#xff1a; 首先&#xff0c;你有一个排列 P[1,2,3,…,m]。 对于当前的 i &#xff0c;找…

【自学笔记】GitHub的重点知识点-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 GitHub使用指南详细知识点一、GitHub基础与账户管理1. GitHub简介2. 创建与管理GitHub账户3. 创建与配置仓库&#xff08;Repository&#xff09; 二、Git基础与Git…

vscode软件操作界面UI布局@各个功能区域划分及其名称称呼

文章目录 abstract检查用户界面的主要区域官方文档关于UI的介绍 abstract 检查 Visual Studio Code 用户界面 - Training | Microsoft Learn 本质上&#xff0c;Visual Studio Code 是一个代码编辑器&#xff0c;其用户界面和布局与许多其他代码编辑器相似。 界面左侧是用于访…

类和对象(下)——类型转化 static成员 内部类 匿名对象 拷贝对象优化

一、类型转换 1.1 类型转化特点 C支持内置类型隐式类型转换为类类型对象&#xff0c;需要有相关内置类型为参数的构造函数。构造函数前面加explicit就不再支持隐式类型转换。类类型的对象之间也可以隐式转换&#xff0c;需要相应的构造函数支持 内置类型转换为类类型对象&#…

基于场景图的零样本目标导航

参考论文&#xff1a;SG-Nav&#xff1a;Online 3D Scene Graph Prompting for LLM-based Zero-shot Object Navigation 0 前言 基于现成的视觉基础模型VFMs和大语言模型LLM构建了无需任何训练的零样本物体巡航框架SG-Nav。 通过VLMs将机器人对场景的观测构建为在线的3D场景图…