最近はPC表示の時でもハンバーガーメニューの表示を見かけるようになった。
スマホファーストだから、デザイン自体がスマホ設計なんだね〜。
そんなyukipanも、スマホファーストでPC表示もハンバーガーメニューで良い派。
だがしかし、まだまだPCで見てる人は多いし、
①ハンバーガーメニュー押す → ②お目当てのメニューページに飛ぶ
という、ユーザーが2回動作をしないと、お目当てのページにたどり着けないのもいかがなものか。(もう慣れちゃった感がある気もする)
サイトのジャンルによって、「PCもハンバーガーメニュー表示パターン」「レスポンシブ対応でスマホのみハンバーガーメニュー表示パターン」の使い分けが必要だ。
今回はレスポンシブ対応版。
PC表示はグローバルナビのリスト表示、スマホ表示はハンバーガーメニュー表示のテンプレで、コピペでサクッと実装できるコードを記載しています。コピペして自由にカスタマイズしてください。
※ヘッダー固定の設定です。
目次
グローバルナビのテンプレ(スマホ表示はハンバーガーメニューで右からメニューが出るバージョン)
HTML
<header class="header">
<div class="header_inner">
<div class="logo">
<h1 class="title">ハンバーガーメニュー</h1>
</div>
<nav class="nav">
<ul class="nav_list">
<li class="nav_item"><a href="#">メニュー1</a></li>
<li class="nav_item"><a href="#">メニュー2</a></li>
<li class="nav_item"><a href="#">メニュー3</a></li>
<li class="nav_item"><a href="#">メニュー4</a></li>
<li class="nav_item"><a href="#">メニュー5</a></li>
</ul>
</nav>
</div>
<div class="hamburger" id="js-hamburger">
<span class="hamburger_border hamburger_border_top"></span>
<span class="hamburger_border hamburger_border_center"></span>
<span class="hamburger_border hamburger_border_bottom"></span>
</div>
<div class="black_bg" id="js-black-bg"></div>
</header>
CSS
.header{
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 60px;
}
.header_inner {
position: relative;
padding: 15px;
}
.logo{
position: absolute;
top: 0;
left: 0;
padding: 10px 15px
}
.title{
font-size: 2rem;
font-weight: 600;
}
/* header固定のため余白をつける。メニューのCSSには関係ない */
.main{
margin-top: 60px;
}
@media only screen and (max-width: 768px) {
.nav {
position: fixed;
right: -320px; /* 右から出てくる */
top: 0;
width: 300px; /* スマホに収まるサイズ */
height: 100vh;
padding-top: 60px;
background-color: #fff;
transition: all .6s;
z-index: 200;
overflow-y: auto; /* メニューが多くなったらスクロールできるように */
}
.hamburger {
position: absolute;
right: 15px;
top: 8px;
width: 40px; /* クリックしやすい幅 */
height: 40px; /* クリックしやすい高さ */
cursor: pointer;
z-index: 300;
}
.nav_list {
margin: 0;
padding: 0;
list-style: none;
}
.nav_item {
text-align: center;
padding: 0 14px;
}
.nav_item a {
display: block;
padding: 8px 0;
border-bottom: 1px solid #eee;
text-decoration: none;
color: #333;
}
.nav_item a:hover {
background-color: #eee;
}
.hamburger_border {
position: absolute;
left: 11px;
width: 18px;
height: 2px;
background-color: #333;
transition: all .6s;
}
.hamburger_border_top {
top: 14px;
}
.hamburger_border_center {
top: 20px;
}
.hamburger_border_bottom {
top: 26px;
}
.black_bg {
position: fixed;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
z-index: 100;
background-color: #333;
opacity: 0;
visibility: hidden;
transition: all .6s;
cursor: pointer;
}
/* 表示された時用のCSS */
.nav-open .nav {
right: 0;
}
.nav-open .black_bg {
opacity: .8;
visibility: visible;
}
.nav-open .hamburger_border_top {
transform: rotate(45deg);
top: 20px;
}
.nav-open .hamburger_border_center {
width: 0;
left: 50%;
}
.nav-open .hamburger_border_bottom {
transform: rotate(-45deg);
top: 20px;
}
}/* sp */
@media only screen and (min-width: 769px) {
.header_inner{
max-width: 980px;
width: 100%;
padding: 15px 30px;
margin-left: auto;
margin-right: auto;
}
.logo{
padding: 12px 30px
}
.nav_list{
text-align: right;
}
.nav_list li{
display: inline-block;
text-align: right;
padding-left: 20px;
}
.nav_list li a{
color: #fff;
font-weight: 600;
}
}/* pc */
JavaScript
function toggleNav() {
var body = document.body;
var hamburger = document.getElementById('js-hamburger');
var blackBg = document.getElementById('js-black-bg');
hamburger.addEventListener('click', function() {
body.classList.toggle('nav-open');
});
blackBg.addEventListener('click', function() {
body.classList.remove('nav-open');
});
}
toggleNav();
参考サイト
https://tech-dig.jp/hamburger-global-nav/
とてもわかりやすく、参考になりました。ありがとうございます。
親切丁寧に解説されているので、ぜひ参考サイトをご覧ください。
ふわっと表示するメニューも作ってみた
横からスライドじゃなくて、ふわっと表示されるメニューを作ってみた。