JavaScript操作DOM样式的各种方法小结

 更新时间:2025年06月23日 09:12:32   作者:AllenBright  
在现代Web开发中,动态操作DOM元素的样式是创建交互式用户体验的核心技能之一,无论是响应用户操作、实现动画效果,还是根据应用状态改变界面外观,都离不开对DOM样式的精确控制,本文将全面介绍JavaScript中操作DOM样式的各种方法,从基础概念到高级技巧

1. DOM样式操作基础

1.1 style属性:直接操作内联样式

最直接的样式操作方式是通过元素的style属性:

const element = document.getElementById('myElement');

// 设置单个样式属性
element.style.color = 'blue';
element.style.backgroundColor = '#f0f0f0';

// 使用驼峰式命名代替CSS中的连字符
element.style.fontSize = '16px';
element.style.marginTop = '10px';

注意事项

  • 属性名使用驼峰命名法(如backgroundColor对应CSS的background-color
  • 值必须是字符串,且通常需要包含单位(如px%等)
  • 设置的值会变成内联样式,优先级高于外部和内部样式表中的规则

1.2 批量设置样式:cssText与setAttribute

当需要一次性设置多个样式属性时:

// 使用cssText
element.style.cssText = 'color: red; background: yellow; font-size: 14px;';

// 使用setAttribute
element.setAttribute('style', 'color: red; background: yellow;');

区别

  • cssText会覆盖现有内联样式
  • setAttribute会完全替换整个style属性

1.3 获取样式信息

获取样式时需要注意,style属性只能获取内联样式:

// 只能获取通过style属性设置的内联样式
console.log(element.style.color); // 如果颜色不是内联样式,则返回空字符串

2. 获取计算样式

要获取元素实际渲染的样式(包括来自样式表的样式),需要使用getComputedStyle

const computedStyle = window.getComputedStyle(element);

console.log(computedStyle.color); // 获取计算后的颜色值
console.log(computedStyle.getPropertyValue('color')); // 另一种获取方式

重要特性

  • 返回的值是只读的
  • 返回的计算值通常是绝对单位(如颜色转为rgb/rgba,长度转为px等)
  • 可以获取所有CSS属性,不仅是显式设置的

3. classList API:更优雅地操作类名

相比直接操作className属性,classList提供了更强大的方法:

const element = document.getElementById('myElement');

// 添加类
element.classList.add('active', 'highlight');

// 移除类
element.classList.remove('active');

// 切换类(存在则移除,不存在则添加)
element.classList.toggle('active');

// 检查是否包含某个类
if (element.classList.contains('active')) {
  // do something
}

// 替换类
element.classList.replace('old-class', 'new-class');

优势

  • 避免手动拼接字符串操作className
  • 提供更语义化的方法
  • 自动处理类名之间的空格

4. CSS自定义属性(变量)操作

现代CSS支持自定义属性(变量),也可以通过JavaScript操作:

/* CSS中定义 */
:root {
  --main-color: #4CAF50;
  --default-padding: 15px;
}
// 获取根元素
const root = document.documentElement;

// 获取变量值
const mainColor = getComputedStyle(root).getPropertyValue('--main-color');

// 设置变量值
root.style.setProperty('--main-color', '#3e8e41');

// 在特定元素上设置
element.style.setProperty('--local-size', '20px');

应用场景

  • 主题切换
  • 动态调整设计系统参数
  • 响应式布局调整

5. 样式操作性能优化

不当的样式操作可能导致页面重排(reflow)和重绘(repaint),影响性能:

5.1 减少重排的技巧

批量修改样式

// 不好:多次触发重排
element.style.width = '100px';
element.style.height = '200px';
element.style.margin = '10px';

// 好:使用cssText或classList一次性修改
element.style.cssText = 'width: 100px; height: 200px; margin: 10px;';

使用文档片段或隐藏元素进行大量DOM操作后再显示

避免在循环中读取计算样式(会导致强制同步布局)

5.2 使用requestAnimationFrame优化动画

function animate() {
  // 样式变更
  element.style.left = `${parseInt(element.style.left) + 1}px`;
  
  if (parseInt(element.style.left) < 200) {
    requestAnimationFrame(animate);
  }
}

requestAnimationFrame(animate);

6. 现代替代方案:CSS-in-JS与CSS模块

随着前端框架的流行,出现了新的样式管理方式:

6.1 CSS-in-JS (如styled-components, emotion)

import styled from 'styled-components';

const Button = styled.button`
  background: ${props => props.primary ? '#4CAF50' : 'white'};
  color: ${props => props.primary ? 'white' : '#4CAF50'};
  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid #4CAF50;
  border-radius: 3px;
`;

// 使用
<Button primary>主要按钮</Button>

6.2 CSS模块

import styles from './Button.module.css';

function Button() {
  return <button className={styles.primary}>点击我</button>;
}

优势

  • 局部作用域样式
  • 更好的组件化支持
  • 动态样式能力

7. 实践建议与常见陷阱

7.1 最佳实践

  • 关注点分离:尽量使用class而不是直接修改style属性
  • 优先使用CSS:能用CSS实现的效果尽量不用JavaScript
  • 性能敏感操作使用transform和opacity:这些属性不会触发重排
  • 使用CSS过渡和动画:比JavaScript动画更高效

7.2 常见问题

z-index问题

  • 确保position不是static
  • 检查父元素的层叠上下文

获取尺寸的问题

// 正确获取元素尺寸的方式
const width = element.offsetWidth; // 包括边框
const height = element.offsetHeight;

// 或使用getBoundingClientRect()
const rect = element.getBoundingClientRect();
console.log(rect.width, rect.height);

样式覆盖问题

  • 内联样式优先级高,可能导致难以覆盖
  • 考虑使用!important或更具体的选择器

8. 总结

DOM样式操作是前端开发中的基础但强大的技能。从简单的style属性操作到复杂的CSS变量控制,从性能优化到现代CSS-in-JS方案,理解这些技术的适用场景和优缺点对于构建高效、可维护的Web应用至关重要。

记住,随着Web平台的演进,新的API和技术不断出现,但核心概念(如层叠、优先级、盒模型等)保持相对稳定。掌握这些基础将帮助你更好地适应未来的变化。

以上就是JavaScript操作DOM样式的各种方法小结的详细内容,更多关于JavaScript操作DOM样式的资料请关注脚本之家其它相关文章!

相关文章

  • js循环中使用正则失效异常的踩坑实战

    js循环中使用正则失效异常的踩坑实战

    这篇文章主要给大家介绍了关于js循环中使用正则失效异常的踩坑实战,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-05-05
  • layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例

    layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例

    今天小编就为大家分享一篇layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • JavaScript实现Base64编码转换

    JavaScript实现Base64编码转换

    这篇文章主要介绍了JavaScript实现Base64编码转换的相关资料,非常简单实用,需要的朋友可以参考下
    2016-04-04
  • JavaScript中字符串的常用操作方法及特殊字符

    JavaScript中字符串的常用操作方法及特殊字符

    这篇文章主要介绍了JavaScript中字符串的常用操作方法及js特殊字符,需要的朋友可以参考下
    2018-03-03
  • Javascript实现Vue跨组件通信的方法详解

    Javascript实现Vue跨组件通信的方法详解

    这篇文章主要为大家详细介绍了Vue的跨组件通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • webpack中的代理配置详解

    webpack中的代理配置详解

    本文主要介绍了webpack中的代理配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • javascript进行数组追加方法小结

    javascript进行数组追加方法小结

    javascript中给数组加元素是一个非常简单的问题,javascript本身就提供了大量这类函数,我们可以使用js自带函数快速给数组增加元素了,本文就javascript进行数组追加的方法做出如下小结。
    2014-06-06
  • 如何基于filter实现网站整体变灰功能

    如何基于filter实现网站整体变灰功能

    这篇文章主要介绍了如何基于filter实现网站整体变灰功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • JavaScript中Object和Function的关系小结

    JavaScript中Object和Function的关系小结

    JavaScript 中 Object 和 Function 的关系是微妙的,他们互为对方的一个实例。
    2009-09-09
  • javascript中JSON对象与JSON字符串相互转换实例

    javascript中JSON对象与JSON字符串相互转换实例

    这篇文章主要介绍了javascript中JSON对象与JSON字符串相互转换,实例分析了json对象与字符串常用的几种转换技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论