Shadow DOM

yejineeeยท2021๋…„ 5์›” 29์ผ
0

์›น ๊ธฐ์ดˆ ๋‹ค์ง€๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
6/7

๐Ÿ‘‰ JSFiddle์—์„œ Shadow DOM ์˜ˆ์‹œ ํ™•์ธํ•˜๊ธฐ

web์—์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์บก์Šํ™”์ด๋‹ค. ์บก์Šํ™”๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋ถ€๋ถ„์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€๋„, ๋ฐ›์ง€๋„ ์•Š์œผ๋ฉด์„œ ๊ทธ ์ž์ฒด์˜ ๊ตฌ์กฐ, ์Šคํƒ€์ผ, ํ–‰๋™์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

shadow DOM์€ DOM์„ ์บก์Šํ™”ํ•œ ๊ฒƒ์ด๋‹ค. shadow DOM์„ ํ†ตํ•ด element์— ์บก์Šํ™”๋œ DOM์„ ๋ถ™์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๐Ÿ“• A DOM within a DOM

shadow DOM์„ "DOM ์•ˆ์˜ DOM"๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. shadow DOM์€ ์›๋ž˜์˜ DOM๊ณผ๋Š” ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜์–ด, ๊ทธ ์ž์ฒด์˜ element์™€ ์Šคํƒ€์ผ์„ ๊ฐ–๊ณ  ์žˆ๋Š” DOM ํŠธ๋ฆฌ์ด๋‹ค.

DOM์˜ lite ๋ฒ„์ „์ด๋ฉฐ, DOM๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ HTML์„ ํ‘œํ˜„ํ•˜๊ณ , ์–ด๋–ค๊ฒƒ์„ ๋ Œ๋”๋งํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, shadow DOM์€ ํ•ญ์ƒ DOM์— ๋ถ™์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ“• Shadow DOM ๊ตฌ์กฐ

  • shadow host : shadow DOM์ด ๋ถ™์„ ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ DOM node์ด๋‹ค.
  • shadow tree : shadow DOM ์•ˆ์— ์žˆ๋Š” DOM tree์ด๋‹ค.
  • shadow boundary : shadow DOM์ด ๋๋‚˜๊ณ , ์ผ๋ฐ˜์ ์ธ DOM์ด ์‹œ์ž‘ํ•˜๋Š” ์˜์—ญ์ด๋‹ค.
  • shadow root : shadow tree์˜ root์ด๋‹ค.

shadow DOM ์•ˆ์— ์žˆ๋Š” ๋…ธ๋“œ์—๋„, non-shadow node์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. children์„ ๋ถ™์ด๊ฑฐ๋‚˜, ์†์„ฑ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, element.style๋กœ ์Šคํƒ€์ผ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, shadow DOM ์•ˆ์— ์žˆ๋Š” ๊ฒƒ๋“ค์€ ๋ฐ”๊นฅ์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ๋ชปํ•œ๋‹ค.

๐Ÿ“• ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ shadow dom

๋ธŒ๋ผ์šฐ์ €๋Š” ์˜ค๋žซ๋™์•ˆ element ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์บก์Šํ™”ํ•ด์™”๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, video element๋Š” ์—ฌ๋Ÿฌ ๋ฒ„ํŠผ๊ณผ ์ปจํŠธ๋กค๋“ค์ด shadow DOM์•ˆ์— ์กด์žฌํ•œ๋‹ค.

๐Ÿ“• Basic Usage

Element.attachShadow() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด shadow root๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.
์ด ๋ฉ”์†Œ๋“œ๋Š” mode ๋ผ๋Š” ์˜ต์…˜์„ ๊ฐ–๋Š” ์˜ต์…˜ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค.

  • open : main page context์—์„œ js๋กœ shadow์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • clsoed : ๋ฐ”๊นฅ์—์„œ shadow dom์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
const shadowEl = document.querySelector('.shadow-host');
const shadow = shadowEl.attachShadow({mode:'closed'});

console.log(shadowEl.shadowRoot); // null

์ถœ์ฒ˜

0๊ฐœ์˜ ๋Œ“๊ธ€