Open2

77. ポップオーバーとダイアログのアニメーション

たかもそたかもそ

CSSだけでPopover APIや <dialog> 要素の表示・非表示アニメーションを実装できます。

たかもそたかもそ
<button class="button" popovertarget="mypopover">ポップオーバーを開く</button>
<button class="button" onclick="mydialog.showModal()">ダイアログを開く</button>

<div id="mypopover" class="popover" popover>ポップオーバーの内容</div>

<dialog id="mydialog" class="dialog">
  <button onclick="mydialog.close()">閉じる</button>
</dialog>
.popover, .dialog {
  &, &::backdrop {
    opacity: 0;  /* [1] */
    transition-property: opacity, overlay, display;  /* [2] */
    transition-duration: 0.6s;
    transition-behavior: normal, allow-discrete, allow-discrete;  /* [2] */
  }
  
  &::backdrop {
    background-color: rgba(0 0 0 / 40%);  /* [3] */
  }
}

.popover:popover-open, .dialog:modal {
  &, &::backdrop {
    opacity: 1;  /* [4] */
  }

  @starting-style {
    &, &::backdrop {
      opacity: 0;  /* [5] */
    }
  }
}
  1. ポップオーバーやダイアログを閉じた後の状態。
  2. overlay はポップオーバーやダイアログが最上位レイヤーにレンダリングされるかどうかを指定するプロパティで transition-behavior と一緒に使うことで意味をもちます。overlaydisplaytransition-behavior: allow-discrete; を指定すると表示と非表示の2パターンしかないプロパティにもトランジションを適用できます。
  3. ポップオーバーやダイアログの背景部分のスタイル。
  4. ポップオーバーやダイアログを開いたときのスタイル。
  5. ポップオーバーやダイアログを閉じたときのスタイル。