← 글 목록

notes

Shadow DOM이란?

Shadow DOM의 캡슐화·스타일 격리·컴포넌트 구조와 사용 메모.

Shadow DOM은 문서의 나머지 부분과 스타일·마크업을 격리하는 별도의 DOM 트리입니다.

특징

  • 캡슐화
  • Shadow DOM 안의 CSS는 외부에 영향을 주지 않고, 외부 CSS도 Shadow DOM 안으로 들어오지 않음
  • #id, .class 선택자도 Shadow 경계 안에서만 적용됨
  • 구조
  • 일반 DOM 노드에 attachShadow()로 Shadow Root를 붙임
  • Shadow Root 아래에 별도의 DOM 트리가 생김
  • 이 경계를 Shadow Boundary라고 함
  • 사용처
  • Web Components (<custom-element>)
  • <video>, <input type="range"> 같은 브라우저 기본 요소
  • iframe과 비슷하게 격리된 UI를 만들 때 사용

예시

<div id="host"></div>

<script>

const host = document.getElementById('host');

const shadow = host.attachShadow({ mode: 'open' });

shadow.innerHTML = `

<style>p { color: red; }</style>

<p>이 스타일은 외부에 영향 없음</p>

`;

</script>

mode: 'open' vs mode: 'closed'

  • open: element.shadowRoot로 접근 가능
  • closed: element.shadowRoot가 null이라 외부에서 직접 접근 불가

React, Vue 같은 프레임워크나 라이브러리에서 Shadow DOM을 쓰는 컴포넌트를 사용할 때, 이 격리 때문에 스타일이 적용되지 않는 문제가 자주 생깁니다.