๋๋กญ๋ค์ด ๋ฉ๋ด๋ ๋ชจ๋ฌ ํ์
์์์ z-index: 9999๋ฅผ ์คฌ๋๋ฐ๋, ๋ค๋ฅธ ์นด๋๋ ๋ถ๋ชจ ์์ญ ๋ค๋ก ๊น๋ ค๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๋ ์๊ธด๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ 3์ฐจ์ ๋ ์ด์ด๋ก ๊ฒน์ณ ๊ทธ๋ฆด ๋ ์ ์ฉํ๋ Stacking Context ๋๋ฌธ์ด๋ค.
๋ ๋๋ง ์์์ ๊ธฐ๋ณธ ๋์
ํน๋ณํ z-index ์ค์ ์ด ์๋ ํ์ ์์๋ค ์ฌ์ด์์๋ ๋์ค ์์๊ฐ ํ๋ฉด ์์ชฝ์ ๊ทธ๋ ค์ง๋ค.
<div class="box red"></div>
<div class="box blue"></div>
<div class="box green"></div>
.box {
width: 100px;
height: 100px;
}
.red {
background: red;
position: relative;
top: 40px;
}
.blue {
background: blue;
}
.green {
background: green;
}
์๋๋ ๋์ค์ ์ ์ธ๋ .blue๊ฐ ์์ ์์ผ ํ์ง๋ง, .red์ position: relative๋ฅผ ๋ถ์ฌํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ํฌ์ง์
์ด ์ง์ ๋ ์์๋ฅผ ์ผ๋ฐ ํ๋ฆ ์์๋ณด๋ค ์์ชฝ์ ๋ ๋๋งํ๋ค. ๋ฐ๋ผ์ 40px ๋ฐ๋ ค๋ .red๊ฐ .blue ์๋ก ์ฌ๋ผ์จ๋ค.
Stacking Context ์ด ๊ฐ๋ฌ๋ฒ๋ฆฌ๋ Z์ถ ๋ฒ์

