CSS Module 常用笔记

server/2025/2/4 19:19:13/

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文件:

    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 文件。

css">/* 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 关键字来合并其他类。

css">/* 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 来标记全局样式。

css">/* 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.ppmy.cn/server/164956.html

相关文章

二叉树——102,107,199,637

前中后序遍历是二叉树的深度遍历&#xff0c;而层序遍历则是二叉树的广度遍历。顾名思义&#xff0c;二叉树的层序遍历就是一层一层遍历二叉树的每一个节点。今天的几道题都是关于二叉树的层序遍历的&#xff0c;大体思路都非常相似&#xff0c;都是在层序遍历的基础上实现了有…

搜索与图论复习1

1深度优先遍历DFS 2宽度优先遍历BFS 3树与图的存储 4树与图的深度优先遍历 5树与图的宽度优先遍历 6拓扑排序 1DFS&#xff1a; #include<bits/stdc.h> using namespace std; const int N10; int n; int path[N]; bool st[N]; void dfs(int u){if(nu){for(int i0;…

什么是门控循环单元?

一、概念 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;由Cho等人在2014年提出。GRU是LSTM的简化版本&#xff0c;通过减少门的数量和简化结构&#xff0c;保留了LSTM的长时间依赖…

C语言--分支循环实践:猜数字游戏

在这次的实践项目中&#xff0c;需要编写一个可以在控制台运行的猜数字的游戏。 1. 游戏要求 电脑自动生成1~100的随机数玩家输入要猜的数字&#xff0c;猜数字的过程中根据猜的数字的大小给出猜大了猜小了的反馈&#xff0c;直到猜对游戏结束。 2. 游戏设计思路 2.1 游戏界…

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码 LeetCode必刷100题&#xff1a;一份来自面试官的算法地图&#xff08;题解持续更新中&#xff09;-CSDN博客 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 面试经典 150 题 - 学习计…

2025年2月2日(tcp3次握手4次挥手)

TCP&#xff08;三次握手和四次挥手&#xff09;是建立和关闭网络连接的标准过程&#xff0c;确保数据在传输过程中可靠无误。下面是详细解释&#xff1a; 1. 三次握手&#xff08;TCP连接建立过程&#xff09; 三次握手是为了在客户端和服务器之间建立一个可靠的连接&#x…

html中的列表元素

列表元素分为无序列表ul&#xff08;unordered list&#xff09;、有序列表和定义列表 用ul定义无序列表&#xff0c;用li定义列表项。ul标签支持全局标准属性和全局事件属性 无序列表的特点&#xff1a; 列表项目作为一个整体&#xff0c;与上下文段落各有一行空白&#xff…

python渗透开发 高阶段位之 waf绕过sql注入 sqlmap --temper模块开发以及框架逻辑修改 以及解释Temper是什么?

目录 temper 解释: 这种操作常见于以下场景&#xff1a; 常见用法: tamper脚本位置 SQLMAP之temper二次开发说明 如何开发 temper 中的 Python 文件 基本的 temper Python 脚本结构 代码结构: 解释: 二次开发Temper中 base64encode.py 脚本 源码 编码前解释 二次框…