Engineering note ยท CSS

max-height transition ๋”œ๋ ˆ์ด

2025๋…„ 12์›” 11์ผ์ดํ˜„์ˆ˜
ํƒœ๊ทธcss

accordion ์„ ๋งŒ๋“ค๋ฉฐ height ๋ฅผ ์กฐ์ •ํ•ด ์ ‘๊ณ  ํŽผ์นจ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋”œ๋ ˆ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์™€ ํ—ค๊ฒฐ, ๊ฒฝํ—˜์„ ๊ณต์œ .

css
.memo-text {
  word-break: break-word;
  max-height: 48px;
  transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
  overflow: hidden;
  position: relative;
  will-change: max-height;
  
  &.memo-text-expanded {
    max-height: 1000px;
    transition: max-height 1s ease-in-out;
    
    &::after {
      opacity: 0;
    }
  }
}

max-height transition ๋”œ๋ ˆ์ด

์ด๋ ‡๊ฒŒ 2์ค„ ์ด์ƒ์ผ ๋•Œ ์•„๋ž˜ ๊ทธ๋ผ๋ฐ์ด์…˜์ด ์ƒ๊ธฐ๊ณ  (::after ๋ถ€๋ถ„) ์ ‘๊ณ  ํŽผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. max-height ๋ฅผ ์กฐ์ ˆํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ํŽผ์น  ๋•Œ๋Š” ๋„ˆ๋ฌด ๋น ๋ฅด๊ณ , ๋‹ซ์„ ๋•Œ๋Š” ๋„ˆ๋ฌด ๋А๋ฆฐ ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ฒ˜๋Ÿผ cubic-bezier ๋ฅผ ์กฐ์ ˆํ–ˆ๋‹ค.

!hint It's because you're animating betweenย 0ย andย 1000pxย max-height, but your content is only aboutย 120pxย high. The delay is the animation happening on the 880 pixels you can't see. max-height ๊ฐ€ 1000px ์—์„œ 0์œผ๋กœ ์ฃผ๋Š” ๋™์•ˆ 120px ์งœ๋ฆฌ์˜ ์ปจํ…์ธ ๋Š” ์•„๋ฌด ๋™์ž‘์„ ์•ˆํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์ด๋‹ค.

css
.text {
  overflow: hidden;
  max-height: 0;
  transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
  &.full {
    max-height: 1000px;
    transition: max-height 1s ease-in-out;
}

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ๊ทน๋‹จ์ ์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋™์ž‘ ์ง€์ ์„ ๋‹จ์ถ•์‹œํ‚ค๋ฉด์„œ ํ•ด๊ฒฐํ•œ๋“ฏ ํ•˜๋‹ค.

์ข‹์•„์š”์™€ ๋Œ“๊ธ€

๋Œ“๊ธ€ ๋‚จ๊ธฐ๊ธฐ

๋Œ“๊ธ€ 0๊ฐœ

๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.