上毛印刷株式会社

【JavaScript】グローバルナビゲーションに滑るような選択アイコンを表示

【JavaScript】グローバルナビゲーションに滑るような選択アイコンを表示

2023年12月19日
WEBサイト制作
  • #HTML
  • #css
  • #JavaScript
  • #tips

こんにちは!
上毛印刷WEB制作担当のソーヤです。

今回は変わったギミックを紹介します。

実装例

こういうギミックとか動きって、ディレクターやデザイナーから指示がない場合が結構あるので、
コーダーのセンスで実装することってありますよね。

HTML例

<nav class="gnav">
  <div class="gnav__inner">
    <ul class="gnav__list">
      <li class="gnav__list__item current-item">
        <a href="javascript:void(0);">TOP</a>
      </li>
      <li class="gnav__list__item">
        <a href="javascript:void(0);">会社概要</a>
      </li>
      <li class="gnav__list__item">
        <a href="javascript:void(0);">環境保全活動について</a>
      </li>
      <li class="gnav__list__item">
        <a href="javascript:void(0);">開催スケジュール</a>
      </li>
      <li class="gnav__list__item">
        <a href="javascript:void(0);">お問い合わせ</a>
      </li>
    </ul>
    <span class="menu__bar"></span>
  </div>
</nav>

CSS例

.gnav {
  width: 100%;
  height: 50px;
  background: #333;
  box-sizing: content-box;
}
.gnav__inner {
  position: relative;
  box-sizing: content-box;
}
.gnav__list {
  display: -webkit-flex;
  display: -ms-flex;
  display: flex;
  box-sizing: content-box;
  list-style: none;
  justify-content: center;
}
.menu__bar {
  content: '';
  bottom: 0px;
  left: 0;
  position: absolute;
  width: 20%;
  height: 8px;
  background: #ccc;
  -webkit-transition: .4s ease;
  -o-transition: .4s ease;
  transition: .4s ease;
  pointer-events: none;
}
.gnav__list__item {
  width: 20%;
  height: 50px;
  text-align: center;
  box-sizing: content-box;
}
.gnav__list__item a {
  box-sizing: content-box;
  display: block;
  display: flex;
  height: 50px;
  justify-content: center;
  align-items: center;
  font-size: 14px;
  color: #fff;
}

JavaScript例

document.addEventListener('DOMContentLoaded', function() {
    let currentItem = document.querySelector('.current-item');
    let gnavListItems = document.querySelectorAll(".gnav__list__item");
    let menuBar = document.querySelector('.menu__bar');

    gnavListItems.forEach(function(item) {
    item.addEventListener("mouseover", function() {
      menuBar.style.width = item.offsetWidth + "px";
      menuBar.style.left = item.offsetLeft + "px";
    });

    item.addEventListener("mouseout", function() {
      if (currentItem) {
        menuBar.style.width = currentItem.offsetWidth + "px";
        menuBar.style.left = currentItem.offsetLeft + "px";
      } else {
        menuBar.style.width = "0";
      }
    });
  });
});

まとめ

今回もjQueryではなく、Vanilla.jsで実装してみました。

コピペしてガンガン使ってください!

WEB制作担当ソーヤ

ソーヤ

上毛印刷WEB制作担当
前職は東証プライム企業の本社WEB受託チームにてフロントエンドエンジニアを3年経験。


この記事に対するご意見・ご感想・ご質問等ありましたら、
ぜひ下記フォームにてお送りください。

    お名前必須
    メールアドレス必須
    お問い合わせ内容必須
    PAGE TOP