如何修改 DOM 中的属性、类和样式

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介

在本系列教程的上一篇文章《如何修改 DOM》中,我们介绍了如何使用内置方法在文档对象模型(DOM)中创建、插入、替换和删除元素。通过提高对DOM的操作熟练程度,您可以更好地利用JavaScript的交互能力并修改Web元素。

在本教程中,您将学习如何通过修改HTML元素节点的样式、类和其他属性来进一步改变DOM。这将使您更好地理解如何操作DOM中的重要元素。

选择元素的回顾

直到最近,一个名为jQuery的流行JavaScript库通常被用来选择和修改DOM中的元素。jQuery简化了选择一个或多个元素并同时对它们应用更改的过程。在《如何访问DOM中的元素》中,我们回顾了使用原生JavaScript来抓取和处理节点的DOM方法。

回顾一下,document.querySelector()document.getElementById() 是用于访问单个元素的方法。使用下面的示例中带有 id 属性的 div,我们可以以任何一种方式访问该元素。querySelector() 方法更强大,因为它可以通过任何类型的选择器在页面上选择元素。

给定HTML:

<div id="demo-id">Demo ID</div>

我们可以使用 querySelector() 方法访问元素如下:

// 两种方法都将返回单个元素
const demoId = document.querySelector('#demo-id');

访问单个元素后,我们可以轻松地更新元素的一部分,比如其中的文本。

// 更改一个元素的文本
demoId.textContent = 'Demo ID text updated.';

然而,当通过一个常见选择器(例如特定类)访问多个元素时,您必须遍历列表中的所有元素。在下面的代码中,有两个具有相同类值的 div 元素。

<div class="demo-class">Demo Class 1</div>
<div class="demo-class">Demo Class 2</div>

您可以使用 querySelectorAll() 来抓取所有具有 demo-class 应用的元素,并使用 forEach() 遍历它们并应用更改。也可以通过 querySelectorAll() 访问特定元素,方式与数组一样——使用方括号表示法。

// 获取所有 .demo 元素的 NodeList
const demoClasses = document.querySelectorAll('.demo-class');

// 使用循环更改多个元素的文本
demoClasses.forEach(element => {
  element.textContent = 'All demo classes updated.';
});

// 访问NodeList中的第一个元素
demoClasses[0];

这是从jQuery转向原生JavaScript时需要注意的最重要的差异之一。重要的是要注意将这些方法和属性应用到多个元素的过程。

本教程涵盖了修改元素属性所使用的属性和方法。这些属性和方法通常会附加到事件侦听器上,以便响应点击、悬停或其他触发器。

修改属性

属性是包含有关HTML元素的附加信息的值。它们通常以名称/值对的形式出现,根据元素的不同可能是必不可少的。

一些最常见的HTML属性是 img 标签的 src 属性,a 标签的 href 属性,以及 classidstyle 属性。有关HTML属性的完整列表,请查看Mozilla开发者网络上的属性列表。不属于HTML标准的自定义元素将以 data-aria- 开头。

在JavaScript中,我们有四种方法来修改元素属性:

方法描述示例
hasAttribute()返回 truefalse 布尔值element.hasAttribute('href');
getAttribute()返回指定属性的值或 nullelement.getAttribute('href');
setAttribute()添加或更新指定属性的值element.setAttribute('href', 'index.html');
removeAttribute()从元素中移除属性element.removeAttribute('href');

让我们创建一个带有一个属性的新HTML文件,其中包含一个 img 标签。我们将链接到通过URL可用的公共图像,但如果您离线工作,可以将其替换为其他本地图像。

<!DOCTYPE html>
<html lang="en">
<body>

	<img src="https://js-tutorials.nyc3.digitaloceanspaces.com/shark.png">

</body>

</html>

当您将上述HTML文件加载到现代Web浏览器中并打开内置的开发者控制台时,您应该看到类似于这样的内容:

!classes.html的第一次渲染

现在,您可以即时测试所有属性方法。

// 分配图像元素
const img = document.querySelector('img');

img.hasAttribute('src');                // 返回 true
img.getAttribute('src');                // 返回 "...shark.png"
img.removeAttribute('src');             // 移除 src 属性和值

此时,您已经移除了与 img 相关的 src 属性和值,但您可以使用 img.setAttribute() 重置该属性并将值分配给替代图像:

img.setAttribute('src', 'https://js-tutorials.nyc3.digitaloceanspaces.com/octopus.png');

!classes.html的第二次渲染

最后,我们可以通过将新值分配给元素的属性直接修改属性,将 src 设置回 shark.png 文件

img.src = 'https://js-tutorials.nyc3.digitaloceanspaces.com/shark.png';

任何属性都可以以这种方式进行编辑,以及使用上述方法。

hasAttribute()getAttribute() 方法通常与条件语句一起使用,而 setAttribute()removeAttribute() 方法用于直接修改DOM。

修改类

类属性对应于 CSS 类选择器。这不应与 ES6 类混淆,ES6 类是一种特殊类型的 JavaScript 函数。

