attachShadow i Shadow Root
Tworzenie hermetycznego drzewa cieni na elemencie hosta
attachShadow i Shadow Root to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej HTML Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs HTML Academy zawiera 4 lekcji w sumie.
Czym jest Shadow DOM?
Shadow DOM nadaje elementowi własne, odizolowane drzewo DOM („drzewo cienia”), które nie pojawia się w głównym DOM-ie strony. Zewnętrzny CSS nie przenika do środka, a wewnętrzny CSS nie wydostaje się na zewnątrz — to doskonała enkapsulacja komponentów.
Dołączanie elementu Shadow Root
Należy wywołać this.attachShadow({ mode: "open" }) w konstruktorze elementu niestandardowego lub w connectedCallback. Metoda zwraca ShadowRoot, który można wypełnić tak jak zwykłe drzewo DOM, używając innerHTML, appendChild itp.
class MyCard extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: "open" });
shadow.innerHTML = "<style>p{color:red}</style><p>Hello</p>";
}
}Tryb otwarty a zamknięty
mode: "open" udostępnia drzewo cienia jako element.shadowRoot. mode: "closed" je ukrywa — element.shadowRoot zwraca null, więc zewnętrzne skrypty nie mogą wejść do tego drzewa. Tryb zamknięty rzadko jest praktycznie przydatny, ponieważ ten sam kod, który zdefiniował element, i tak może zachować własne odwołanie.
Enkapsulacja stylów
Style zdefiniowane wewnątrz drzewa cienia (za pomocą <style> lub arkuszy stylów adopted stylesheets) mają zastosowanie tylko w tym drzewie cienia. Selektory CSS w głównym dokumencie nigdy nie pasują do potomków drzewa cienia, a style drzewa cienia nie przenikają do dokumentu.
Selektor :host
Wewnątrz drzewa cienia element hosta (czyli sam element niestandardowy) wybiera się za pomocą specjalnej pseudoklasy :host. :host(.large) pasuje, gdy host ma klasę .large; :host([disabled]) pasuje, gdy host ma atrybut disabled.
:host {
display: block;
padding: 16px;
border: 1px solid #ccc;
}
:host([disabled]) {
opacity: 0.5;
pointer-events: none;
}display: block w elementach niestandardowych
Elementy niestandardowe domyślnie mają display: inline. Wewnątrz Shadow Root należy zastosować :host { display: block }, aby element zachowywał się jak komponent blokowy. Pominięcie tego ustawienia jest częstą przyczyną błędów typu „width: 100% jest ignorowane”.
Kompozycja zdarzeń
Zdarzenia, które propagują się poza drzewo cienia, są przekierowywane na hosta. Kliknięcie wewnętrznego przycisku dociera do zewnętrznych nasłuchiwaczy z wartością event.target === host. Jeśli potrzebują Państwo rzeczywistego celu wewnętrznego, należy użyć event.composedPath().
composed: true dla zdarzeń niestandardowych
Niestandardowe zdarzenia wysyłane wewnątrz shadow root nie przekraczają granicy, chyba że zostaną utworzone zarówno z opcją bubbles: true, jak i composed: true. Bez composed zewnętrzne nasłuchiwacze na hoście nigdy nie zobaczą zdarzenia.
Skrypty nie mogą przeniknąć do środka
Zewnętrzne skrypty mogą wyszukiwać element hosta, ale nie jego potomków shadow DOM. document.querySelector("my-card span") nic nie zwróci, jeśli element <span> znajduje się wewnątrz drzewa shadow DOM. Hermetyzacja chroni elementy wewnętrzne przed przypadkowymi zależnościami.
Deklaratywny Shadow DOM
Gdy w kodzie HTML elementu znajduje się <template shadowrootmode="open">, przeglądarka buduje drzewo shadow DOM podczas parsowania, bez użycia JavaScriptu. Dzięki temu komponenty renderowane po stronie serwera są przyjazne dla procesu hydratacji, ponieważ drzewo shadow DOM istnieje jeszcze przed uruchomieniem JavaScriptu.
Kwestie wydajnościowe
Każdy shadow root wiąże się z pewnym narzutem — dodatkowym zakresem stylów i dodatkową warstwą renderowania. Setki shadow rootów nie stanowią problemu, ale dziesiątki tysięcy mogą mieć znaczenie. W interfejsach o bardzo dużej gęstości (duże tabele, listy wirtualizowane) należy wykonać profilowanie, aby potwierdzić, że koszty shadow DOM są akceptowalne.
Sprawdzenie wiedzy
Co umożliwia tryb open, czego nie umożliwia tryb closed?
Podsumowanie
attachShadow({ mode: "open" }) tworzy izolowane poddrzewo DOM, w którym style CSS i identyfikatory nie przenikają w żadnym kierunku. Host należy stylować za pomocą :host, pamiętać o display: block i używać composed: true w przypadku zdarzeń, które muszą wydostać się na zewnątrz. Poza tym drzewo shadow DOM działa jak zwykły DOM — innerHTML, appendChild i querySelector działają w nim normalnie.
Często zadawane pytania
Czy lekcja „attachShadow i Shadow Root” jest bezpłatna?
Tak — pełny tekst „attachShadow i Shadow Root” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu HTML Academy, przejdź na CoddyKit PRO. Kurs HTML Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „attachShadow i Shadow Root”?
Tworzenie hermetycznego drzewa cieni na elemencie hosta Ćwiczysz HTML Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć HTML Academy?
Nie wymagamy żadnego doświadczenia. HTML Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „attachShadow i Shadow Root”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji HTML Academy?
Tak. Każda lekcja HTML Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- attachShadow i Shadow Root
- Elementy slot do dystrybucji treści
- Style zakresowe wewnątrz shadow DOM
- Part i exportparts do stylizacji zewnętrznej