CSS Modules中的 :global

embedded/2024/11/18 12:32:18/

最近写需求遇到如下代码,我们来分析一番:

.medicine-bot {:global(.cosd-site-vcard-card) {margin-top: -3px;}:global(.cosd-site-vcard-title-text) {font-size: var(--cos-text-headline-sm);}:global(.cosd-site-vcard-button) {background-color: #e8f3ff;  // --cos-color-bg-primary-lightcolor: var(--cos-blue-0);}
} 

这里的 :global 是 CSS Modules 的一种写法,表示在 CSS 模块化环境中,这段样式规则将被标记为全局作用域,而不是局部作用域。

CSS Modules 简介

CSS Modules 是一种 CSS 模块化方案,它默认将定义的样式作用域限制在当前模块中,以避免全局污染。这通常是通过给类名加上唯一标识符的方式实现的。例如:

css">.button {background-color: red;
}

在使用 CSS Modules 时,上述 .button 类名可能会被编译为类似于 .button__hash123 的格式,使其仅适用于当前组件。

:global 的作用

:global 的作用是声明一个样式是全局的,不受 CSS Modules 的作用域限制。例如:

css">:global(.cosd-site-vcard-button) {background-color: #e8f3ff;
}

这里的 .cosd-site-vcard-button 将被保留为原始类名(即不会被 CSS Modules 自动添加哈希前缀),并作用于整个应用中任何地方包含此类名的元素。

代码解读

在代码中,:global(.cosd-site-vcard-button) 表示:

  • 定义了一个全局样式规则,针对类名 .cosd-site-vcard-button
  • 样式定义在 .medicine-bot 内部,目的是可能与局部模块样式一起使用。

事实上,这段代码的目的是在覆盖第三方组件库的样式,添加 .medicine-bot ,相当于为:global(.cosd-site-vcard-button)加了一层作用域,防止污染全局样式

应用场景

这种写法通常用于以下场景:

  1. 需要覆盖第三方库样式
    如果 .cosd-site-vcard-button 是某个第三方库的类名,而无法更改 HTML 中的类名,使用 :global 可以直接定义全局样式。

  2. 明确全局样式需求
    当你希望某些样式明确是全局的而非局部时,可以使用 :global

注意事项

  1. 避免全局污染
    尽量少用 :global,以保持样式的模块化。如果必须使用,确保命名具有特异性,避免意外覆盖其他样式。

  2. 全局样式替代方案
    如果要定义一组全局样式,可以使用普通 CSS 文件(不通过 CSS Modules 加载),以专门管理全局样式。

读到这,不禁会想:

  • 这不就是vue的样式穿透嘛,在vue中我们为了更改组件库样式常常需要深度选择器
  • 这跟 :global有什么区别呢?

Vue 样式穿透

在 Vue 中,由于 scoped 的作用,组件内的样式默认会局限于当前组件的范围。为了影响子组件或第三方库的样式,可以使用 >>>/deep/(Vue 2.x)以及 ::v-deep(Vue 3.x)进行样式穿透。例如:

Vue 2.x 写法

<style scoped>
/deep/ .third-party-class {color: red;
}

或者:

<style scoped>
>>> .third-party-class {color: red;
}

Vue 3.x 写法

<style scoped>
::v-deep(.third-party-class) {color: red;
}

样式作用

这些穿透符号表示:尽管样式定义在当前组件内,但目标样式可以作用于子组件或 DOM 内的全局类。


CSS Modules 的 :global

在 CSS Modules 中,所有样式默认是局部的(scoped),和 Vue 的 scoped 类似。不过,:global 明确表示当前样式会被保留为全局作用域,例如:

css">:global(.third-party-class) {color: red;
}

这种写法可以在 CSS Modules 的上下文中影响整个应用中匹配的 DOM 元素。


两者的相似点

  1. 解决相同问题:两者都旨在解决样式作用域受限的问题,尤其是需要影响第三方库样式或者 DOM 外部的类时。
  2. 默认样式隔离:无论是 Vue 的 scoped 还是 CSS Modules,样式默认都是局部的,需要明确指定全局或穿透行为。

