你知道该如何使用 JS 创建 css 类样式吗?

news2024/12/26 11:17:50

前言

去年我为公司内部开发了一个浏览器插件,当时为了加快开发进度,我没有选用现成的插件框架,而是直接使用原生 JavaScript 搭配 Rollup 进行打包。由于这是一个浏览器插件,我不可避免地需要对页面元素进行操作,比如添加按钮、调整颜色等。刚开始,我采取的做法是直接向元素上添加style。这种方法一开始还算可行,但随着插件更新,组件增加,直接添加style变得更加繁琐且不优雅。

例如,手动添加样式的方法如下所示:

function addStyle(container, styles) {
	Object.keys(styles).forEach((key)=>{
		container.style[key] = styles[key]
	})
}

const divEle = document.createElement('div')
addStyle(divEle, {
	color: white;
	backgroundColor: #333;
})

这种情况下,我开始思考是否有更为合适的方法可以通过 JavaScript 动态创建类样式。当时由于时间紧迫以及不影响功能性,我没有再去深入研究。今天,我将分享一种优雅的方法——使用CSSStyleSheet添加css 类样式

传统添加类样式

通常,如果需要通过 JavaScript 动态添加新的类样式,我们会操作<style>元素。我们创建一个<style>元素,添加 css 内容,并将其添加到文档的<head>部分。以下为示例代码:

const style = document.createElement('style');
style.type = 'text/css';
style.innerText = '.new-class { color: red; }';
document.head.appendChild(style);

尽管这种方法可以向文档中添加类样式,但它有限制,比如不易进行类规则的新增、删除等操作。

CSSStyleSheet

CSSStyleSheet是用于表示文档内部或外部样式表的一个接口,它是浏览器提供的Web API的一部分。与传统的样式管理方式相比,CSSStyleSheet允许开发者以编程方式动态地操作样式,增加、修改或删除CSS规则。

基本用法

  1. 获取样式表对象
    • 对于内联样式,可以通过<style>元素的sheet属性直接获取。
    • 对于链接的样式表,可以通过document.styleSheets集合访问。
// 内联样式表
var styleElement = document.createElement('style');
document.head.appendChild(styleElement);
var styleSheet = styleElement.sheet;

// 链接样式表
var linkedStyleSheet = document.styleSheets[0]; // 例子中取第一个样式表
  1. 插入CSS规则
    • 使用insertRule方法插入新规则。
styleSheet.insertRule('.new-class { background: yellow; }', 0);
  1. 查找 CSS 规则
    • 遍历 styleSheet.cssRules 判断选择器名称是否一致,一致则返回索引。
const rules = styleSheet.cssRules;
let index;

for (let i = 0; i < rules.length; i++) {
  if (rules[i].selectorText === '.new-class') {
    index = i;
    break;
  }
}
  1. 删除CSS规则
    • 通过指定要删除的规则的索引,使用deleteRule方法。
styleSheet.deleteRule(0);
  1. 更新CSS规则
    • styleSheet.cssRules 可以获取指定索引下的样式,同时进行更新
const rules = styleSheet.cssRules;
rules[0].style.backgroundColor = 'blue'; // 将背景颜色改为蓝色

核心用法

  • 动态更新样式:无需删除<style>标签重新创建,直接使用insertRuledeleteRule动态修改。
  • 应用响应式风格:依据不同屏幕尺寸或设备特性动态添加或更新媒体查询规则。
  • 主题化定制:用户可以选择主题风格,通过替换或添加规则来改变网站的主题。

与传统方式的区别和优点:

相比操作 textContent 或 innerHTML

传统方法

通过获取<style>元素的textContentinnerHTML属性,然后追加或修改字符串来改变样式规则,这种方式简单直接。

CSSStyleSheet方法优势

  • 性能提升:操作CSSStyleSheet避免了直接解析字符串的步骤,减少了不必要的性能消耗,因为浏览器可以直接操作已解析的样式表对象。
  • 更高的效率:直接通过insertRuledeleteRule可以精确地添加或删除规则,无须重新解析整个样式字符串,这意味着操作可以更快完成。

细粒度控制

传统方法

通过字符串追加或修改时,难以定位具体的规则,尤其是在复杂的样式表中。

