本文作者为 360 奇舞团前端开发工程师
什么是 Shadow DOM
Shadow DOM 简介
在现代的前端开发中,组件化和模块化已经成为构建可维护和可扩展 Web 程序的关键。随着 Web 程序规模的增长,很容易遇到样式和逻辑冲突的问题。为了解决这些问题,Web 标准引入了 Shadow DOM,可以帮助我们更好地隔离和封装组件。提到 Shadow DOM 就不得不提 Web Components。Shadow DOM 是 Web Components 标准的一部分,是 Web Components 中的一个关键技术。它提供了一种将 HTML 结构、样式和行为封装在一个独立的、封闭的 DOM 中的机制。这意味着,使用 Shadow DOM 可以将组件的样式和结构隐藏在组件作用域内,防止其与全局样式或逻辑发生冲突。
Web Components 简介
既然 Shadow DOM 是 Web Components 标准的一部分,那么什么是 Web Components?Web Components 是旨在帮助开发者能够创建可重用的组件,这些组件可以在不同的 Web 应用程序中使用的技术。Web Components 由以下三项主要技术组成:
Custom Elements: 一组 JavaScript API,允许开发者定义自己的 HTML 元素和其行为。
Shadow DOM: 一组 JavaScript API,提供了一种将 HTML 结构、样式和行为封装在一个独立的、可隔离的作用域内的机制。
HTML Templates: 允许开发者定义 HTML 结构的模板,可以作为自定义元素结构的基础被多次重用。
尽管 Shadow DOM 是 Web Components 中的一个关键技术,如果只使用 Shadow DOM 来隔离样式和封装 DOM 结构,也可以单独使用 Shadow DOM,而不定义 Custom Elements 和使用其他 Web Components 技术。比如下面我们先看一下简单的例子。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Shadow DOM</title>
</head>
<body>
<div id="shadow-element">This content is outside Shadow DOM.</div>
<script>
const hostElement = document.getElementById('shadow-element');
const shadowRoot = hostElement.attachShadow({ mode: 'open' });
const paragraph = document.createElement('p');
paragraph.textContent = 'This content is inside Sha