CSS Module 常用笔记

news2025/2/4 7:58:14

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 Module

const 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 (
    <button
      className={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.coloradmin.cn/o/2291689.html

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

相关文章

JDK-1.8.0_432安装(CentOS7)

目录 1、卸载系统自带JDK 2、下载安装包并解压 3、赋予可执行权限 4、设置环境变量 5、刷新环境变量 6、查看JDK版本 1、卸载系统自带JDK # 查询出自带的jdk rpm -qa | grep jdk rpm -qa | grep java # 将上述命令列出的包依次删除 rpm -e --nodeps xxxxxxx 2、下载…

【Linux】24.进程信号(1)

文章目录 1. 信号入门1.1 进程与信号的相关知识1.2 技术应用角度的信号1.3 注意1.4 信号概念1.5 信号处理常见方式概览 2. 产生信号2.1 通过终端按键产生信号2.2 调用系统函数向进程发信号2.3 由软件条件产生信号2.4 硬件异常产生信号2.5 信号保存 3. 阻塞信号3.1 信号其他相关…

股票入门知识

股票入门&#xff08;更适合中国宝宝体制&#xff09; 股市基础知识 本文介绍了股票的基础知识&#xff0c;股票的分类&#xff0c;各板块发行上市条件&#xff0c;股票代码&#xff0c;交易时间&#xff0c;交易规则&#xff0c;炒股术语&#xff0c;影响股价的因素&#xf…

用Python实现K均值聚类算法

在数据挖掘和机器学习领域&#xff0c;聚类是一种常见的无监督学习方法&#xff0c;用于将数据点划分为不同的组或簇。K均值聚类算法是其中一种简单而有效的聚类算法。今天&#xff0c;我将通过一个具体的Python代码示例&#xff0c;向大家展示如何实现K均值聚类算法&#xff0…

Flask代码审计实战

文章目录 Flask代码审计SQL注入命令/代码执行反序列化文件操作XXESSRFXSS其他 审计实战后记reference Flask代码审计 SQL注入 1、正确的使用直白一点就是&#xff1a;使用”逗号”&#xff0c;而不是”百分号” stmt "SELECT * FROM table WHERE id?" connectio…

Unity 2D实战小游戏开发跳跳鸟 - 跳跳鸟碰撞障碍物逻辑

在有了之前创建的可移动障碍物之后,就可以开始进行跳跳鸟碰撞到障碍物后死亡的逻辑,死亡后会产生一个对应的效果。 跳跳鸟碰撞逻辑 创建Obstacle Tag 首先跳跳鸟在碰撞到障碍物时,我们需要判定碰撞到的是障碍物,可以给障碍物的Prefab预制体添加一个Tag为Obstacle,添加步…

【玩转 Postman 接口测试与开发2_015】第12章:模拟服务器(Mock servers)在 Postman 中的创建与用法(含完整实测效果图)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十二章 模拟服务器&#xff08;Mock servers&#xff09;在 Postman 中的创建与用法1 模拟服务器的概念2 模拟服务器的创建2.1 开启侧边栏2.2 模拟服务器的两种创建方式2.3 私有模拟器的 API 秘钥的用法…

mysql操作语句与事务

数据库设计范式 数据库设计的三大范式 ‌第一范式&#xff08;1NF&#xff09;‌&#xff1a;要求数据库表的每一列都是不可分割的原子数据项&#xff0c;即列中的每个值都应该是单一的、不可分割的实体。例如&#xff0c;如果一个表中的“地址”列包含了省、市、区等多个信息…

基于SpringBoot电脑组装系统平台系统功能实现五

一、前言介绍&#xff1a; 1.1 项目摘要 随着科技的进步&#xff0c;计算机硬件技术日新月异&#xff0c;包括处理器&#xff08;CPU&#xff09;、主板、内存、显卡等关键部件的性能不断提升&#xff0c;为电脑组装提供了更多的选择和可能性。不同的硬件组合可以构建出不同类…

【智力测试——二分、前缀和、乘法逆元、组合计数】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int mod 1e9 7; const int N 1e5 10; int r[N], c[N], f[2 * N]; int nr[N], nc[N], nn, nm; int cntr[N], cntc[N]; int n, m, t;void init(int n) {f[0] f[1] 1;for (int i …

玉米苗和杂草识别分割数据集labelme格式1997张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;1997 标注数量(json文件个数)&#xff1a;1997 标注类别数&#xff1a;3 标注类别名称:["corn","weed","Bean…

string例题

一、字符串最后一个单词长度 题目解析&#xff1a;由题输入一段字符串或一句话找最后一个单词的长度&#xff0c;也就是找最后一个空格后的单词长度。1.既然有空格那用我们常规的cin就不行了&#xff0c;我们这里使用getline,2.读取空格既然是最后一个空格后的单词&#xff0c;…

设计模式 - 行为模式_Template Method Pattern模板方法模式在数据处理中的应用

文章目录 概述1. 核心思想2. 结构3. 示例代码4. 优点5. 缺点6. 适用场景7. 案例&#xff1a;模板方法模式在数据处理中的应用案例背景UML搭建抽象基类 - 数据处理的 “总指挥”子类定制 - 适配不同供应商供应商 A 的数据处理器供应商 B 的数据处理器 在业务代码中整合运用 8. 总…

基于脉冲响应不变法的IIR滤波器设计与MATLAB实现

一、设计原理 脉冲响应不变法是一种将模拟滤波器转换为数字滤波器的经典方法。其核心思想是通过对模拟滤波器的冲激响应进行等间隔采样来获得数字滤波器的单位脉冲响应。 设计步骤&#xff1a; 确定数字滤波器性能指标 将数字指标转换为等效的模拟滤波器指标 设计对应的模拟…

RabbitMQ快速上手及入门

概念 概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchang…

自动化构建-make/Makefile 【Linux基础开发工具】

文章目录 一、背景二、Makefile编译过程三、变量四、变量赋值1、""是最普通的等号2、“:” 表示直接赋值3、“?” 表示如果该变量没有被赋值&#xff0c;4、""和写代码是一样的&#xff0c; 五、预定义变量六、函数**通配符** 七、伪目标 .PHONY八、其他常…

响应式编程与协程

响应式编程与协程的比较 响应式编程的弊端虚拟线程Java线程内核线程的局限性传统线程池的demo虚拟线程的demo 响应式编程的弊端 前面用了几篇文章介绍了响应式编程&#xff0c;它更多的使用少量线程实现线程间解耦和异步的作用&#xff0c;如线程的Reactor模型&#xff0c;主要…

智能小区物业管理系统推动数字化转型与提升用户居住体验

内容概要 在当今快速发展的社会中&#xff0c;智能小区物业管理系统的出现正在改变传统的物业管理方式。这种系统不仅仅是一种工具&#xff0c;更是一种推动数字化转型的重要力量。它通过高效的技术手段&#xff0c;将物业管理与用户居住体验紧密结合&#xff0c;无疑为社区带…

从Proxmox VE开始:安装与配置指南

前言 Proxmox Virtual Environment (Proxmox VE) 是一个开源的虚拟化平台&#xff0c;基于Debian Linux&#xff0c;支持KVM虚拟机和LXC容器。它提供了一个强大的Web管理界面&#xff0c;方便用户管理虚拟机、存储、网络等资源。Proxmox VE广泛应用于企业级虚拟化、云计算和开…

【C++】B2115 密码翻译

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目解析&#x1f4af;1. 老师的做法代码实现&#xff1a;思路解析&#xff1a; &#x1f4af;2. 我的做法代码实现&#xff1a;思路分析&#xff1a; &#x1f4af;3. 老师…