Skip to content

adoptStyles / adoptSheetText

Shadow DOM에 CSS를 끼워 넣습니다. Constructable Stylesheets를 먼저 씁니다. 같은 CSS를 한 번만 파싱하고 그것을 참조로 모든 컴포넌트 인스턴스가 나눠 쓰므로, 인스턴스가 천 개여도 파싱 결과는 하나뿐입니다. 이를 지원하지 않는 곳에서는 둘 다 <style> 태그를 끼워 넣는 방식으로 물러섭니다.

둘 다 SSR에서 안전하고(document가 없으면 곧바로 돌아옵니다) 여러 번 불러도 결과가 같습니다.

사용법

ts
import css from './index.less?inline';
import { adoptStyles } from 'ranuts/utils';

class MyElement extends HTMLElement {
  constructor() {
    super();
    const root = this.shadowRoot || this.attachShadow({ mode: 'closed' });
    adoptStyles(root, css);
  }
}

API

adoptStyles

컴포넌트의 정적인 스타일용입니다. 물러선 경로에서는 루트 단위로 중복을 걸러 냅니다. 하나의 shadow root는 표시가 붙은 <style>을 딱 하나만 두고, 먼저 쓴 쪽이 남습니다. 컴포넌트의 정적 스타일은 루트마다 하나만 있어야 하므로, 두 번째 호출은 부른 쪽이 실수했다는 뜻입니다.

매개변수

매개변수설명타입기본값
shadowRoot대상 shadow rootShadowRoot필수
cssText스타일 문자열string필수
marker물러선 <style>에 붙일 표시 속성string'data-adopted-style'

반환값

반환값 없음(void)

adoptSheetText

실행 중에 건네지는 동적인 스타일용입니다(컴포넌트의 sheet 속성 따위). adoptStyles와 다른 점은 물러선 경로가 무엇을 기준으로 중복을 거르느냐 하나뿐입니다. 여기서는 cssText가 기준이라, 한 루트에 서로 다른 동적 스타일을 여럿 쌓을 수 있는 한편 똑같은 것은 한 번만 들어갑니다.

매개변수

매개변수설명타입기본값
shadowRoot대상 shadow rootShadowRoot필수
cssText스타일 문자열string필수
marker물러선 <style>에 붙일 표시 속성string'data-adopted-sheet'

반환값

반환값 없음(void)

상수

이름
ADOPTED_STYLE_MARKER'data-adopted-style'adoptStyles가 물러설 때 쓰는 태그의 기본 표시
ADOPTED_SHEET_MARKER'data-adopted-sheet'adoptSheetText가 물러설 때 쓰는 태그의 기본 표시

marker 인자가 있는 까닭은, 라이브러리가 자기가 끼워 넣은 스타일에 표를 남겨 나중에 다시 찾을 수 있게 하기 위해서입니다. 이를테면 ranui는 data-ranuidata-ranui-sheet를 넘깁니다.

MIT 라이선스로 배포됩니다.