TEORICO

【jQuery】クリック時に上からするっと降りてくるメニュー

【jQuery】クリック時に上からするっと降りてくるメニュー

【jQuery】クリック時に上からするっと降りてくるメニュー

クリック時に上からするっと降りてくるグローバルメニュー

クリックした時グローバルナビゲーションのサブメニューをどうするか、制作をする上で意外に迷うところです。

下層でさらに選んでもらう形にするのか、単純に縦に降りてくるアコーディオン形式のメニューにするのか、などですね。

あまりに複雑になるとユーザーに負担をかけますし、かといってむやみにメニューは削れない。

そういった時の選択肢の一つとして参考にしていただけたらと思います。

HTML

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<nav class="g_nav">
<ul class="g_nav--menu">
<li><a href="#">メニュー</a></li>
<li><a href="#">メニュー2</a></li>
<li class="g_nav--sub"> <a href="#">メニュー3</a>
<ul class="g_nav--submenu">
<li><a href="#">サブメニュー</a></li>
<li><a href="#">サブメニュー</a></li>
<li><a href="#">サブメニュー</a></li>
</ul>
</li>
<li class="g_nav--sub"> <a href="#">メニュー4</a>
<ul class="g_nav--submenu">
<li><a href="#">サブメニュー</a></li>
<li><a href="#">サブメニュー</a></li>
<li><a href="#">サブメニュー</a></li>
</ul>
</li>
</ul>
</nav>
<nav class="g_nav"> <ul class="g_nav--menu"> <li><a href="#">メニュー</a></li> <li><a href="#">メニュー2</a></li> <li class="g_nav--sub"> <a href="#">メニュー3</a> <ul class="g_nav--submenu"> <li><a href="#">サブメニュー</a></li> <li><a href="#">サブメニュー</a></li> <li><a href="#">サブメニュー</a></li> </ul> </li> <li class="g_nav--sub"> <a href="#">メニュー4</a> <ul class="g_nav--submenu"> <li><a href="#">サブメニュー</a></li> <li><a href="#">サブメニュー</a></li> <li><a href="#">サブメニュー</a></li> </ul> </li> </ul> </nav>
<nav class="g_nav">
  <ul class="g_nav--menu">
    <li><a href="#">メニュー</a></li>
    <li><a href="#">メニュー2</a></li>
    <li class="g_nav--sub"> <a href="#">メニュー3</a>
      <ul class="g_nav--submenu">
        <li><a href="#">サブメニュー</a></li>
        <li><a href="#">サブメニュー</a></li>
        <li><a href="#">サブメニュー</a></li>
      </ul>
    </li>
    <li class="g_nav--sub"> <a href="#">メニュー4</a>
      <ul class="g_nav--submenu">
        <li><a href="#">サブメニュー</a></li>
        <li><a href="#">サブメニュー</a></li>
        <li><a href="#">サブメニュー</a></li>
      </ul>
    </li>
  </ul>
</nav>

