iOS Safari(WebView) z-index stacking ์ด์Šˆ

iOS Safari ๊ธฐ๋ฐ˜ WebView ํ™˜๊ฒฝ์—์„œ๋Š” transform ์†์„ฑ์ด ์ ์šฉ๋œ ์š”์†Œ๊ฐ€ ๋ณ„๋„์˜ compositing layer(GPU layer) ๋กœ ์Šน๊ฒฉ๋˜๋ฉด์„œ, ๊ธฐ์กด์˜ DOM ๊ธฐ๋ฐ˜ stacking context์™€ ๋‹ค๋ฅธ ๋ Œ๋”๋ง ๊ณ„์ธต์„ ํ˜•์„ฑํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ด๋กœ ์ธํ•ด:

  • z-index ๊ฐ’์ด ๋‚ฎ์€ ์š”์†Œ๋ผ๋„
  • transform์ด ์ ์šฉ๋œ ๊ฒฝ์šฐ

→ ์ผ๋ฐ˜ ๋ ˆ์ด์–ด๋ณด๋‹ค ์ƒ์œ„์— ๋ Œ๋”๋ง๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์›์ธ

  • transform, opacity, will-change ๋“ฑ์˜ CSS ์†์„ฑ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ GPU compositing layer ์ƒ์„ฑ ํŠธ๋ฆฌ๊ฑฐ๋กœ ๋™์ž‘
  • iOS Safari(WebKit)๋Š” ์ด compositing layer๋ฅผ ๋…๋ฆฝ์ ์ธ stacking context๋ณด๋‹ค ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Œ
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ DOM ์ƒ์˜ z-index ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊นจ์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ˜„์ƒ ๋ฐœ์ƒ

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ชจ๋“  ๊ด€๋ จ ์š”์†Œ๋ฅผ ๋™์ผํ•œ compositing layer ์ „๋žต์œผ๋กœ ๋งž์ถ”์–ด ๋ Œ๋”๋ง ๊ณ„์ธต์„ ๊ท ์ผํ™”ํ•œ๋‹ค:

.target {
  transform:translateZ(0);/* or translate3d(0,0,0) */
}
  • ์ฃผ์š” ๋ ˆ์ด์–ด(๊ฒน์นจ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์š”์†Œ๋“ค)์— ์˜๋„์ ์œผ๋กœ transform์„ ์ ์šฉํ•˜์—ฌ
  • ๋ชจ๋“  ์š”์†Œ๋ฅผ GPU layer๋กœ ์Šน๊ฒฉ

→ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋™์ผํ•œ ๊ธฐ์ค€์—์„œ stacking์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์œ ๋„

 

์ฃผ์˜์‚ฌํ•ญ

  • ๋ถˆํ•„์š”ํ•œ GPU layer ์ฆ๊ฐ€๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ
  • ํŠนํžˆ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋งŽ๊ฑฐ๋‚˜ ์š”์†Œ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ๋ Œ๋”๋ง ๋น„์šฉ ์ฆ๊ฐ€
  • ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ตฌ์กฐ์ ์œผ๋กœ stacking context๋ฅผ ์žฌ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฐ”๋žŒ์ง
๋ฐ˜์‘ํ˜•