グローバルメニューをドロップダウン式にしてレスポンシブにも対応してみました。
デバイスが縦横の傾きで不具合があったので、修正しました【改修:2019.05.07】
画面サイズが1000px以下になればメニューを折りたたみます。
マウスオーバーでドロップダウン表示に対応しました。メニューが折りたたまれたあとはクリックでドロップダウンを表示します。【更新:2018/04/27】
マウスオーバーでメニューを表示
階層ごとにドロップダウンをするように変更しました。【更新:2019/01/22】
サブメニューをクリックするとメニューと閉じるように修正しました。【更新:2019/05/21】
↑上記の不具合をさらに修正しました。【更新:2019/06/03】
同階層のメニューをクリックすれば他のメニューを閉じる【更新:2019/06/17】
JSを読み込みます
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script type="text/javascript" src="https://codingmania.net/demo/Tool/0046/js/main.js"></script>
JavaScript[main.js]
$(window).on('load orientationchange', function() { setTimeout(function() { var w = window.innerWidth; var point = 1000; if (w > point) { //それ以外のときの処理 $("body").addClass("pc").removeClass("spn"); $(".Nav > ul").removeClass("open close").css("display", "block"); $(".Nav .navbtn a").removeClass("open close").html("<span>メニューを閉じる</span>"); } else { //画面サイズが1000px未満のときの処理 $("body").addClass("spn").removeClass("pc"); $(".Nav > ul").addClass("close").removeClass("open").css("display", "none"); $(".Nav .navbtn a").addClass("close").removeClass("open").html("<span>メニューを開く</span>"); } }, 100); }); //resize $(window).resize(function() { var windowWidth = window.innerWidth; var point = 1000; var timer = false; if (timer !== false) { clearTimeout(timer); } timer = setTimeout(function() { var ww = $(window).width(); if (windowWidth != ww) { if (windowWidth > point) { $("body").addClass("pc").removeClass("spn"); $(".Nav > ul").removeClass("open close").css("display", "block"); $(".Nav > ul > li").css("display","inline-block"); $(".Nav .navbtn a").removeClass("open close").html("<span>メニューを閉じる</span>"); $(".Nav ul li.parent a").removeClass("open").addClass("close"); $(".Nav ul.submenu").slideUp("fast").removeClass("open").addClass("close"); } else { //画面サイズが1000px未満のときの処理 $("body").addClass("spn").removeClass("pc"); $(".Nav > ul").addClass("close").removeClass("open").css("display", "none"); $(".Nav .navbtn a").addClass("close").removeClass("open").html("<span>メニューを開く</span>"); $(".Nav ul li.parent a").removeClass("open").addClass("close"); $(".Nav ul.submenu").slideUp("fast").removeClass("open").addClass("close"); } } else {} }, 50); }); //nav dropdown $(function() { $(".Nav ul li.parent a").each(function() { var submenu = $(this).next("ul.submenu"); var samelevel = $(this).parent().siblings().find("ul.submenu"); var samelevelbtn = $(this).parent().siblings().find("a"); $(this).addClass("close"); $(submenu).addClass("close"); $(this).on('click', function() { if ($(this).hasClass("open")) { $(this).removeClass("open").addClass("close"); $(submenu).slideUp("fast").removeClass("open").addClass("close"); } else { $(samelevel).slideUp("fast").removeClass("open").addClass("close"); $(samelevelbtn).removeClass("open").addClass("close"); $(submenu).slideDown("fast").removeClass("close").addClass("open"); $(this).removeClass("close").addClass("open"); } //return false; }); }); $(document).click(function(event) { if (!$(event.target).closest(".Nav").length) { $(".Nav ul.submenu").slideUp("fast").removeClass("open").addClass("close"); $(".Nav ul li.parent a").removeClass("open").addClass("close"); //alert('changeイベントが発生しました。'); } }); }); //SP nav $(function() { $(".Nav .navbtn a").click(function() { if ($(".Nav > ul").css("display") == "none") { $(".Nav > ul").addClass("open").removeClass("close").slideDown("fast"); $(".Nav > ul > li").css("display","block"); $(this).removeClass("close").addClass("open").html("<span>メニューを閉じる</span>"); } else { $(".Nav > ul").addClass("close").removeClass("open").slideUp("fast"); $(".Nav ul li.parent").removeClass("open").addClass("close"); $(".Nav ul.submenu").slideUp("fast").removeClass("open").addClass("close"); $(this).addClass("close").removeClass("open").html("<span>メニューを開く</span>"); } }); }); //SP アンカーリンク $(function() { $("ul.submenu a[href^='#']").click(function(event) { //alert('changeイベントが発生しました。'); $(".Nav ul.submenu").slideUp("fast").removeClass("open").addClass("close"); $(".Nav ul li.parent a").removeClass("open").addClass("close"); $(".spn .Nav > ul").addClass("close").removeClass("open").slideUp("fast"); $(".spn .Nav .navbtn a").addClass("close").removeClass("open").html("<span>メニューを開く</span>"); //$(this).removeClass("close").addClass("open").html("<span>メニューを閉じる</span>"); }); });
HTMl
<nav class="Nav" role="navigation" aria-label="メインメニュー"> <p class="navbtn"><a href="javascript:void(0)"><span>メニューを開く</span></a></p> <ul> <li><a href="">TOP</a></li> <li><a href="">メニューその1</a></li> <li class="parent"><a href="javascript:void(0)">ドロップダウンメニューその1</a> <ul class="submenu"> <li><a href="https://www.yahoo.co.jp/">Yahoo</a></li> <li><a href="#A">アンカーリンク</a></li> <li class="parent"><a href="javascript:void(0)">更にドロップダウン2</a> <ul class="submenu"> <li><a href="">ドロップダウン3</a></li> <li><a href="">ドロップダウン3</a></li> <li><a href="">ドロップダウン3</a></li> </ul> </li> <li><a href="">ドロップダウン2</a></li> </ul> </li> <li class="parent"><a href="javascript:void(0)">ドロップダウンメニューその2</a> <ul class="submenu"> <li><a href="">ドロップダウン2</a></li> <li><a href="">ドロップダウン2</a></li> <li class="parent"><a href="javascript:void(0)">更にドロップダウン2</a> <ul class="submenu"> <li><a href="">ドロップダウン3</a></li> <li><a href="">ドロップダウン3</a></li> <li><a href="">ドロップダウン3</a></li> </ul> </li> <li><a href="">ドロップダウン2</a></li> </ul> </li> <li><a href="">メニューその2</a></li> <li><a href="">メニューその3</a></li> </ul> <!-- /.Nav --></nav>
CSS
/* Nav -----------------------------------------*/ .Nav { margin-top: 60px; border-top: solid 1px #F5F4F0; border-bottom: solid 1px #F5F4F0; } @media screen and (max-width: 1000px) { .Nav { position: relative; border-top:none; } } .Nav .navbtn { display: none; } @media screen and (max-width: 1000px) { .Nav .navbtn { display: block; position: absolute; top: -50px; right: 10px; } } @media screen and (max-width: 1000px) { .Nav .navbtn a, .Nav .navbtn a.close { display: block; position: relative; width: 40px; height: 40px; background-color: #000; } .Nav .navbtn a::before, .Nav .navbtn a.close::before { position: absolute; top:10px; left:10px; content:""; width: 20px; height: 3px; background-color: #FFF; transition: .2s; } .Nav .navbtn a.open::before { top:19px; transform: rotate(-45deg); -webkit-transform: rotate(-45deg); } .Nav .navbtn a::after, .Nav .navbtn a.close::after { position: absolute; bottom:10px; left:10px; content:""; width: 20px; height: 3px; background-color: #FFF; transition: .2s; } .Nav .navbtn a.open::after { bottom:18px; transform: rotate(-135deg); -webkit-transform: rotate(-135deg); } } @media screen and (max-width: 1000px) { .Nav .navbtn a.open { } } @media screen and (max-width: 1000px) { .Nav .navbtn a span { display: block; overflow: hidden; width: 1px; height: 1px; } .Nav .navbtn a span::after, .Nav .navbtn a.close span::after { position: absolute; top:18px; left:10px; content:""; width: 20px; height: 3px; background-color: #FFF; } .Nav .navbtn a.open span::after { display: none; } } .Nav ul.close { display: none; border-top: solid 1px #F5F4F0; } .Nav > ul { margin: 0 auto; max-width: 1000px; } @media screen and (max-width: 1000px) { .Nav > ul { display: none; position: absolute; top: 0; left: 0; right: 0; z-index: 9; background-color: #FFF; } } .Nav > ul > li { position: relative; font-size: 15px; display: inline-block; } @media screen and (max-width: 1000px) { .Nav > ul > li { display: block; border-bottom: solid 1px #dddddd; } } .Nav > ul > li a { display: block; position: relative; text-decoration: none; padding: 19px 15px; font-size: 15px; color: #333; background-color: #fff; z-index: 2; } .Nav > ul > li.parent > a { padding-right:25px; } .Nav > ul > li.parent > a::before { display: block; content: ""; position: absolute; top: 50%; right: 8px; width: 6px; height: 6px; margin: -6px 0 0 0; border-top: solid 2px #00a0e9; border-right: solid 2px #00a0e9; -webkit-transform: rotate(135deg); transform: rotate(135deg); } @media screen and (max-width: 1000px) { .Nav > ul > li.parent.open > a::before { -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } } @media screen and (max-width: 1000px) { .Nav > ul > li.parent.open { border-bottom: none; } } .Nav > ul > li.parent.open > a{ color: #FFF; } .Nav > ul > li.parent.open > a::after { background: #333; -webkit-transform: scale(1); transform: scale(1); } @media screen and (max-width: 1000px) { .Nav > ul > li.parent.open > a { color: #FFF; } } .Nav > ul > li a:hover { color: #fff; } .Nav > ul > li a::after { position: absolute; z-index: -1; display: block; content: ''; } .Nav > ul > li a, .Nav > ul > li a::after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; -webkit-transition: all .3s; transition: all .3s; } .Nav > ul > li a::after { top: 0; left: 0; width: 100%; height: 100%; -webkit-transform: scale(.5); transform: scale(.5); } .Nav > ul > li a:hover::after { background: #333; -webkit-transform: scale(1); transform: scale(1); } /* 2階層 */ .Nav > ul > li > ul { display: none; position: absolute; top: 53px; left: 0; width: auto; background-color: rgba(255, 255, 255, 0.8); z-index: 9; } @media screen and (max-width: 1000px) { .Nav > ul > li > ul { background-color: #fbfbfb; position: static; } } .Nav > ul > li > ul li { white-space: nowrap; } .Nav > ul > li > ul li a { position: relative; padding: 12px 27px 12px 27px; } @media screen and (max-width: 1000px) { .Nav > ul > li > ul li a { border-bottom: solid 1px #dddddd; background-color: #EEE; } } .Nav > ul > li > ul li a::before { display: block; content: ""; position: absolute; top: 50%; left: 10px; width: 6px; height: 6px; margin: -6px 0 0 0; border-top: solid 2px #00a0e9; border-right: solid 2px #00a0e9; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .Nav > ul > li > ul li a:hover { text-decoration: underline; } @media screen and (max-width: 1000px) { .Nav > ul > li > ul li a:hover { background-color: #FFF; } } .Nav > ul > li > ul li ul li a { padding-left: 42px; } .Nav > ul > li > ul li ul li a::before { left: 20px; }