≪ Today I learned. RSS購読
公開日
更新日
タグ
HTML, CSS
著者
ダーシノ(@bc_rikko)

height:0→autoをトランジションする

通常、height: 0からheight: autoへのトランジションはできない。height:300pxのように固定高にすればトランジションできるが、内包するコンテンツによってはバグることがある。

calc-size()を使ってheight: calc-size(auto);とすると、内包するコンテンツの高さにあわせてトランジションできる。(※2024-07-01現在、Chrome Canaryでのみ実行可能)

<button id="open">Open</button>
<section class="panel">
  <p>Content</p>
</section>
document.getElementById('open').addEventListener('click', () => {
  document.querySelector('.panel').classList.toggle('expanded')
})
.panel {
  height: 0;
  overflow: hidden;
  transition: height 0.3s;

  &.expanded {
    /* トランジションしない */
    height: auto;

    /* トランジションするけど固定高で、内包するコンテンツによってはバグる*/
    height: 300px;

    /* トランジションする!!!!! */
    height: calc-size(auto);
  }
}

デモ

※2024-07-01現在、Chrome Canaryでのみ実行可能

Content


calc-size()が使えるようになるまでの対応

max-heightを使うことでcalc-size(auto)と同じような効果が得られる。ただし、若干hackyになるので注意。

.expand {
  transition: all 0.2s;
  height: auto;
  overflow: hidden;

  &[aria-hidden="true"] {
    max-height: 0;
  }
  &[aria-hidden="false"] {
    max-height: 100vh;
    visibility: hidden;
  }
}