๐ 08. Positioning๊ณผ Stacking Context: 'z-index์ ์ง์ค'
๐ ๊ฐ์
์์๋ฅผ ์์ ์์ฌ๋ก ๋ฐฐ์นํ๋ position ์์ฑ์ ์ ์๊ณผ, z-index๊ฐ ๋จนํ์ง ์๋ ๊ทผ๋ณธ์ ์ธ ์ด์ ์ธ '์์ ๋งฅ๋ฝ'์ ์์ฒ ์ด์ ํจ๊ป ํํค์ณ ๋ด ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 9๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 5๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[Position 4์ธ๋ฐฉ์ ํน์ฑ] โ [Sticky์ ์ค๋ฌด ํ์ฉ] โ [Stacking Context์ ๋น๋ฐ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
relative,absolute,fixed,sticky๋ฅผ ์ฉ๋์ ๋ง๊ฒ ์ ํํ ์ฌ์ฉํฉ๋๋ค. -
z-index: 9999๋ฅผ ๋จ๋ฐํ์ง ์๊ณ ๋ ์์๋ฅผ ์ํ๋ ์ธต์ ๋ฐฐ์นํฉ๋๋ค. - ์๋ก์ด '์์ ๋งฅ๋ฝ'์ด ์๊ธฐ๋ ์กฐ๊ฑด์ ํ์ ํด ๋ฒ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์งํฉ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋! ๋ถ๋ช
ํ ๋ชจ๋ฌ์
z-index: 999999๋ฅผ ์คฌ๊ฑฐ๋ ์? ๊ทผ๋ฐ ์ ์๊พธ ์ฌ์ด๋๋ฐ ๋ฐ์ ๊น๋ฆฌ๋ ๊ฑธ๊น์? ์ด๊ฑฐ ๋ธ๋ผ์ฐ์ ๋ฒ๊ทธ ์๋๊ฐ์? ์ต์ธํด์! ๐ซ" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋,
z-index๋ ๋จ์ํ ์ซ์๊ฐ ์๋์์. ์ฐ์ฃผ์ ๋ฒ์น์ฒ๋ผ '์ฐจ์(Stacking Context)'์ด ๋ค๋ฅด๋ฉด ์ซ์๊ฐ ์๋ฌด๋ฆฌ ์ปค๋ ์์ฉ์์ฃ . ๋ธ๋ผ์ฐ์ ๋ฅผ ํํ๊ธฐ ์ ์ ์์ฒ ๋์ด ์ด๋ค ์ฐจ์์ ๋ง๋์ จ๋์ง๋ถํฐ ํ์ธํด๋ด ์๋ค."
๐ค ์ ์์์ผ ํ๋๊ฐ
์น ํ์ด์ง๋ 2์ฐจ์ ํ๋ฉด์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ๋ ์ด์ด๋ค์ด ๊ฒน๊ฒน์ด ์์ฌ ์๋ 3์ฐจ์ ๊ณต๊ฐ์
๋๋ค. position์ ์ด ๊ณต๊ฐ ์์์ ์์์ ์์น๋ฅผ ๊ฒฐ์ ํ๊ณ , z-index๋ ๊ทธ ์ธต์(Layer)๋ฅผ ๊ฒฐ์ ํ์ฃ .
์ ์
๊ฐ๋ฐ์๋ค์ ํ๋ฉด์ด ๊ผฌ์ด๋ฉด ๋ฌด์ง์ฑ์ผ๋ก z-index ์ ์๋ฅผ ์ฌ๋ฆฝ๋๋ค. ํ์ง๋ง ์ด๋ ๋จธ์ง์์ z-index: 2147483647์ด๋ผ๋ ๊ดด๋ฌผ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณ๊ณ , ๊ด๋ฆฌ ๋ถ๊ฐ๋ฅํ ์ํ์ ๋น ์ง๊ฒ ๋ง๋ญ๋๋ค. 5๋
์ฐจ ์ด์์ ์๋์ด๋ Stacking Context(์์ ๋งฅ๋ฝ) ๋ผ๋ ์ฐจ์์ ๊ท์น์ ์ดํดํด, ๋จ 1์ ์ ์ ์๋ง์ผ๋ก๋ ์ฐ์ํ๊ฒ ์์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๐ 1. ์์น์ ๋ง๋ฒ์ฌ: Position ์์ฑ
relative: "๋ด ์๋ ์๋ฆฌ"๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์ง๋ง ์์ง์ ๋๋ค. (์์ ์์absolute์ ๊ธฐ์ค์ ์ด ๋๊ธฐ๋ ํจ)absolute: "๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์(position์ด static์ด ์๋)"์ ๊ธฐ์ค์ผ๋ก ์์ ๋กญ๊ฒ ๋ ์๋ค๋๋๋ค. ์ผ๋ฐ์ ์ธ ํ๋ฆ(Document Flow)์์ ์์ ํ ๋น ์ง๋๋ค.fixed: "๋ธ๋ผ์ฐ์ ํ๋ฉด(Viewport)"์ ๋ฑ ๋ถ์ต๋๋ค. ์คํฌ๋กค์ ๋ด๋ ค๋ ๊ณ ์ ๋ฉ๋๋ค.sticky: ํ์์ ์ผ๋ฐ์ ์ธ ํ๋ฆ์ ์๋ค๊ฐ, ์คํฌ๋กค์ด ํน์ ์ง์ ์ ๋๋ฌํ๋ฉดfixed์ฒ๋ผ ๋ฌ๋ผ๋ถ์ต๋๋ค. (ํ์ ํค๋ ๋ฑ์ ํ์์ !)
๐ฆ ์ํธ์ ํ:
"absolute์์๋ฅผ ์ผ์ ๋ ๊ธฐ์ค์ ์ด ์๋ฑํ ๊ณณ์ผ๋ก ์กํ๋ค๋ฉด, ๋ถ๋ชจ ์์์position: relative๊ฐ ๋น ์ ธ์์ง ์์์ง ์ ์ผ ๋จผ์ ํ์ธํด๋ณด์ธ์."
๐๏ธ 2. Stacking Context: ๋ณด์ด์ง ์๋ ์ฐจ์์ ๋ฒฝ
์ z-index: 9999๊ฐ ์ ๋จนํ๊น์? ๋ฐ๋ก ์๋ก์ด ์์ ๋งฅ๋ฝ์ด ์๊ฒผ๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ ๋งฅ๋ฝ์ ์๋ก์ด '์ฐจ์(Dimension)' ์
๋๋ค. ํ๋ฒ ์ฐจ์์ด ๋ง๋ค์ด์ง๋ฉด, ๊ทธ ์์ ์์ ์์๋ค์ ์๋ฌด๋ฆฌ z-index๋ฅผ ํฌ๊ฒ ์ค๋ ๋ถ๋ชจ ์ฐจ์์ ๋ฒฝ์ ๋์ ์ ์์ต๋๋ค. ๋ง์น ์ํํธ 1์ธต์์ 999ํธ๋ฅผ ์ฐ๋ค๊ณ 2์ธต์ ์ฌ๋ ์ฌ๋๋ณด๋ค ๋์ด ์ฌ๋ผ๊ฐ ์ ์๋ ๊ฒ์ฒ๋ผ์!
๐ง ์ํธ์ ํต์ฌ ๋ ์จ:
"์์ ๋งฅ๋ฝ์ ํ ๋ง๋๋ก ์์ฝํ๋ฉด: ๋ถ๋ชจ์z-index๊ฐ ์์ผ๋ฉด, ์์์ด ์๋ฌด๋ฆฌ ๋์๋ ๊ฐํ๋ฒ๋ฆฐ๋ค๋ ๊ฒ๋๋ค. ์ฐจ์์ ๋ฒฝ์ ์ซ์๋ก ๋ถ์์ง ๋ชปํด์."
[์๋ก์ด ์ฐจ์(๋น๋ฐ)์ด ํ์ฑ๋๋ ์กฐ๊ฑด]
position: absolute/relative์ด๋ฉด์z-index๊ฐauto๊ฐ ์๋ ๋position: fixed/sticky์ผ ๋opacity๊ฐ 1๋ณด๋ค ์์ ๋ (์์ฒ ์ด๊ฐ 0.9 ์คฌ๋ ๊ทธ ์์ฑ!)transform,filter,perspective๋ฑ์ ์์ฑ์ด ๋ถ์ฌ๋์ ๋
๐๏ธ ์ฐจ์์ ๋ฒฝ: ์ z-index: 9999๊ฐ ์ง๊น์?
(๊ฐํ์์!)
๋๋ 2์ธ๋ฐ 9999๋ฅผ ์ด๊น!
โฌ๏ธ ์์์ด z-index: 9999๋ผ๋, ๋ถ๋ชจ A(z-index: 1)๊ฐ ๋ถ๋ชจ B(z-index: 2)๋ณด๋ค ๋ฎ์ผ๋ฏ๋ก ์ ๋ ์๋ก ๋ชป ์ฌ๋ผ๊ฐ๋๋ค!
โ ๏ธ ํจ์ ์ฃผ์: opacity๋ง ์ค๋ ์ฐจ์์ด ์๊น๋๋ค!
โ opacity: 0.99 โ ์ ์ฐจ์ ์์ฑ!
โ transform: translateZ(0) โ ์ ์ฐจ์!
๐ก๏ธ 3. 5๋ ์ฐจ์ ์ ๋ต: z-index ๊ด๋ฆฌ๋ฒ
- ์์๋ก ๊ด๋ฆฌ:
z-index: 10,z-index: 20์ฒ๋ผ 10 ๋จ์๋ก ์ฌ์ด๋ฅผ ๋์์ ์ ์ํ๊ณ , CSS ๋ณ์๋ก ์ด๋ฆ์ ๋ถ์ด์ธ์ (์:--z-modal: 100). - ๊ตฌ์กฐ์ ํด๊ฒฐ: ๋ชจ๋ฌ ๊ฐ์ ์ต์์ ์์๋
<body>๋ฐ๋ก ์๋๋ก ๋นผ๋ด์ด(Portal ๊ธฐ๋ฒ) ๋ถ๋ชจ์ ์์ ๋งฅ๋ฝ์ ๊ฐํ์ง ์๊ฒ ํ์ธ์.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ๋ถ๋ชจ ์์๊ฐ position: relative์ด๊ณ , ์์ ์์๊ฐ top: 50%์ธ position: absolute๋ผ๋ฉด, ์์ ์์๋ ์ด๋์ ์์นํ๊ฒ ๋ ๊น์?
โ
์ ๋ต: ๋ถ๋ชจ ์์์ ๋์ด์ 50% ์ง์ (๋ฐ์ผ๋ก ๋ด๋ ค๊ฐ ์์น)์ ์์์ ์๋จ ๋ชจ์๋ฆฌ๊ฐ ์์นํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
position: absolute์ธ ์์์top: 50%๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์์น ์ง์ ์กฐ์(static์ด ์๋) ์ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋ถ๋ชจ๊ฐrelative์ด๋ฏ๋ก ๋ถ๋ชจ๊ฐ ๊ทธ ๊ธฐ์ค์ ์ด ๋๊ณ , ๋ถ๋ชจ ๋์ด์ ์ ๋ฐ ์ง์ ์ ์์์ ์๋จ ๋ชจ์๋ฆฌ(top edge) ๊ฐ ์์นํฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ ํํ ๊ฐ์ด๋ฐ ๋๊ณ ์ถ๋ค๋ฉด
top: 50%; transform: translateY(-50%)์ ์กฐํฉํด์ผ ํด์.top: 50%๋ง์ผ๋ก๋ ์์์ ์๋จ์ด ์ค๊ฐ์ ๊ฐ๋ ๊ฑฐ์ง ์์ ์์ฒด๊ฐ ์ค์์ ์๋์์!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "top: 50%๋ ๋ด ๋จธ๋ฆฌ๊ฐ ๋ฐ์, transform: translateY(-50%)๋ฅผ ๋ํด์ผ ๋ด ๋ฐฐ๊ผฝ์ด ๋ฐ์!"
Q2. ๋ค์ ์ค ์๋ก์ด '์์ ๋งฅ๋ฝ(Stacking Context)'์ ์์ฑํ์ง ์๋ ์์ฑ์ ๋ฌด์์ผ๊น์?
opacity: 0.9transform: scale(1.1)background-color: redposition: fixed
โ
์ ๋ต: 3. background-color: red
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
background-color๋ ์์ํ๊ฒ ์์๋ง ๋ฐ๊พธ๋ ์์ฑ์ด๋ผ ์์ ๋งฅ๋ฝ์ ๋ง๋ค์ง ์์ต๋๋ค. ๋ฐ๋ฉดopacity < 1,transform,filter,position: fixed/sticky๋ฑ์ ๋ชจ๋ ์๋ก์ด ์ฐจ์์ ๋ง๋ค์ด์. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ํนํ
opacity: 0.99๋ ์ ์ฐจ์์ ๋ง๋ ๋ค๋ ๊ฒ ํจ์ ์ด์์. ๊ฑฐ์ ๋ถํฌ๋ช ์ธ๋ฐ๋ ๊ทธ๋ฅ 1์ด ์๋๋ผ๋ ์ด์ ๋ง์ผ๋ก ์ฐจ์์ด ์๊ธด๋ค๋!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์๊น๋ง ๋ฐ๊พธ๋ฉด OK, ํฌ๋ช ๋ยท๋ณํยท์์น๋ฅผ ๊ฑด๋๋ฆฌ๋ฉด ์ ์ฐจ์์ด ์ด๋ฆฐ๋ค!"
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ค๋ฌด ๋๋ ๋ง]
์์ฒ ์ด๊ฐ ๋ง๋ ํค๋(.header)๋ position: sticky; top: 0; z-index: 10;์
๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ณธ๋ฌธ ์์ญ(.content)์ ๋ค์ด๊ฐ๋ ์ด๋ฏธ์ง์ transform: translateZ(0); (GPU ๊ฐ์์ฉ)์ ์คฌ๋๋, ์ด๋ฏธ์ง๊ฐ ํค๋ ์๋ก ํ์ด๋์ ๋ฒ๋ ธ์ต๋๋ค! ํค๋์ z-index๋ฅผ 100์ผ๋ก ์ฌ๋ ค๋ ํด๊ฒฐ๋์ง ์๋ค์. ์ด ํ์์ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ ๋ฌด์์ผ๊น์?
โ
์ ๋ต: transform ์์ฑ์ด ์๋ก์ด ์์ ๋งฅ๋ฝ์ ์์ฑํ์ฌ, ๊ธฐ์กด์ z-index ์์๊ฐ ํด๋น ๋งฅ๋ฝ ์์์ ์ฌํ๊ฐ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
transform์ ๋จ์ํ ๋ชจ์๋ง ๋ฐ๊พธ๋ ๊ฒ ์๋๋ผ ์๋ก์ด ์์ ๋งฅ๋ฝ์ ๋ง๋ญ๋๋ค. ์ด ๋๋ฌธ์ ์ด๋ฏธ์ง ์์๊ฐ ํค๋์ ๋ ์ด์ด ์์๋ฅผ ๋ฐ์ด๋์ด ๋ฒ๋ฆฐ ๊ฒ์ ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ซ์๋ฅผ ํค์ฐ๋ ๊ฑด ๋ต์ด ์๋์์. ์ด๋ฏธ์ง๊ฐ ์ํ ๋ถ๋ชจ ์์์
z-index๋ฅผ ์กฐ์ ํ๊ฑฐ๋, ํค๋์z-index๊ฐ ๋ฌด์กฐ๊ฑด ์ด๊ธธ ์ ์๋ ์์ ์์ค์ ๋งฅ๋ฝ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "z-index๊ฐ ์ ๋๋ฉด ์ฐจ์(Stacking Context)์ ๋ฌธ์ ์ด์ด๋ด๋ผ!"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋ z-index์ ์ ์ฒด๋ฅผ ์๊ณ ๋๋ ๊ทธ๋์ ๋ด ์ฝ๋๊ฐ ์ผ๋ง๋ ๋ฌด์ํ๋์ง ์ ๊ฒ ๊ฐ๋ค.
99999๋ฅผ ์น๋ฉด์๋ "์ ๋ฐ ์ด๊ฒจ๋ผ"๋ผ๊ณ ๋น๊ธฐ๋ง ํ๋๋ฐ, ๊ทธ๊ฒ ์ฐจ์ ๋ฌธ์ ์๋ค๋!
ํนํ opacity๋ transform๋ง ์ค๋ ์๋ก์ด ์ฐจ์์ด ์๊ธด๋ค๋ ์ฌ์ค์ ์ ๋ง ์ถฉ๊ฒฉ์ ์ด์๋ค.
๐ก "z-index๋ ๊ณ ๋๊ฐ ์๋๋ผ ๊ณ๊ธ์ด๋ค. ํ์ง๋ง ๊ทธ ๊ณ๊ธ๋ ์๊ธฐ๊ฐ ์ํ ๊ตญ๊ฐ(Stacking Context)๋ฅผ ๋ฒ์ด๋ ์ ์๋ค."
์ํธ ๋์ด "๋ชจ๋ฌ์ ์ฌ๋งํ๋ฉด ์ต์์๋ก ๋นผ๋ผ"๊ณ ํ์ ๊ฒ ๋ค ์ด๋ฐ ๋ณต์กํ ์ธ์์ ํผํ๊ธฐ ์ํด์์๊ตฌ๋.
์ง์ ๊ฐ์ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ๋๋ก ํ๋ก์ ํธ์ z-index ๋ณ์๋ค์ ์น ์ ๋ฆฌํด์ผ๊ฒ ๋ค.
๋ด์ผ์ '๋ฐ์ํ ๋์์ธ'์ ์ต์ ํธ๋ ๋๋ฅผ ๋ฐฐ์ด๋ค๋๋ฐ, ์ด์ CSS์ ๋์ด ๋ณด์ด๋ ๊ฒ ๊ฐ์ ๋ฟ๋ฏํ๋ค! ๐