DigiPress

Highly Flexible WordPress Theme

メニュー

メニューのマウスオーバーで下線がスライドしてついてくるサンプル

メニューのマウスオーバーで下線がスライドしてついてくるサンプル

サイトのグローバルメニューの各メニューをマウスオーバーした時に、アンダーラインがメニュー幅に合わせてスライドしながらアニメーションでついてくるサンプルをご紹介します。
CSSと簡単なjQueryで実装しています。

まずはサンプルをご覧ください。

See the Pen Menu with Underline Sliding Animation by digistate (@digistate) on CodePen.


HTMLの構造

HTMLは至ってシンプル。
メニュー用のリスト(ul)をナビゲーション(nav)タグで括っています。
メニュー用のリスト要素の次に、スライドしてついてくる下線用の要素(#slide-line)があります。jQueryでマウスオーバーに合わせてこの下線の位置を変更してやります。

<nav id="navigation">
  <ul>
    <li class="current-item">
      <a href="#">Home</a>
    </li>
    <li>
      <a href="#">Services</a>
    </li>
    <li>
      <a href="#">Company Profile</a>
    </li>
    <li>
      <a href="#">Contact Us</a>
    </li>
  </ul>
  <span id="slide-line"></span>
</nav>

WordPressのカスタムメニューでは、現在表示しているページのURLがメニューに指定されているURLと同じ場合は、.current-menu-item などのセレクタがclassにセットされますが、サンプルではそれを意識してHomeメニューには .current-item というセレクタを付けてみました。

このセレクタがある場合は、ページを表示した際はカレントのメニューに下線がつくようにしています。

下線用のCSS

下線用の要素(#slide-line)は、絶対位置として移動させるので、親要素(#navigation)には必ず position:relative を指定しておきます。

 #navigation{
  position: relative;
}

下線用の要素(#slide-line)のCSSは、絶対位置(position:absolute)の指定、下線の太さ(高さ=height)、色(backgrond-color)、そしてマウスオーバー時にCSSだけでアニメーションするよう、transition をセットしておきます。

#slide-line{
    position: absolute;
    bottom: 0;
    height: 2px;
    background-color:#75C2FF;
    -webkit-transition: all .3s ease;
    transition: all .3s ease;
}

Javascript

まず、メニューのURLと現在表示しているページのURLが同じ(.current-item がある)場合は、そのメニューに下線がつくようにしています。

currentItem = $(".current-item");
if (currentItem[0]) {
  currentItem.css({
    "width": currentItem.width(),
    "left": currentItem.position().left
  });
}

次がマウスオーバー時に下線が移動するためのコード。
CSSでtransitionを指定しているので、下線はjQueryでアニメーションさせるのではなく、ただ幅と位置をインラインでCSSを書き換えているのみです。

$("#navigation li").hover(
  // ホバー時
  function(){ 
    // ホバーしているメニューの幅と左位置に変更
    $("#slide-line").css({
      "width": $(this).width(),
      "left": $(this).position().left
    });
  },
  // ホバーが外れたとき
  function(){
    // カレントメニューがある場合
    if (currentItem[0]) {
      // カレントメニューに下線を戻す
      $("#slide-line").css({
        "width": currentItem.width(),
        "left": currentItem.position().left
      });
    }
    // カレントメニューがない場合
    else {
      // 下線を消す
      $("#slide-line").width(0);
    }
  }
 );

いかがでしたか? 
jQueryでは位置だけを指定するのみなので、やってみれば結構簡単ですね!

今後の弊社WordPressテーマにもこんなエフェクトの効いたグローバルメニューを実装してみようと思います。

Share / Subscribe
Facebook Likes
Tweets
Hatena Bookmarks
Pinterest
Pocket
Feedly