CSSStyleSheet方法优势

CSSStyleSheet允许开发者精确地操作具体的规则,不论是新增、修改或是删除,都可以直接指向目标规则进行操作。

错误处理

传统方法

在操作字符串时,错误可能导致整个样式字符串无效化,而且难以定位问题所在。

CSSStyleSheet方法优势

使用CSSStyleSheet时,由于每次操作的是具体的规则,出错时容易定位并处理问题,提升了代码的可靠性。

动态样式切换和管理

传统方法

需要替换或修改大量的字符串内容来实现风格切换,过程繁琐且易错。

CSSStyleSheet方法优势

CSSStyleSheet简化了样式的动态切换和管理流程,例如主题切换可以通过直接操作规则集合来轻松实现,大大降低了复杂性。

规则级别操作

传统方法

当为多个DOM元素应用样式时,需要遍历每个元素并修改其style属性,这在文档大型且元素多时效率较低。

CSSStyleSheet方法优势

CSSStyleSheet允许开发者在CSS规则级别进行操作,这意味着可以一次性修改多个元素的样式,无需遍历单个元素,极大地提升了修改大范围样式时的效率。

浏览器兼容性

当前大多数现代浏览器均支持使用CSSStyleSheet

结语

CSSStyleSheet 提供了一种强大的方法来以程序化的方式管理和操作网页的样式。无论是小规模的样式调整,还是大规模的样式系统设计,CSSStyleSheet 都是一个很有用的 API,可以帮助你高效的维护和更新你的网站风格。

参考资料

  • MDN CSSStyleSheet: https://developer.mozilla.org/docs/Web/API/CSSStyleSheet

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

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

相关文章

小太阳防倾倒开关原理

小太阳防倾倒开关是一种体积小巧、安装简便、灵敏度高的设备&#xff0c;其原理基于角度感应和光电技术。该开关具有精确的角度判断能力&#xff0c;无需机械接触&#xff0c;稳定性强&#xff0c;支持个性化角度设置&#xff0c;可根据需求进行水平、垂直或倒置安装。 在应用…

注意力机制(代码实现案例)

学习目标 了解什么是注意力计算规则以及常见的计算规则.了解什么是注意力机制及其作用.掌握注意力机制的实现步骤. 1 注意力机制介绍 1.1 注意力概念 我们观察事物时&#xff0c;之所以能够快速判断一种事物(当然允许判断是错误的), 是因为我们大脑能够很快把注意力放在事物…

STM32(16)使用串口向电脑发送数据

发送字节 发送数组 发送字符和字符串 字符&#xff1a; 字符串&#xff1a; 字符串在电脑中以字符数组的形式存储

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

《互联网的世界》第四讲-拥塞控制与编码

需要澄清的一个误区是&#xff0c;拥塞绝不是发送的数据量太大导致&#xff0c;而是数据在极短的时间段内到达了同一个地方以至于超过了网络处理容量导致&#xff0c;拥塞的成因一定要考虑时间因素。换句话说&#xff0c;拥塞由大突发导致。 只要 pacing&#xff0c;再多的数据…

MongoDB开启事务

MongoDB开启事务 配置单节点。到路径C:\Program Files\MongoDB\Server\4.0\bin 使用记事本以管理员权限打开文件mongod.cfg添加如下配置&#xff1a; replication:replSetName: rs02. 重启MongoDB服务 3. 重启后执行命令 rs.initiate()

Python采集学习笔记-request的get请求和post请求

使用http://httpbin.org测试,一个简单的 HTTP 请求和响应服务。(需联网)1.导入requests包 import requests 2.测试get请求 url http://httpbin.org/get par {key1: value1, key2: value2} # 不带参数请求 r1 requests.get(url) # 带参数请求 r2 requests.get(url, paramspa…

数据库管理-第158期 Oracle Vector DB AI-09(20240304)

数据库管理158期 2024-03-04 数据库管理-第158期 Oracle Vector DB & AI-09&#xff08;20240304&#xff09;1 创建示例表2 添加过滤条件的向量近似查询示例1示例2示例3示例4示例5示例6示例7 总结 数据库管理-第158期 Oracle Vector DB & AI-09&#xff08;20240304&a…