两者的差异点

特性Vue 样式穿透CSS Modules 的 :global
语法标记>>>, /deep/, ::v-deep:global
作用范围影响子组件或 Shadow DOM整个 DOM
使用上下文Vue 单文件组件 (SFC)CSS Modules 环境
应用范围Vue 特有各种 CSS Modules 框架
灵活性可组合局部样式穿透明确标记为全局

总结

Vue 的样式穿透(::v-deep 等)和 CSS Modules 的 :global 的确有类似的理念,但作用场景略有不同:

  • 如果你在 Vue 中,使用 ::v-deep 是推荐的方式。
  • 如果你在使用 CSS Modules,则通过 :global 实现样式全局化是合理的做法。

两者都提供了一种受控的方式来覆盖作用域外的样式。


http://www.ppmy.cn/embedded/138537.html

相关文章

快速上手:Docker 安装详细教程(适用于 Windows、macOS、Linux)

### 快速上手&#xff1a;Docker 安装详细教程&#xff08;适用于 Windows、macOS、Linux&#xff09; --- Docker 是一款开源容器化平台&#xff0c;广泛应用于开发、测试和部署。本文将为您提供分步骤的 Docker 安装教程&#xff0c;涵盖 Windows、macOS 和 Linux 系统。 …

JMeter与大模型融合应用之JMeter日志分析服务化实战应用

JMeter与大模型融合应用之JMeter日志分析服务化 引言 在当今的互联网时代,网站和应用程序的性能直接影响到用户的体验和业务的成功。为了保证系统的稳定性和高效性,性能测试成为了软件开发过程中的一个重要环节。在这其中,Apache JMeter作为一款开源的性能测试工具,凭借其…

ISP是什么?

isp全称为Internet Service Provider&#xff0c;即互联网服务提供商&#xff0c;是一种向用户提供互联网接入服务的公司或组织&#xff0c;它们提供的服务包括互联网接入、域名注册、网站托管等等。 ISP的应用场景非常广泛&#xff0c;几乎所有的互联网用户都需要通过ISP来接…

如何让手机ip变成动态

在数字化浪潮中&#xff0c;手机已成为我们日常生活中不可或缺的一部分。无论是浏览网页、使用社交媒体还是进行在线购物&#xff0c;手机都扮演着举足轻重的角色。然而&#xff0c;在享受网络带来的便利时&#xff0c;我们也需要关注网络安全和隐私保护。静态IP地址可能让手机…

【混沌测试】ChaosBlade:从安装到实战

ChaosBlade&#xff1a;从安装到实战 1.工具介绍2.安装步骤2.1 准备2.2 安装 3.实战3.1 模拟 CPU 负载实验3.2 模拟内存占用实验3.3 模拟磁盘 IO 负载实验 1.工具介绍 &#x1f680; GitHub 地址&#xff1a;https://github.com/chaosblade-io/chaosblade ChaosBlade 是阿里巴…

批量将当前目录里的所有pdf 转化为png 格式

下面是一个 Python 脚本&#xff0c;可以批量将当前目录中的所有 PDF 文件转换为 PNG 格式&#xff0c;每页 PDF 文件会生成对应的 PNG 图片&#xff1a; import os from pdf2image import convert_from_path# 指定当前目录 directory os.getcwd()# 获取当前目录中所有的 PDF…

游戏引擎学习第13天

视频参考:https://www.bilibili.com/video/BV1QQUaYMEEz/ 改代码的地方尽量一张图说清楚吧,懒得浪费时间 game.h #pragma once #include <cmath> #include <cstdint> #include <malloc.h>#define internal static // 用于定义内翻译单元内部函数 #…

【springboot】启动原理

目录 1. 说明2. 启动类与注解3. SpringApplication的构建与服务类型确定4. 启动流程5. 自动配置与Bean实例化6. 启动内嵌服务器 1. 说明 1.Spring Boot的启动原理是一个复杂而又精妙的流程&#xff0c;它涉及多个组件和步骤的协同工作。 2. 启动类与注解 1.Spring Boot应用通…