> 웹 프론트엔드 > 프런트엔드 Q&A > 웹 구성 요소의 캡슐화에 Shadow Dom을 어떻게 사용합니까?

웹 구성 요소의 캡슐화에 Shadow Dom을 어떻게 사용합니까?

百草
풀어 주다: 2025-03-12 15:00:21
원래의
258명이 탐색했습니다.

웹 구성 요소의 캡슐화에 Shadow Dom을 어떻게 사용합니까?

웹 구성 요소의 캡슐화에 Shadow Dom 사용

Shadow Dom은 진정으로 캡슐화 된 웹 구성 요소를 만드는 데 중요한 부분입니다. 나머지 페이지에서 구성 요소의 내부 구조 (HTML, CSS 및 JavaScript)를 캡슐화 할 수 있습니다. 이것은 스타일링 충돌과 의도하지 않은 부작용을 방지합니다. 요소에서 attachShadow() 메소드를 사용하여 섀도우 dom을 만듭니다. 이 메소드는 선택적 ShadowRootInit 객체를 인수로 사용하여 Shadow Dom의 모드를 지정할 수 있습니다. 두 모드는 다음과 같습니다.

  • 'open' (기본값) : 기본 문서의 스타일은 Shadow Dom에 영향을 줄 수 있으며 그 반대도 마찬가지입니다. 이것은 더 많은 유연성을 제공하지만 캡슐화를 줄입니다.
  • 'closed' : 기본 문서의 스타일은 Shadow Dom에 영향을 줄 수 없으며 그 반대도 마찬가지입니다. 이것은 더 강한 캡슐화를 제공하여 스타일 블리드를 방지하고 우발적으로 우발적 인 재정의를 방지합니다.

다음은 Shadow Dom으로 웹 구성 요소를 만드는 예입니다.

 <code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'closed' }); // Use 'open' if needed // Create internal HTML const div = document.createElement('div'); div.innerHTML = ` <style> :host { display: block; border: 1px solid black; } p { color: blue; } </style> <p>This is my component!</p> `; this.shadowRoot.appendChild(div); } } customElements.define('my-component', MyComponent);</code>
로그인 후 복사

이 코드는 사용자 정의 요소 my-component 정의합니다. attachShadow() :host 의사 선택기를 사용하면 사용자 정의 요소 자체를 스타일링 할 수 있습니다. 우리는 mode: 'closed' , 메인 페이지의 스타일은이 구성 요소의 모양에 영향을 미치지 않습니다.

다른 캡슐화 기술에 비해 Shadow DOM을 사용하면 어떤 이점이 있습니까?

다른 캡슐화 기술에 대한 그림자 dom의 이점

Shadow Dom은 고유 한 CSS 클래스 이름 또는 JavaScript 네임 스페이스를 사용하는 것과 같은 다른 캡슐화 기술과 비교하여 다음과 같은 몇 가지 주요 장점을 제공합니다.

  • 강력한 캡슐화 : Shadow Dom은 훨씬 더 강력한 형태의 캡슐화를 제공합니다. 그것은 구성 요소의 내부 스타일과 HTML을 나머지 페이지에서 완전히 분리하여 우발적 인 스타일 충돌을 방지하고 예측 가능한 동작을 보장합니다. 이는 고유 한 클래스 이름에 의존하는 것보다 훨씬 우수하며, 이는 여전히 계단식 스타일에 의해 실수로 쓰여지거나 영향을받을 수 있습니다.
  • 유지 관리 개선 : 강력한 캡슐화로 인해 Shadow Dom은 구성 요소를 더 쉽게 유지 관리하고 업데이트 할 수 있도록합니다. 구성 요소 내의 변경은 응용 프로그램의 다른 부분에 의도하지 않은 결과를 초래할 가능성이 적습니다.
  • 재사용 성 : Shadow Dom의 캡슐화 된 특성은 다른 프로젝트와 컨텍스트에서 구성 요소를 훨씬 더 재사용 할 수있게합니다. 스타일 충돌이나 예기치 않은 동작에 대해 걱정하지 않고 구성 요소를 자신있게 사용할 수 있습니다.
  • 개선 된 성능 (경우에 따라) : 브라우저는 다른 기술보다 Shadow DOM 구성 요소의 렌더링을보다 효과적으로 최적화 할 수 있습니다. 이로 인해 특히 복잡한 응용 분야에서 성능이 향상 될 수 있습니다.
  • 기본 브라우저 지원 : Shadow Dom은 기본 브라우저 기능으로 해결 방법이나 라이브러리를 사용하는 것보다 더 넓은 호환성과 성능을 보장합니다.

웹 페이지의 다른 부분에 영향을 미치지 않고 Shadow Dom을 효과적으로 사용하여 구성 요소를 어떻게 스타일링하려면 어떻게해야합니까?

