August 15, 2025

πŸ‘» 보이지 μ•ŠλŠ” μ„±λŠ₯ ν•˜λ½: CSS `will-change` 였용과 λ ˆμ΄μ–΄ 폭탄

CSS
μ„±λŠ₯
μ• λ‹ˆλ©”μ΄μ…˜/UI
μ›Ήν‘œμ€€
λ Œλ”λ§μ „λž΅

Summary

will-changeλ₯Ό λ‚¨μš©ν•˜λ©΄ λΆˆν•„μš”ν•œ λ ˆμ΄μ–΄κ°€ κ³Όλ„ν•˜κ²Œ μƒμ„±λ˜μ–΄ μ„±λŠ₯ μ €ν•˜λ₯Ό μœ λ°œν•©λ‹ˆλ‹€. ν•„μš”ν•œ μ†μ„±μ—λ§Œ μ œν•œμ μœΌλ‘œ μ‚¬μš©ν•˜κ³ , μ• λ‹ˆλ©”μ΄μ…˜ μ’…λ£Œ ν›„μ—λŠ” μ΄ˆκΈ°ν™”ν•˜μ—¬ λ¦¬μ†ŒμŠ€λ₯Ό νšŒμˆ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Why Wrong?

will-changeλŠ” λΈŒλΌμš°μ €μ—κ²Œ νŠΉμ • 속성이 변경될 μ˜ˆμ •μž„μ„ 미리 μ•Œλ € μ΅œμ ν™”λ₯Ό μœ λ„ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ, λ„ˆλ¬΄ λ§Žμ€ μš”μ†Œμ— λ‚¨μš©ν•˜κ±°λ‚˜ λͺ¨λ“  속성에 μ μš©ν•˜λ©΄(예: will-change: all;) λΈŒλΌμš°μ €κ°€ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  λ ˆμ΄μ–΄λ₯Ό μƒμ„±ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λŠ” 였히렀 μ„±λŠ₯을 μ €ν•˜μ‹œν‚€κ³ , 초기 λ Œλ”λ§ μ‹œκ°„μ„ 늘리며, 심지어 ν¬λž˜μ‹œλ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, will-changeλŠ” 예츑 κ°€λŠ₯ν•œ μ„±λŠ₯ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜μ–΄μ•Ό ν•˜λ©°, λ§‰μ—°ν•œ μ„±λŠ₯ ν–₯상을 κΈ°λŒ€ν•˜λ©° μ‚¬μš©ν•˜λŠ” 것은 μ§€μ–‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

How to Fix?

will-changeλŠ” ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ œν•œμ μœΌλ‘œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 변경될 κ°€λŠ₯성이 높은 속성을 λͺ…ν™•νžˆ μ§€μ •ν•˜κ³ , ν•΄λ‹Ή μš”μ†Œκ°€ μ‹€μ œλ‘œ μ• λ‹ˆλ©”μ΄μ…˜μ΄λ‚˜ νŠΈλžœμ§€μ…˜μ΄ μ‹œμž‘λ˜κΈ° 직전에 will-changeλ₯Ό μ μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ• λ‹ˆλ©”μ΄μ…˜μ΄ λλ‚œ ν›„μ—λŠ” will-changeλ₯Ό μ œκ±°ν•˜κ±°λ‚˜ will-change: initial;둜 μ΄ˆκΈ°ν™”ν•˜μ—¬ λΈŒλΌμš°μ €κ°€ ν• λ‹Ήλœ λ¦¬μ†ŒμŠ€λ₯Ό νšŒμˆ˜ν•˜λ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ, 개발자 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ λ ˆμ΄μ–΄ 생성 ν˜„ν™©μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³ , λΆˆν•„μš”ν•œ λ ˆμ΄μ–΄ 생성을 μ€„μ΄λŠ” 방법을 μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€. transformκ³Ό opacityλŠ” λ ˆμ΄μ–΄λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  μ• λ‹ˆλ©”μ΄μ…˜μ„ μ²˜λ¦¬ν•  수 μžˆλŠ” λŒ€ν‘œμ μΈ μ†μ„±μ΄λ―€λ‘œ 적극적으둜 ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Before Code (Bad)

/* κ³Όλ„ν•œ will-change μ‚¬μš© (μ•ˆν‹°νŒ¨ν„΄) */
.element {
  will-change: all;
  transition: transform 0.3s ease-in-out;
}

.another-element {
  will-change: transform, opacity, top, left, width, height; /* λ„ˆλ¬΄ λ§Žμ€ 속성 μ§€μ • */
}

After Code (Good)

/* μ˜¬λ°”λ₯Έ will-change μ‚¬μš© */
.element {
  transition: transform 0.3s ease-in-out;
}

.element:hover {
  will-change: transform; /* ν˜Έλ²„ μ‹œμ μ— will-change 적용 */
  transform: scale(1.1);
}

/* μ• λ‹ˆλ©”μ΄μ…˜ μ’…λ£Œ ν›„ will-change μ΄ˆκΈ°ν™” (JavaScript) */
const element = document.querySelector('.element');

element.addEventListener('transitionend', () => {
  element.style.willChange = 'initial';
});