FE

[Ionic] Shadow DOM을 활용한 컴포넌트 스타일링

monkeykim 2024. 11. 22. 16:34

Shadow DOM이란?

Shadow DOM은 웹 컴포넌트의 핵심 기술 중 하나로, 컴포넌트 내부의 DOM 구조와 스타일을 외부로부터 캡슐화하는 기술입니다.

주요 특징

  1. 스타일 격리
    컴포넌트 내부의 스타일이 외부 스타일에 영향을 받지 않으며, 반대로 외부 스타일도 컴포넌트 내부에 영향을 미치지 않습니다.
  2. 구조 보호
    컴포넌트 내부 구조가 외부로부터 숨겨져 변경이나 접근이 어렵습니다.

Shadow DOM의 실제 활용

일반 HTML 요소와 Shadow DOM 기반 컴포넌트의 차이를 이해하기 위해, 아래 예제를 보겠습니다.

<!-- 일반적인 HTML -->
<div class="button">버튼</div>

<!-- Shadow DOM을 사용하는 컴포넌트 -->
<ion-button>버튼</ion-button>

위 코드에서 .button 클래스를 스타일링하면 첫 번째 <div> 요소에는 적용되지만, ion-button은 Shadow DOM 내부에 캡슐화되어 있어 스타일이 적용되지 않습니다.


Ionic에서 Shadow DOM의 역할

Ionic은 대부분의 UI 컴포넌트에 Shadow DOM을 활용하여, 컴포넌트의 일관성스타일 안전성을 보장합니다.

Ionic에서 Shadow DOM을 사용하는 이유

  • 스타일 캡슐화: Ionic 컴포넌트의 스타일은 외부와 독립적으로 동작합니다.
  • 내부 구조 보호: 내부 구현 세부 사항이 외부 코드에 의해 변경되지 않습니다.

Shadow DOM을 사용하는 컴포넌트 식별 방법

Ionic 공식 문서에서 각 컴포넌트 페이지의 우측 상단에서 해당 컴포넌트가 Shadow DOM을 사용하는지 여부를 확인할 수 있습니다.


Shadow DOM 내부 스타일링

Shadow DOM은 캡슐화로 인해 외부에서 직접 스타일을 적용할 수 없습니다. 그러나 Ionic은 이를 해결하기 위해 CSS Shadow PartsCSS 변수를 제공합니다.

1. CSS Shadow Parts

Shadow DOM 내부의 특정 부분을 외부에서 스타일링할 수 있도록 part 속성을 제공합니다.
외부에서는 ::part() 선택자를 사용하여 스타일링합니다.

예시: ion-select 컴포넌트의 스타일링

<ion-select>
  <ion-select-option part="placeholder">Placeholder</ion-select-option>
</ion-select>
ion-select::part(placeholder) {
  color: red;
  font-size: 14px;
}

장점

  • 특정 부분만 스타일링 가능.
  • 캡슐화는 유지하면서 커스터마이징 가능.

2. CSS 변수

Ionic 컴포넌트는 다양한 CSS 변수를 제공하여 외부에서 손쉽게 스타일을 변경할 수 있습니다.

예시: ion-button의 배경색 변경

<ion-button>Click Me</ion-button>
ion-button {
  --background: #ff7700;
  --color: #fff;
}

주요 CSS 변수

  • --background: 버튼의 배경색.
  • --color: 버튼 텍스트 색상.
  • --border-radius: 버튼 모서리 반경.

Shadow DOM 비활성화는 가능할까?

Ionic 컴포넌트에서 Shadow DOM은 비활성화할 수 없습니다. 이는 컴포넌트의 동작과 스타일링의 일관성을 유지하기 위한 결정입니다. 대신 CSS Shadow PartsCSS 변수를 적극 활용하여 필요한 커스터마이징을 수행해야 합니다.


결론

Shadow DOM은 Ionic 컴포넌트의 스타일 캡슐화와 구조 보호를 위한 강력한 도구입니다. 이를 통해 개발자는 외부 스타일 충돌을 걱정하지 않고 컴포넌트를 사용할 수 있습니다. CSS Shadow Parts와 CSS 변수를 활용하면 Shadow DOM의 캡슐화 특성을 유지하면서도 유연한 스타일링이 가능합니다.

요약

  • Shadow DOM은 컴포넌트 내부 스타일과 구조를 캡슐화.
  • CSS Shadow PartsCSS 변수를 활용해 커스터마이징 가능.
  • Shadow DOM은 비활성화할 수 없으므로 Ionic의 제공 도구를 적극 활용.
Ionic 공식 문서