【レスポンシブメニュー】コピペで簡単!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>
コメントを書く
コメントを投稿するにはログインしてください。