【レスポンシブメニュー】コピペで簡単!CSSとjQueryでの実装方法

昨日はカープがまた負けて、ついに3連敗。日本シリーズ優勝できるのだろうか・・・。テンション下がり気味ですが、この話は置いといて。

今回は、今や必須であるレスポンシブWEBデザイン(モバイルフレンドリー)。そんなレスポンシブ対応したメニューの作成方法をサンプルコード付きでご紹介します。

スマホでタップするとボワっと出現するあのメニューの実装方法になります。ドロワーメニュー(ハンバーガーメニュー)です。なぜハンバーガーメニューと呼ばれるのかというと、三本の線がハンバーガーっぽいからですかね。上下がバンズ、中がハンバーグ的な感じですね。

それではサンプルコードをどうぞ!

 

HTML

<div id="wrap">
<header>
<div class="inner clearfix">
<h1>LOGO</h1>
<p class="button">
<span></span>
<span></span>
<span></span>
</p>
<nav role="navigation" style="margin-top: 93px;">
<ul class="clearfix">
<li><a href="#">Menu.1</a></li>
<li><a href="#">Menu.2</a></li>
<li><a href="#">Menu.3</a></li>
<li><a href="#">Menu.4</a></li>
<li><a href="#">Menu.5</a></li>
</ul>
</nav>
</div>
</header>

<div id="contents"><div class="overlay" style="display: none;"></div>
<p>テキスト</p>

</div>
</div>

 

CSS

.clearfix:before,
.clearfix:after {
    content: " ";
    display: table;
}

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}

body {
    font-family: "Helvetica Neue", Helvetica, 游ゴシック, YuGothic, "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Verdana, メイリオ, Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif;
}

.fixed {
    position:fixed;
    top:0;
    left:0;
    width:100%;
}

.overlay {
	position: fixed;
	top: 0;
	left: 0;
	display: none;
	width: 100%;
	height: 100%;
	background: #666666;
	opacity: 0.7;
	filter: alpha(opacity=70);
	-ms-filter: "alpha(opacity=70)";
	z-index: 999;
}


header  {
    position:fixed;
    top:0;
    left:0;
    width:100%;
    background:#fff;
    box-shadow: 0 0 3px rgba(0, 0, 0, .2);
    z-index:9999;
    -webkit-user-select:none;
    -moz-user-select:none;
    user-select:none;
}
header .inner {
    position:relative;
    max-width:1080px;
    margin:0 auto;
    padding:0.5em 0;
    -webkit-box-sizing:border-box;
    -moz-box-sizing:border-box;
    box-sizing:border-box;
}
header h1 {
    float:left;
    width:20%;
    margin-top: 1em;
    font-size:40px;
    font-weight:bold;
}


header nav {
    float:right;
    width: 60%;
}

header.navOpen nav {
	opacity: 1;
	right: 0;
}
header nav ul {
    width: 100%;
	padding: 0 0 0 0px;
}
header nav ul li {
    float:left;
    width: 16.6666%;
	list-style:none;
}
header nav ul li a {
    position:relative;
    display:block;
    padding:1.5em;
    color:#999;
    text-decoration:none;
}
header nav ul li a:hover {
	text-decoration: underline;
}


header .button {
	display: none;
	width: 30px;
	position: absolute;
	top: 20px;
	right: 15px;
	cursor: pointer;
}
header .button span {
	display: block;
	height: 4px;
	width: 100%;
	background: #000000;
	border-radius: 2px;
	-webkit-transition: all .5s ease-in-out;
	-moz-transition: all .5s ease-in-out;
	transition: all .5s ease-in-out;
}
header .button span:nth-of-type(2),
header .button span:nth-of-type(3) {
	margin-top: 5px;
}

header.navOpen .button span:nth-of-type(1) {
	-webkit-transform: translateY(9px) translateX(0) rotate(45deg);
	-ms-transform: translateY(9px) translateX(0) rotate(45deg);
	transform: translateY(9px) translateX(0) rotate(45deg);
}
header.navOpen .button span:nth-of-type(2) {
	margin-top: 5px;
	opacity: 0;
	-webkit-transform: translateY(9px);
	-ms-transform: translateY(9px);
	transform: translateY(9px);
}
header.navOpen .button span:nth-of-type(3) {
	-webkit-transform: translateY(-9px) translateX(0) rotate(-45deg);
	-ms-transform: translateY(-9px) translateX(0) rotate(-45deg);
	transform: translateY(-9px) translateX(0) rotate(-45deg);
}

#contents {
    max-width: 1080px;
    margin:120px auto 0;
    padding:1em 1.5em;
    line-height:1.5;
}
#contents p {
	margin: 50px 0 0 0;
}



@media screen and (max-width:1080px){
header .inner {
	padding: 1.5em;
}
header h1 {
	width: 30%;
	margin-top: 0em;
}
header nav {
	width:70%;
}
header nav ul li {
	width: 25%;
}
#contents {
	margin-top:180px;
}
}

@media screen and (max-width:480px){
header h1 {
	width: auto;
	margin-top: 0;
}
header .button {
	display:block;
}
header nav {
	overflow:auto;
	position: fixed;
	top: 0;
	right: -70%;
	float:none;
	width: 45%;
	max-width:320px;
	height: 100%;
	background: #fff;
	opacity: 0;
	z-index:9999;
}
header nav ul li {
	float: none;
	width: auto;
}
#contents {
	margin-top:80px;
}
}

 

jQuery

<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript">
$(function(){
$('#contents').prepend('<div class="overlay"></div>');
$('.button').click(function() {
	$('header').toggleClass('navOpen');
	$('#wrap').toggleClass('fixed');
	$('.overlay').toggle();
	var headerH = $('header').outerHeight();
	if ($('header').hasClass('navOpen')) {
		$('header nav').css('marginTop', headerH + 'px');
	}
});


$('.overlay').click(function() {
	$(this).fadeOut(300);
	$('header').removeClass('navOpen');
	$('#wrap').removeClass('fixed');
});

$(window).on('load resize', function() {
	var breakpoint = 640;
	if (window.innerWidth > breakpoint) {
		$('header').removeClass('navOpen');
		$('#wrap').removeClass('fixed');
		$('.overlay').hide();
		$('header nav').css('marginTop', 0 + 'px');
	}
});
});
</script>

 

デモページ