Stacking Context ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋๋ง์ ๊ณ์ฐํ๋ ๋ ๋ฆฝ๋ 3์ฐจ์ ๋ ์ด์ด ๊ทธ๋ฃน์ด๋ค. ๋ณด์ด๋ ๊ฑด 2d ์ด์ง๋ง, ๊ณ์ฐ์ ์ํด์ 3d์ ๊ฐ๋ ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
ํต์ฌ ๊ท์น์ ๊ฐ๋จํ๋ค. ์์ ์์์ z-index๋ ํด๋น ๋ถ๋ชจ ๋ด๋ถ์์๋ง ์ ํจํ๋ค. ์์ ์์์ 99999๋ฅผ ๋ถ์ฌํด๋, ๋ถ๋ชจ์ Stacking Context ์์ฒด์ Z์ถ ์์๊ฐ ๋ฎ์ผ๋ฉด ์ธ๋ถ์ ๋ค๋ฅธ ์์ ์๋ก ์ฌ๋ผ๊ฐ ์ ์๋ค.
<header class="header">
<div class="nav-item">
<div class="dropdown" style="z-index: 9999;">๋๋กญ๋ค์ด</div>
</div>
</header>
<main class="content" style="position: relative; z-index: 2;">
<h2>๋ฉ์ธ ์ฝํ
์ธ </h2>
</main>
.header {
position: relative;
z-index: 1; /* ํค๋ ์ ์ฒด๊ฐ z-index: 1 ์ธ ์์ ๋งฅ๋ฝ ํ์ฑ */
}
ํค๋๊ฐ z-index: 1์ธ ์์ ๋งฅ๋ฝ์ ๊ฐ์ง ์๊ฐ, ๋ด๋ถ์ .dropdown์ด ๊ฐ์ง z-index: 9999๋ .header ๋ด๋ถ์์์ ์์์ผ ๋ฟ์ด๋ค. z-index: 2๋ฅผ ๊ฐ์ง .content ์์ญ๋ณด๋ค ํค๋ ์ ์ฒด๊ฐ ๋ค์ ์์ด์ ๋๋กญ๋ค์ด์ ๋ค๋ก ๊ฐ๋ ค์ง๊ฒ ๋๋ค.
๋งฅ๋ฝ์ด ์๋ก ์๊ธฐ๋ ์กฐ๊ฑด
position ๋ฟ ์๋๋ผ ํน์ CSS ์์ฑ์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์๋ก์ด Stacking Context ์ด ํ์ฑ๋๋ค.
- ๋ฃจํธ ์์:
<html> - ํฌ์ง์
๊ด๋ จ:
position์ดabsolute๋๋relative์ด๋ฉด์z-index๊ฐauto๊ฐ ์๋ ์ซ์์ผ ๋,position: fixed๋๋sticky์ธ ์์ - Flex/Grid ์์:
z-index๊ฐauto๊ฐ ์๋ ์ซ์์ผ ๋
๊ทธ๋ํฝ ๋ ์ด์ด
๊ทธ๋ํฝ ๋ ์ด์ด์์ Compositing ํด์ผํ๋ css ์์ฑ๋ค์ ๋๋ถ๋ถ ์๋ก์ด Stacking Context ๋ฅผ ๊ตฌ์ฑํ๋ค.
๋ง์ฝ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ์ด์ด๋ฅผ ๋ถ๋ฆฌํ์ง ์๊ณ ์์ ์์๋ค์ ํ๋ฉด์ ๋ฐ๋ก ๊ทธ๋ฆฌ๋ฉด์ ๊ฐ๊ฐ opacity๋ฅผ ์ ์ฉํ๋ฉด ๋ ๋๋ง ์๊ณก์ด ๋ฐ์ํ๋ค.
- ์๋ํ ๊ฒฐ๊ณผ: ๋ถ๋ชจ์ ์์๋ค์ ํฌํจํ ํ๋์ ์์ฑ๋ ๋ฐ์ค ์ ์ฒด๊ฐ 50% ํฌ๋ช ํจ.
- ๋ ์ด์ด๋ฅผ ๋ถ๋ฆฌํ์ง ์์์ ๋์ ๋ฌธ์ :
- ๋ถ๋ชจ ๋ฐฐ๊ฒฝ์ด 50% ํฌ๋ช ํ๊ฒ ๊ทธ๋ ค์ง.
- ๊ทธ ์์ ์์ 1์ด 50% ํฌ๋ช ํ๊ฒ ๊ทธ๋ ค์ง.
- ์์ 1๊ณผ ๊ฒน์น๋ ์์ 2๊ฐ ๋ 50% ํฌ๋ช ํ๊ฒ ๊ทธ๋ ค์ง๋ฉด์ ์์๋ผ๋ฆฌ ๊ฒน์น๋ ๋ถ๋ถ์ด ์ด์ค์ผ๋ก ํฌ๋ช ํด์ง (25% ํฌ๊ณผ).
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๋ ์ด ์์์ ์์๋ค์ ํ๋์ ๋ ๋ฆฝ๋ Offscreen Buffer ์ ๋จผ์ ์จ์ ํ๊ฒ ๋ ๋๋งํ ํ, ๊ทธ ๊ฒฐ๊ณผ๋ฌผ ์ ์ฒด์ ๋ถํฌ๋ช ๋๋ฅผ ์ ์ฉํด ๋ถ๋ชจ ๋ ์ด์ด ์์ ํฉ์ฑํด์ผ ํ๋ค.
- ๋ถํฌ๋ช
๋:
opacity๊ฐ 1๋ณด๋ค ์์ ์์ (opacity: 0.99๋ง ์ฃผ์ด๋ ๋ ๋๋ง ๋ ์ด์ด๊ฐ ๋ถ๋ฆฌ๋จ) - CSS ํธ๋์คํผ/ํํฐ:
transform,filter,perspective,clip-path,mask์์ฑ์ดnone์ด ์๋ ๋ - ๊ทธ๋ํฝ ํฉ์ฑ:
mix-blend-mode๊ฐnormal์ด ์๋ ๋ - ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๊ฒฉ๋ฆฌ:
will-change์์ฑ์ ์์ ๋งฅ๋ฝ ์์ฑ ์์ฑ์ด ๋ค์ด๊ฐ์ ๋,contain์ดlayout์ด๋paint๋ฅผ ํฌํจํ ๋ - ๋ช
์์ ๊ฒฉ๋ฆฌ:
isolation: isolate๊ฐ ์ง์ ๋ ์์
GPU ํ๋์จ์ด ๊ฐ์๊ณผ ๋ ์ด์ด ์น๊ฒฉ ์๋ฆฌ๋ ์ด์ฒ๋ผ ๊ทธ๋ํฝ ํฉ์ฑ์ ์ํ ๋ ์ด์ด ๋ถ๋ฆฌ์ ๊ด๋ จ๋๋ค.
์ค์ํ๊ธฐ ์ฌ์ด ํฌ์ธํธ
UI ์นด๋์ ๋ง์ฐ์ค ํธ๋ฒ ํจ๊ณผ๋ก transform: translateY(-4px)๋ opacity ํธ๋์ง์
์ ๊ฑธ์ด๋ ๋๊ฐ ์๋ค. ์ ๋๋ฉ์ด์
์ด ์์๋๋ ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ ๋ถํฌ๋ช
๋ ๊ณ์ฐ๊ณผ 3D ํฉ์ฑ์ ์ํด ์๋ก์ด Stacking Context ์ ๋ง๋ค์ด๋ธ๋ค. ๊ทธ ๊ฒฐ๊ณผ ์นด๋ ๋ด๋ถ์ ๋์๋์๋ ํดํ์ด๋ ์๋ธ ๋ฉ๋ด๊ฐ ์ ์นด๋ ๋ ์ด์ด์ ๊ฐ๋ ค์ง๋ ํ์์ด ๋ฐ์ํ๋ค.
.card {
isolation: isolate; /* ์ธ๋ถ์ ๋ถ๋ฆฌ๋ ๋
๋ฆฝ ์์ ๋งฅ๋ฝ ๋ช
์ */
}
๋ถ๋ชจ ์์์ z-index๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ด๋ถ ์์๋ค์ด ์ธ๋ถ Z์ถ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ํ๋ ค๋ฉด isolation: isolate๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์คํ์ผ ๊ตฌ์กฐ์ ๋ถ๋ชจ์ ์์ ๋งฅ๋ฝ์ ์ ์ดํ ์ ์๋ค๋ฉด, ๋์ UI์ DOM ์์น๋ฅผ ์์ ์ธ๋ถ๋ก ์ฎ๊ฒจ ๋ ๋๋งํ๋ฉด ๋๋ค.
- React์
createPortal์ด๋ Vue์<Teleport>์ฌ์ฉ - HTML ํ์ค์ผ๋ก๋
<dialog>ํ๊ทธ ๋๋ Popover API ํ์ฉ
๋๊ธ 0๊ฐ