0

0

JavaScript动态操作CSS:正确访问CSSRule对象的样式属性

霞舞

霞舞

发布时间:2025-07-17 20:22:20

|

1020人浏览过

|

来源于php中文网

原创

javascript动态操作css:正确访问cssrule对象的样式属性

本教程详细介绍了在JavaScript中如何正确访问和操作通过document.styleSheets获取的CSS规则(CSSRule)的样式属性。核心在于,CSS属性值需通过CSSRule对象的style属性来访问,而非直接在CSSRule对象上查找。文章提供了示例代码,并强调了使用驼峰命名法访问CSS属性的最佳实践,帮助开发者有效进行动态样式调整。

理解CSS规则对象与样式访问

在Web开发中,我们经常需要通过JavaScript动态地读取或修改页面样式。document.styleSheets接口提供了访问文档中所有样式表的能力,每个样式表又包含一个cssRules集合,其中包含了所有的CSS规则(CSSRule对象)。然而,许多开发者在尝试访问这些CSSRule对象的具体样式属性时会遇到困惑,因为直接在CSSRule对象上通过属性名(例如rule['grid-row-start'])访问,往往会得到undefined。

这是因为CSSRule对象本身代表的是一个CSS规则的整体,比如一个选择器及其声明块,它并不直接存储具体的CSS属性值。这些属性值被封装在CSSRule对象的一个特定属性中。

考虑以下CSS规则:

.cartelle {
  grid-row-start: 42;
  grid-column-start: 69;
}

当尝试通过如下JavaScript代码访问其属性时,会发现newGridColumn和newGridRow均为undefined:

立即学习Java免费学习笔记(深入)”;

// 假设 .cartelle 规则位于第一个样式表
const styleSheet = Array.from(document.styleSheets[0].cssRules);
// 过滤出包含 "cartelle" 的规则
const myRules = styleSheet.filter(ruleset => ruleset.selectorText && ruleset.selectorText.includes("cartelle"));

// 错误示例:直接访问CSSRule对象上的属性
for (let i = 0; i < myRules.length; i++) {
  // 尝试直接访问 CSSRule 对象上的属性,这将返回 undefined
  let newGridColumn = myRules[i][`grid-row-start`];
  let newGridRow = myRules[i][`grid-column-start`];
  console.log(`错误示例 - newGridColumn: ${newGridColumn}, newGridRow: ${newGridRow}`);
}

这种行为是正确的,因为CSSRule对象的设计并不是直接暴露这些属性。

正确访问样式属性:style属性

要正确访问CSSRule对象中的具体CSS属性值,我们需要使用其style属性。CSSRule对象(特别是CSSStyleRule类型,即我们常见的选择器规则)包含一个名为style的属性,这个style属性是一个CSSStyleDeclaration对象。所有具体的CSS属性及其对应的值都存储在这个CSSStyleDeclaration对象中。

知鹿匠
知鹿匠

知鹿匠教师AI工具,新课标教案_AI课件PPT_作业批改

下载

CSSStyleDeclaration对象允许我们通过两种方式访问CSS属性:

  1. 中括号表示法 ([]): 适用于包含连字符(如grid-row-start)的CSS属性名。
  2. 点表示法 (.): 适用于驼峰命名法(如gridRowStart)的CSS属性名。

以下是正确访问cartelle类规则中grid-row-start和grid-column-start属性的示例:

// 假设 .cartelle 规则位于第一个样式表
const styleSheet = Array.from(document.styleSheets[0].cssRules);
// 过滤出包含 "cartelle" 的规则
const myRules = styleSheet.filter(ruleset => ruleset.selectorText && ruleset.selectorText.includes("cartelle"));

// 正确示例:通过 .style 属性访问CSS属性
for (const rule of myRules) {
    // 确保当前规则是 CSSStyleRule 类型,具有 style 属性
    if (rule instanceof CSSStyleRule) {
        // 使用中括号访问带连字符的属性名
        let newGridColumn = rule.style[`grid-row-start`];
        let newGridRow = rule.style[`grid-column-start`];
        console.log(`正确示例 (中括号) - Grid Row Start: ${newGridColumn}, Grid Column Start: ${newGridRow}`);

        // 也可以使用驼峰命名法访问属性
        // 注意:grid-row-start 对应 gridRowStart,grid-column-start 对应 gridColumnStart
        let newGridColumnCamel = rule.style.gridRowStart;
        let newGridRowCamel = rule.style.gridColumnStart;
        console.log(`正确示例 (驼峰命名) - Grid Row Start: ${newGridColumnCamel}, Grid Column Start: ${newGridRowCamel}`);
    }
}

通过上述代码,newGridColumn和newGridRow将正确地获取到CSS规则中定义的42和69。

注意事项与最佳实践

  1. 驼峰命名法 (Camel Case): 在JavaScript中,当通过点表示法访问CSS属性时,推荐使用驼峰命名法。例如,background-color应写成backgroundColor,font-size应写成fontSize。这使得代码更符合JavaScript的命名习惯,也更易读。
  2. CSSRule类型检查: 在实际应用中,document.styleSheets[0].cssRules可能包含多种类型的CSSRule(如@import规则、@media规则等)。只有CSSStyleRule(即普通的样式规则,如.class {})才拥有style属性。在遍历cssRules时,最好进行类型检查,例如if (rule instanceof CSSStyleRule),以避免访问不存在的属性而导致错误。
  3. 跨域限制 (CORS): 出于安全考虑,如果样式表来自不同的源(即跨域),JavaScript可能无法访问其cssRules的内容,会抛出SecurityError。这是浏览器为了防止恶意脚本读取用户敏感信息而设置的安全策略。
  4. 动态修改样式: 一旦你通过rule.style获取了CSSStyleDeclaration对象,你也可以通过修改它的属性来动态改变样式规则。例如:
    if (rule instanceof CSSStyleRule) {
        rule.style.gridRowStart = '100'; // 修改 grid-row-start 属性
        rule.style.backgroundColor = 'red'; // 添加或修改 background-color 属性
    }

    这种方式直接修改了样式表中的规则,会影响所有应用该规则的元素。

总结

在JavaScript中通过document.styleSheets操作CSS规则时,理解CSSRule对象与CSSStyleDeclaration对象之间的关系至关重要。核心要点是:CSS属性值并非直接存在于CSSRule对象上,而是通过其style属性(一个CSSStyleDeclaration对象)来访问。遵循这一原则,并结合驼峰命名法等最佳实践,开发者可以高效且准确地进行页面的动态样式操作。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

781

2023.08.22

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1159

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

215

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2051

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.12.06

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

5398

2023.07.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

CSS教程
CSS教程

共754课时 | 25.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号