CSS

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
body {
margin: 0;
padding: 0;
}
.g_nav {
background: #078EF6;
width: 100%;
height: 50px;
margin: 0 auto;
}
.g_nav--menu {
margin: 0;
list-style: none;
color: #000;
padding: 0;
}
.g_nav--menu::after {
content: "";
display: block;
clear: both;
}
.g_nav--menu li {
float: left;
width: 25%;
}
.g_nav--menu li:last-child {
margin-right: 0;
}
.g_nav--menu a {
line-height: 50px;
display: block;
text-decoration: none;
color: #fff;
text-align: center;
}
.g_nav--submenu {
margin: 0;
padding: 0;
display: none;
position: absolute;
top: 50px;
left: 0;
width: 100%;
list-style: none;
}
.g_nav--submenu::after {
content: "";
display: block;
clear: both;
}
.g_nav--submenu li {
background: rgba(0, 0, 0, 0.7);
margin: 0;
padding: 0;
width: 33.33%;
float: left;
text-align: center;
}
body { margin: 0; padding: 0; } .g_nav { background: #078EF6; width: 100%; height: 50px; margin: 0 auto; } .g_nav--menu { margin: 0; list-style: none; color: #000; padding: 0; } .g_nav--menu::after { content: ""; display: block; clear: both; } .g_nav--menu li { float: left; width: 25%; } .g_nav--menu li:last-child { margin-right: 0; } .g_nav--menu a { line-height: 50px; display: block; text-decoration: none; color: #fff; text-align: center; } .g_nav--submenu { margin: 0; padding: 0; display: none; position: absolute; top: 50px; left: 0; width: 100%; list-style: none; } .g_nav--submenu::after { content: ""; display: block; clear: both; } .g_nav--submenu li { background: rgba(0, 0, 0, 0.7); margin: 0; padding: 0; width: 33.33%; float: left; text-align: center; }
body {
  margin: 0;
  padding: 0;
}

.g_nav {
  background: #078EF6;
  width: 100%;
  height: 50px;
  margin: 0 auto;
}

.g_nav--menu {
  margin: 0;
  list-style: none;
  color: #000;
  padding: 0;
}

.g_nav--menu::after {
  content: "";
  display: block;
  clear: both;
}

.g_nav--menu li {
  float: left;
  width: 25%;
}

.g_nav--menu li:last-child {
  margin-right: 0;
}

.g_nav--menu a {
  line-height: 50px;
  display: block;
  text-decoration: none;
  color: #fff;
  text-align: center;
}

.g_nav--submenu {
  margin: 0;
  padding: 0;
  display: none;
  position: absolute;
  top: 50px;
  left: 0;
  width: 100%;
  list-style: none;
}

.g_nav--submenu::after {
  content: "";
  display: block;
  clear: both;
}

.g_nav--submenu li {
  background: rgba(0, 0, 0, 0.7);
  margin: 0;
  padding: 0;
  width: 33.33%;
  float: left;
  text-align: center;
}

jQuery

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$(function () {
$('.g_nav--sub').on('click', function () {
var click_index = $('.g_nav--sub').index(this);
$('.g_nav--submenu').stop().slideUp();
$('.g_nav--submenu:eq(' + click_index + ')').stop().slideToggle();
});
$('.g_nav').mouseleave(function () {
$('.g_nav--submenu').stop().slideUp();
});
});
$(function () { $('.g_nav--sub').on('click', function () { var click_index = $('.g_nav--sub').index(this); $('.g_nav--submenu').stop().slideUp(); $('.g_nav--submenu:eq(' + click_index + ')').stop().slideToggle(); }); $('.g_nav').mouseleave(function () { $('.g_nav--submenu').stop().slideUp(); }); });
$(function () {
  $('.g_nav--sub').on('click', function () {
    var click_index = $('.g_nav--sub').index(this);
    $('.g_nav--submenu').stop().slideUp();
    $('.g_nav--submenu:eq(' + click_index + ')').stop().slideToggle();
  });
  $('.g_nav').mouseleave(function () {
    $('.g_nav--submenu').stop().slideUp();
  });
});

ソースは上記の3点です。

ポイントとしては、index()メソッドを利用して何番目のセレクタなのかというのを取得するところ

そして、eq()メソッドを利用して指定するところでしょうか。

jQueryの3行目にvar click_index = $(‘.g_nav–sub’).index(this);と書いています。

ここですが、index()の引数としてthisを設定しています。

そもそも

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$('.g_nav--sub').on('click',function(){
$('.g_nav--sub').on('click',function(){
$('.g_nav--sub').on('click',function(){

このようにイベントハンドラを設定しているのですが、

$(this).index(this);じゃダメなの?と思うかもしれません。

thisの中身はg_nav–subのオブジェクトを指します

今回indexで取得したい検索したいものはエレメントであってオブジェクトでは無いというところに繋がります。

ですので、thisではなくg_nav–subを指定します。

そしてeq()メソッドでのセレクタの書き方

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$('.g_nav--submenu:eq('+ click_index +')')
$('.g_nav--submenu:eq('+ click_index +')')
$('.g_nav--submenu:eq('+ click_index +')')

このように指定しています。

そのままeq(click_index)としてしまうと文字列として扱われますので、一度シングル(もしくはダブル)クォーテーションで区切り+で連結させます。

このようにすればセレクタの中にあるメソッドの引数に対して変数を使用することが出来ます。

サンプルを準備してます。

(メニューの3と4にサブナビゲーションがあるので、そちらをクリックしていただけると動きがわかるかと)

デモ

今回使用したメソッド(わからなかったら検索!)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
index();
stop();
slideUp();
eq();
slideToggle();
index(); stop(); slideUp(); eq(); slideToggle();
index();
stop();
slideUp();
eq();
slideToggle();