CSSアニメーション 様々なデザインの実装
–メガメニュー– #2
Webサイトでよく見かけるアニメーションを実装していきます。こちらではサンプルコードを配布しておりますので、ぜひご活用ください。
今回はメガメニューについて実装していきます。メガメニューは、ウェブサイトやアプリケーションのナビゲーションメニューの一種です。通常のドロップダウンメニューとは異なり、より大規模なコンテンツを表示することができます。詳細は以下の動画を参照ください。
実装内容
メニューの「取り扱い保険」をホバーすると、メガメニューが表示され、黒色のガバーで全体が覆われます。この状態では、ロゴとメニュー以外は見えなくなります。
このような実装になります。
コードの解説
※こちらはサンプルコードの解説になります。ぜひ上記のサンプルコードをダウンロードください。
ポイント解説
・z-indexを使用して調整する。本件では、高 メニュー/ロゴ → カバー → body 小 となる。
・本件では、メガメニューの表示CSSのホバーアニメーションで実装すると同時に、Javascriptでカバーを表示するイベントを発火している。
具体的なコードを見ていきましょう。
SCSS
// z-indexで調整 .content__cover { background-color: $cBlack; cursor: pointer; height: 100%; left: 0; opacity: 0; position: absolute; top: 0; transition: 1s; visibility: hidden; width: 100%; z-index: 1; /* 重要 */ } .header__logo { z-index: 2; /* 重要 */ } li { &.header-menu__list { z-index: 2; /* 重要 */ color: $cWhite; display: flex; align-items: center; justify-content: center; height: 100px; &:hover { .header-mega { transition: 0.5s; visibility: visible; opacity: 1; } } } }
カバー・ロゴ・リストそれぞれにz-indexを指定します。
リストにはホバーアニメーションを設定します。
HTML
<nav class="header__nav lg-block"> <ul class="flex-row"> <li> <a class="menu__a" href="about.html">私たちについて</a> </li> <!-- メガメニュー --> <li class="header-menu__list flex-column"> 取り扱い保険 <div class="header-mega flex-column absolute"> <ul class="flex-row"> <li class="header-mega__img"> <a href="/"><img src="./images/header/img-1.png" alt="" /></a> <div class="flex-row"> <a class="mega-menu__a" href="/">メニュー </a> <span></span> </div> </li> <!-- /.header-mega__img --> <li class="header-mega__img"> <a href="/"><img src="./images/header/img-1.png" alt="" /></a> <div class="flex-row"> <a class="mega-menu__a" href="/">メニュー </a> <span></span> </div> </li> <!-- /.header-mega__img --> <li class="header-mega__img"> <a href="/"><img src="./images/header/img-1.png" alt="" /></a> <div class="flex-row"> <a class="mega-menu__a" href="/">メニュー </a> <span></span> </div> </li> <!-- /.header-mega__img --> </ul> <ul class="flex-row"> <li class="header-mega__img"> <a href="/"><img src="./images/header/img-1.png" alt="" /></a> <div class="flex-row"> <a class="mega-menu__a" href="/">メニュー </a> <span></span> </div> </li> <!-- /.header-mega__img --> <li class="header-mega__img"> <a href="/"><img src="./images/header/img-1.png" alt="" /></a> <div class="flex-row"> <a class="mega-menu__a" href="/">メニュー </a> <span></span> </div> </li> <!-- /.header-mega__img --> <li class="header-mega__img"> <a href="/"><img src="./images/header/img-1.png" alt="" /></a> <div class="flex-row"> <a class="mega-menu__a" href="/">メニュー </a> <span></span> </div> </li> <!-- /.header-mega__img --> </ul> </div> <!-- /.flex-column --> </li> <!-- /.header-menu__list --> <li><a class="menu__a" href="recruit.html">採用情報</a></li> <li><a class="menu__a" href="news.html">お知らせ</a></li> <li class="contact"> <a class="menu__a" href="contact.html"> <span class="fw-bold">お問い合わせ</span> </a> </li> </ul> </nav> <!-- /.header__nav -->
メガメニューは、親子関係を作る必要があります。具体的には、ul要素の中にさらにul要素を設定し、ホバーアニメーションが正しく機能するように設定しています。
Javascript
export class Onclick { constructor() { this.DOM = {}; this.DOM.container = document.querySelector("#global-container"); this._megaMenu(); } // メガメニュー _megaMenu() { const cover = document.querySelector(".content__cover"); const list = document.querySelector(".header-menu__list"); list.addEventListener("mouseover", () => { cover.style.opacity = 1; cover.style.visibility = "visible"; }); list.addEventListener("mouseout", () => { cover.style.opacity = 0; cover.style.visibility = "hidden"; }); } }
イベントの発火にはmouseoverを使用します。そしてイベントの解除にはmouseoutを使用し、それぞれのstyleを変更します。
イベントが発火しやすくするためには、メニューの高さを十分に確保することも重要です。
以上です。ぜひお試しください。もし実装できずにお困りの場合やご質問があれば、お問い合わせフォームからお問い合わせくださいませ。
- z-indexでホバーしたときの重なり順を調整
- CSSのホバーアニメーションが機能するよう、メガメニューは親子関係を設定
- Javascriptのイベント発火にはmouseover、解除にはmouseout