怎么采集GBK或GB2312等特殊字符编码的网站数据

如果要采集的网站是GBK或GB2312等特殊字符编码&#xff0c;采集结果可能是一堆看不懂的文字或乱码&#xff0c;无法使用。 通常网页文章采集工具有字符编码选项&#xff0c;默认是UTF-8&#xff08;现在大部分网站都是&#xff09;&#xff0c;改选为GBK或GB2312字符编码即可&…

无人机/飞控--ArduPilot、PX4学习历程记录(1)

本篇博客用来记录个人学习记录&#xff0c;存放各种文章链接、视频链接、学习历程、实验过程和结果等等.... 最近在整无人机项目&#xff0c;接触一下从来没有接触过的飞控...(听着就头晕)&#xff0c;本人纯小白。 目录 PX4、Pixhawk、APM、ArduPilot、Dronecode Dronekit…

【ArcPy】游标访问几何数据

访问质心坐标相关数据 结果展示 代码 import arcpy shppath r"C:\Users\admin\Desktop\excelfile\a2.shp" with arcpy.da.SearchCursor(shppath, ["SHAPE","SHAPEXY","SHAPETRUECENTROID","SHAPEX","SHAPEY",&q…

【Mybatis】批量映射优化 分页插件PageHelper 逆向工程插件MybatisX

文章目录 一、Mapper批量映射优化二、插件和分页插件PageHelper2.1 插件机制和PageHelper插件介绍2.2 PageHelper插件使用 三、逆向工程和MybatisX插件3.1 ORM思维介绍3.2 逆向工程3.3 逆向工程插件MyBatisX使用 总结 一、Mapper批量映射优化 需求: Mapper 配置文件很多时&…

高精准无人机激光雷达标定板

无人机激光雷达标定板是一种用于校准无人机激光雷达系统的工具&#xff0c;它可以帮助无人机获取更准确、更可靠的数据&#xff0c;从而提高无人机的导航精度和自主控制能力。本文将从无人机激光雷达标定板的基本概念、作用、应用领域、市场现状和发展趋势等方面进行介绍。 一…

LeetCode 1976.到达目的地的方案数:单源最短路的Dijkstra算法

【LetMeFly】1976.到达目的地的方案数&#xff1a;单源最短路的Dijkstra算法 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/ 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff…

【音视频开发好书推荐1】《RTC程序设计:实时音视频权威指南》

1、WebRTC概述 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个由Google发起的实时音视频通讯C开源库&#xff0c;其提供了音视频采集、编码、网络传输&#xff0c;解码显示等一整套音视频解决方案&#xff0c;我们可以通过该开源库快速地构建出一个音视频通…

12-Linux部署Zookeeper集群

Linux部署Zookeeper集群 简介 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。…

设计模式:六大原则 ③

一、六大设计原则 &#x1f360; 开闭原则 (Open Close Principle) &#x1f48c; 对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#xff0c;易…

4步教你完成一篇让人挑不出毛病的产品需求文档!

“需求”这个词是产品经理工作中的常客&#xff0c;产品需求文档也贯穿于整个产品经理的日常工作中&#xff0c;本周小编将通过什么是产品需求文档&#xff0c;产品需求文档的作用、如何写好产品需求文档等方面分享如何写出一篇让你挑不出毛病的PRD&#xff0c;让需求文档助力产…

光分路器概述

光分路器主要有两种 技术&#xff1a; ㈠平面波导型光分路器(PLC Splitter) PLC分路器的封装是指将平面波导分路器上的各个导光通路&#xff08;即波导通路&#xff09;与光纤阵列中的光纤一一对准&#xff0c;然后用特定的胶&#xff08;如环氧胶&#xff09;将其粘合在一起…

计算机系统中的文件系统梳理

看之前&#xff0c;大家动动小手点个关注&#xff0c;谢谢。 原文地址&#xff1a;计算机系统中的文件系统梳理 - Pleasure的博客 下面是正文内容&#xff1a; 前言 这是一篇笔记 我之所以要选择这个话题&#xff0c;是因为前几天在对TF卡进行格式化的时候遇到了问题。有些专…