Web production note

 【更新日 :

【脱Jquery】CSS Gridでスライド系アニメーション(slideDown、slideUp、slideToggle)を実装する

Category:
css / js

アクセシビリティに対応したCSS GridとVanilla JSでスライド系アニメーション(slideDown、slideUp、slideToggle)を実装したサンプルです。

※iPhoneはiOS16以上から動作します。

JavaScriptのみでトグルアニメーションを実装したサンプルは以下をご参照ください。

detailsとsummaryタグでトグルアニメーションを実装したサンプルは以下をご参照ください。

動作サンプル

codepen

See the Pen slideDown slideUp slideToggle Vanilla JS (Web Animations API) by web_corder (@web_walking_nak) on CodePen.

HTML

<button type="button" id="toggle-button-1" class="js-toggle__button" aria-expanded="false" aria-controls="toggle-1">
  開閉ボタン
</button>

<div class="js-toggle__panel" id="toggle-1" role="region" aria-hidden="true" aria-labelledby="toggle-button-1">
  <div class="js-toggle__body">
    開閉パネルのコンテンツ
  </div>
</div>

開閉ボタンの設定

  • id="開閉ボタンのID" を追加。
  • class="js-toggle__button" を追加。
  • aria-expanded="false" を追加。
  • aria-controls="開閉パネルのID" を追加。

開閉パネルの設定

  • class="js-toggle__panel" を追加。
  • id="任意のid" を追加。
  • aria-hidden="true" を追加。
  • aria-labelledby="開閉ボタンのID" を追加。
  • 子要素に <div class="js-toggle__body"> を追加。

CSS

アニメーションに関係するsyle

イージングは環境に合わせて適宜調整してください。

.js-toggle__panel {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.6s cubic-bezier(.16, 1, .3, 1);
}
.js-toggle__panel[aria-hidden="false"] {
  grid-template-rows: 1fr;
}
.js-toggle__body {
  overflow: hidden;
}

ボタンの表示切り替えに関係するstyle

aria-expanded属性の値で判別できます。

/* パネルが開いている時 */
.js-toggle__button[aria-expanded="true"] {
}

/* パネルが閉じている時 */
.js-toggle__button[aria-expanded="false"] {
}

JS

//【アクセシビリティ対応あり】CSS gridで実装する開閉アニメーション
function cssGridToggle() {
  const toggleButtons = document.querySelectorAll('.js-toggle__button');
  //対象が存在しない場合は終了
  if(toggleButtons.length === 0) {
    return;
  }

  //真偽値を文字列で返す
  function getBooleanString(boolean) {
    return boolean.toString();
  }
  
  toggleButtons.forEach(toggleButton => {
    //開閉パネルを取得
    const targetPanelId = toggleButton.getAttribute('aria-controls');
    const targetPanel = document.getElementById(targetPanelId);
    //開閉パネルが存在しない場合はイベントを設定しない
    if(!targetPanel) {
      return;
    }
    toggleButton.addEventListener('click', function() {
      //パネルが開いているかどうかチェック
      const isOpen = targetPanel.getAttribute('aria-hidden') === 'false';
      //アクセシビリティ対応・表示を切り替え
      toggleButton.setAttribute('aria-expanded',getBooleanString(!isOpen));
      targetPanel.setAttribute('aria-hidden',getBooleanString(isOpen));
    });
  });
}

関数の呼び出し

任意の場所で以下を実行し関数を呼び出してください。

cssGridToggle();

参考リンク