Shadow Dom을 사용한 스타일링 구성 요소

Shadow Dom의 스타일링 구성 요소는 간단하지만 :host 의사 선택기 및 CSS 범위 작업 방식을 이해해야합니다.

  • 내부 스타일 시트 : 가장 일반적이고 권장되는 접근 방식은 <style></style> 태그를 사용하여 구성 요소의 Shadow Dom 내에 직접 스타일을 포함시키는 것입니다. 이것은 스타일을 현지화하고 갈등을 방지합니다.
  • :host 의사 선택기 : 이 의사 선택기는 사용자 정의 요소 자체를 대상으로하여 Shadow Dom 내에서 호스트 요소를 스타일링 할 수 있습니다.
  • 범위 CSS : Shadow Dom의 캡슐화로 인해 Shadow Dom 내의 스타일은 기본 문서에 영향을 미치지 않으며 ( 'Closed'모드에서) 그 반대에 영향을 미치지 않습니다. 이를 통해 스타일 충돌을 방지하기 위해 복잡한 클래스 이름 체계가 필요하지 않습니다.
  • CSS 변수 (사용자 정의 속성) : CSS 변수를 사용하여 스타일을 외부에서 섀도우 DOM으로 전달합니다. 이를 통해 캡슐화를 손상시키지 않고 어느 정도의 사용자 정의가 가능합니다.

내부 스타일 시트 및 :host 사용 예 :

 <code class="html"><my-component style="--my-color: red;"></my-component> <style> my-component { /* styles applied to the outside of the shadow root */ } my-component::part(my-part) { /* styles applied to a specific part inside the shadow root */ } </style></code>
로그인 후 복사
 <code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); // or 'closed' this.shadowRoot.innerHTML = ` <style> :host { display: block; border: 1px solid var(--my-color, black); /* Default to black if not specified */ } p { color: blue; } </style> <p>This is my component!</p> `; } }</code>
로그인 후 복사

이 예제는 CSS 변수 ( --my-color )를 사용하여 외부에서 테두리 색상을 사용자 정의하는 방법을 보여줍니다. 기본 색상은 검은 색입니다.

외부에서 그림자 돔 내의 요소에 액세스하고 조작 할 수 있습니까? 그렇다면 어떻게해야합니까?

외부에서 그림자 돔 요소에 액세스하고 조작합니다

외부에서 그림자 Dom 내에서 요소를 직접 액세스하고 조작하는 것은 일반적으로 캡슐화를 깨고 깨지기 쉬운 코드로 이어질 수 있기 때문에 낙담합니다. 그러나 필요한 상황이 있습니다. 몇 가지 방법은 다음과 같습니다.

  • querySelectorquerySelectorAll 사용 : Shadow DOM 내의 요소의 선택기를 알고 있다면이 메소드를 사용하여 액세스 할 수 있습니다. 그러나 내부 구조 변경이 코드를 중단 할 수 있기 때문에 이것은 깨지기 쉬운 일입니다. querySelector 메소드는 shadowRoot 속성에서 호출되어야합니다.
  • shadowRoot 속성 사용 : 사용자 정의 요소에 대한 참조가있는 경우 shadowRoot 속성에 액세스하여 Shadow Dom을 통과 할 수 있습니다.
  • 공개 API 노출 : 모범 사례는 외부 상호 작용을 통제 된 방식으로 허용하는 웹 구성 요소 내에서 공개 방법 또는 속성을 만드는 것입니다. 이것은 캡슐화를 유지하고 예측 가능한 동작을 허용합니다.

querySelector 사용하여 요소에 액세스하는 예 :

 <code class="javascript">const myComponent = document.querySelector('my-component'); const paragraph = myComponent.shadowRoot.querySelector('p'); paragraph.textContent = 'This text has been changed from the outside!';</code>
로그인 후 복사

이 예제는 그림자 dom 내의 <p></p> 요소에 직접 액세스합니다. 그러나 이것은 일반적으로 낙담합니다. MyComponent 클래스에서 텍스트를 제어하고 유지 관리 가능한 방식으로 업데이트 할 수있는 메소드를 노출하는 것이 훨씬 낫습니다. 예를 들어:

 <code class="javascript">class MyComponent extends HTMLElement { // ... (constructor as before) ... set textContent(newText) { this.shadowRoot.querySelector('p').textContent = newText; } }</code>
로그인 후 복사

이제 텍스트를 안전하고 예측 가능하게 사용하여 다음과 같이 업데이트 할 수 있습니다. myComponent.textContent = "New text";
이 접근법은 캡슐화를 유지하고 코드를보다 강력하게 유지합니다.

위 내용은 웹 구성 요소의 캡슐화에 Shadow Dom을 어떻게 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