이 영역을 누르면 첫 페이지로 이동
시간의화살 블로그의 첫 페이지로 이동

시간의화살

페이지 맨 위로 올라가기

시간의화살

행복하세요

[JavaScript] Shadow DOM 다루기

  • 2023.11.22 16:02
  • Solutions

 

 

 

다른 사람이 만든 자바스크립트 라이브러리를 사용해 원하는 기능을 구현하고, CSS를 적용할 때 렌더링된 결과를 개발자 도구를 통해 살펴보면 #shadow-root 라는 부분이 나타날 때가 있다.

 

#shadow-root는 웹 컴포넌트의 Shadow DOM을 나타내는 용어로, 스타일과 마크업을 실제 DOM에서 격리시켜 컴포넌트의 내부 구현을 캡슐화하는 도구로 사용된다.

 

Shadow DOM 내부의 스타일은 해당 DOM에만 적용돼 격리된 UI 컴포넌트를 만들 때 사용할 때 사용된다.

 

Vue에서는 DOM을 추상화한 Virtual DOM을 사용해 실제 DOM에 접근하고 조작하는 비용을 최소화하고, Shadow DOM은 웹 컴포넌트의 캡슐화와 스타일 격리를 위해 사용된다. 

 

 

이전에 wav파일을 시각화하는 자바스크립트 라이브러리로 wavesurfer.js를 사용했었는데, 라이브러리로 작성한 부분에 CSS를 적용할 때 #shadow-root가 적용된 적이 있었다. 

 

 

 

 

 

 

Shadow DOM이 적용된 경우 일반적인 CSS 선택자로 CSS를 적용할 수 없다.

 

따라서 웬만한 라이브러리들은 Shadow DOM 내부 요소에 접근할 수 있는 api를 제공하는데... 제공하는 api에도 원하는 기능이 없다면? Shadow DOM 내부 요소에 직접 접근해야 한다.

 

위의 예시에서 확인할 수 있듯 Shadow DOM은 open모드 또는 closed모드로 설정할 수 있다.

open 모드에서는 외부에서 자바스크립트를 통해 Shadow DOM에 접근할 수 있지만, closed모드는 접근을 허용하지 않는다.

 

 

 

 wavesurfer.on('ready', function() {
  const waveSurferCanvas = avWaveContainer.value.querySelector('wave > canvas');
  const waveDivs = avWaveContainer.value.querySelectorAll('div');
  const shadowRoot = avWaveContainer.value.shadowRoot;
  
  if (shadowRoot) {
    const waveDivs = shadowRoot.querySelectorAll('div');
    waveDivs.forEach(div => {
      div.style.height = '100%';
    });
  }

  waveDivs.forEach(div => {
    div.style.height = '100%';
  });

  if (waveSurferCanvas) {    
    waveSurferCanvas.style.height = '100%';    
  }

});

 

 

.shadowRoot 로 Shadow DOM에 접근할 수 있고, 접근한 DOM에 css나 스크립트를 추가할 수 있다.

 

 

바로 Shadow DOM에 접근하기보다는 사용하는 라이브러리의 api 문서를 잘 살펴본 후 원하는 기능을 제공하지 않는 경우에만 직접 접근하는 방식을 사용하자 

 

 

 

반응형
저작자표시 (새창열림)

'Solutions' 카테고리의 다른 글

[SQL Server] 지원하지 않는 TLS 버전 설정  (1) 2024.06.05
대용량 파일 업로드 처리 (30GB)  (1) 2023.12.03
[Vue] map 함수와 Vue3의 반응형 시스템  (0) 2023.11.16
[Git] Git 협업 시 충돌 해결  (1) 2023.11.14
디렉토리 구조 탐색과 이미지 메타데이터 저장  (0) 2023.09.17

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [SQL Server] 지원하지 않는 TLS 버전 설정

    [SQL Server] 지원하지 않는 TLS 버전 설정

    2024.06.05
  • 대용량 파일 업로드 처리 (30GB)

    대용량 파일 업로드 처리 (30GB)

    2023.12.03
  • [Vue] map 함수와 Vue3의 반응형 시스템

    [Vue] map 함수와 Vue3의 반응형 시스템

    2023.11.16
  • [Git] Git 협업 시 충돌 해결

    [Git] Git 협업 시 충돌 해결

    2023.11.14
다른 글 더 둘러보기

정보

시간의화살 블로그의 첫 페이지로 이동

시간의화살

  • 시간의화살의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (607) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • Java (19)
      • JavaScript (15)
      • C (25)
      • C++ (12)
      • Python (1)
      • PHP (2)
    • Computer Science (69)
      • Operating System (18)
      • Computer Network (17)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Github Actions (0)
      • Amazon Web Service (8)
    • Machine Learning (28)
      • AI Introduction (28)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • Solutions (14) N
    • Life Logs (0)
    • 낙서장 (25)

최근 글

나의 외부 링크

메뉴

  • 홈

정보

13months의 시간의화살

시간의화살

13months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © 13months.

티스토리툴바