CSS 类用于将样式应用于多个元素,而 ID 只能在页面中存在一次。在 JavaScript 中,我们有 classNameclassList 属性来处理类属性。

方法/属性描述示例
className获取或设置类值element.className;
classList.add()添加一个或多个类值element.classList.add('active');
classList.toggle()切换类的打开或关闭状态element.classList.toggle('active');
classList.contains()检查类值是否存在element.classList.contains('active');
classList.replace()用新的类值替换现有的类值element.classList.replace('old', 'new');
classList.remove()移除一个类值element.classList.remove('active');

创建另一个 HTML 文件,以使用类方法包含两个元素和一些类。此外,包含内联 CSS 样式表以提供一些样式,以帮助我们查看我们的工作结果。

<!DOCTYPE html>
<html lang="en">

<style>
	body {
		max-width: 600px;
		margin: 0 auto;
		font-family: sans-serif;
	}
	.active {
		border: 2px solid blue;
	}

	.warning {
		border: 2px solid red;
	}

	.hidden {
		display: none;
	}

	div {
		border: 2px dashed lightgray;
		padding: 15px;
		margin: 5px;
	}
</style>

<body>

	<div>Div 1</div>
	<div class="active">Div 2</div>

</body>

</html>

当你在 web 浏览器中打开 classes.html 文件时,你应该会收到类似以下的渲染:

!classes.html 的第一次渲染

className 属性是为了防止与 JavaScript 和其他具有 DOM 访问权限的语言中的 class 关键字发生冲突而引入的。你可以使用 className 直接为类分配一个值。

// 选择第一个 div
const div = document.querySelector('div');

// 将警告类分配给第一个 div
div.className = 'warning';

通过将 CSS 中定义的 warning 类分配给第一个 div,你将得到以下输出:

!classes.html 的第二次渲染

修改类的另一种方法是通过 classList 属性,它带有一些有用的方法。这些方法类似于 jQuery 的 addClassremoveClasstoggleClass 方法。

// 通过类名选择第二个 div
const activeDiv = document.querySelector('.active');

activeDiv.classList.add('hidden');                // 添加 hidden 类
activeDiv.classList.remove('hidden');             // 移除 hidden 类
activeDiv.classList.toggle('hidden');             // 在 true 和 false 之间切换 hidden
activeDiv.classList.replace('active', 'warning'); // 用 warning 类替换 active 类

执行上述方法后,你的网页将如下所示:

!classes.html 的最终渲染

因为 activeDiv 元素仍然应用了 hidden 类,所以它不会显示在页面上。

className 示例不同,使用 classList.add() 将向现有类列表中添加一个新类。你还可以将多个类作为逗号分隔的字符串添加。还可以使用 setAttribute 来修改元素的类。

修改样式

样式属性表示 HTML 元素上的内联样式。通常,样式将通过样式表应用到元素,就像本文中之前所做的那样,但有时你需要直接添加或编辑内联样式。

创建一个新文件,以演示使用 JavaScript 编辑样式。使用下面的内容,其中一个 div 应用了一些内联样式来显示一个正方形。

<!DOCTYPE html>
<html lang="en">

<body>

	<div style="height: 100px;
	            width: 100px;
	            border: 2px solid black;">Div</div>

</body>

</html>

在 web 浏览器中打开 styles.html 时,它会看起来像这样:

!styles.html 的第一次渲染

编辑样式的一种选项是使用 setAttribute()

// 选择 div
const div = document.querySelector('div');

// 将样式应用于 div
div.setAttribute('style', 'text-align: center');

然而,这将从元素中删除所有现有的内联样式。由于这可能不是预期的效果,最好直接使用 style 属性

div.style.height = '100px';
div.style.width = '100px';
div.style.border = '2px solid black';

CSS 属性以 kebab-case 编写,即小写单词用破折号分隔。然而,kebab-case CSS 属性不能在 JavaScript 的 style 属性上使用,因为破折号 - 用于减法。相反,它们将被替换为它们的 camelCase 等效形式,即第一个单词小写,所有后续单词大写。换句话说,不要使用 text-align,而要使用 JavaScript 的 style 属性中的 textAlign

// 将 div 变成圆形并垂直居中文本
div.style.borderRadius = '50%';
div.style.display = 'flex';
div.style.justifyContent = 'center';
div.style.alignItems = 'center';

完成上述样式修改后,你的 styles.html 的最终渲染将显示一个圆形:

!styles.html 的最终渲染

如果要对一个元素应用许多样式更改,最好的做法是将样式应用于样式表中的一个单独类,并将该类添加到元素中。然而,在某些情况下,修改内联样式属性将是必要或更直接的做法。

结论

HTML 元素通常会以属性的形式附加额外的信息。属性可以由名称/值对组成,其中一些最常见的属性包括 classstyle

在本教程中,您学习了如何使用纯 JavaScript 在 DOM 中访问、修改和删除 HTML 元素的属性。您还学习了如何在元素上添加、删除、切换和替换 CSS 类,并且学会了如何编辑内联 CSS 样式。如需进一步阅读,请查阅 Mozilla 开发者网络上有关属性的文档。

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白如意i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值