DEV Community

Cover image for Understanding Shadow DOM and Shadow Roots in JavaScript: A Simple Guide for Beginners
Volker Schukai for schukai GmbH

Posted on

Understanding Shadow DOM and Shadow Roots in JavaScript: A Simple Guide for Beginners

As part of development on the Monster open-source project, our developers often use the powerful Shadow DOM technology to create complex components. This article aims to provide a concise explanation of what Shadow DOM is all about and how knowledge of it can be beneficial when working with Monster components. We will also explore the basics of the Shadow Roots API in JavaScript, which is an essential part of the Web Components standard and allows the creation of encapsulated, reusable components. With the help of a simple example, beginners will find it easier to understand and apply these concepts in their projects.

What is Shadow DOM?

Shadow DOM is a powerful web standard that lets you create encapsulated HTML, CSS, and JavaScript in your web components. It lets you create self-contained components whose internal structure, style, and behavior remain separate from the main DOM tree. This separation ensures that the styles and scripts within a component do not interfere with other elements on the page.

What is a Shadow Root?

A Shadow Root is the root element of a Shadow DOM tree. It is attached to a host element, which is a regular DOM element. The Shadow Root acts as a boundary between the host element and the Shadow DOM, providing encapsulation.

Creating a Shadow Root:

To create a Shadow Root, you can use the attachShadow() method on a DOM element. This method takes an object with a single property, mode, which can be set to either 'open' or 'closed'. An open Shadow Root can be accessed using JavaScript, while a closed one cannot.

<!DOCTYPE html>
<html>
<head>
  <style>
    .container {
      border: 1px solid black;
      padding: 10px;
    }
  </style>
</head>
<body>
  <div class="container" id="container"></div>
  <script>
    const container = document.getElementById("container");
    const shadowRoot = container.attachShadow(
            { mode: "open" }
          );

    shadowRoot.innerHTML = `
      <style>
        p {
          color: red;
        }
      </style>
      <p>Hello, Shadow DOM!</p>
    `;
  </script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

In this example, we create a Shadow Root attached to a <div> element with the class "container". Inside the Shadow Root, we define a <style> block with a rule for <p> elements and a <p> element with the text "Hello, Shadow DOM!". The style defined inside the Shadow Root applies only to elements within the Shadow Root and does not affect the main DOM.

Understanding Shadow DOM and Shadow Roots in JavaScript is essential for developers starting to work with Web Components. The encapsulation they provide helps create reusable, self-contained components that do not interfere with the main DOM tree. With this simple guide and example, you should now have a solid foundation for working with Shadow DOM and Shadow Roots in your projects.

There is still a lot to say about this topic, as the world of Shadow DOM and Web Components continues to evolve. If you have any questions or need further clarification, please feel free to post them in the comments section. We'll be more than happy to help you on your journey to mastering Shadow DOM and creating incredible web components.

Top comments (0)