スマホサイトの作成をしていると、どのタイプのナビゲーションメニューを実装するか迷います。
コンテンツ量が多いと、アコーディオンメニューだと開き過ぎるとか、コンテンツ量が少ないと横型スライドだと、わびしい感じがあったりとか、そのサイトに適したナビゲーションメニューの選択が必要になるということは、必然的にレパートリーが必要になるということ。そんな訳で今回はLightroom風のポップアップタイプのモーダルウインドウ式のナビゲーションメニューを作成したので備忘録としてまとめておきます。
そもそも、「モーダルウィンドウってナニ?」って方は、Twitterで交流のある@arayutwさんがまとめている「初心者でも分かる!モーダルウィンドウの作り方」って記事でめちゃくちゃ丁寧にまとめられているので、そちらをご参照いただくことをオススメします。かくいう僕も今回のナビゲーションを作成できたのはこの記事のおかげです。
今回作成したナビゲーションメニューはコンテンツが枝分かれして、数が多いタイプのサイト向けかと思います。
↓こんな感じの

ウィンドウが開いてる間は、他の操作ができないし、開いてる状態でも指でスクロールできるので、使い勝手もいいかと思います。
まず、マークアップしたHTMLはこんな感じ
<p>↓クリックしたら、ナビゲーション表示</p> <a data-target="menu01" class="modal-open">menu</a> <div id="menu01" class="modal-content"> <p class="close_top"><a class="modal-close">閉じる</a></p> <ul> <li class="lavel"><a href="#">WebDesign</a></li> <ul class="nav_box"> <li><a href="#">html</a></li> <li><a href="#">CSS</a></li> <li><a href="#">jQuery</a></li> <li><a href="#">PHP</a></li> </ul><!-- /.nav_box --> <li class="lavel"><a href="#">Application</a></li> <ul class="nav_box"> <li><a href="#">Illustrator</a></li> <li><a href="#">Photoshop</a></li> <li><a href="#">Fireworks</a></li> <li><a href="#">Dreamweaver</a></li> <li><a href="#">Premire</a></li> <li><a href="#">AfterEffects</a></li> </ul><!-- /.nav_box --> <li class="lavel"><a href="#">Private</a></li> <ul class="nav_box"> <li><a href="#">Manga</a></li> <li><a href="#">Television</a></li> <li><a href="#">Alcohol</a></li> </ul><!-- /.nav_box --> </ul> <p class="close_bottom"><a class="modal-close">閉じる</a></p> </div><!-- /.modal-content -->
ポイントはメニューボタン部分を「data-target」を指定して、ポップアップで表示させるナビゲーションの<div>のIDと合わせます。今回は「menu01」とします。
ポップアップ表示させたい部分は「.modal-content」で指定します。
これの便利なところは、「閉じる」ボタンを「.modal-close」で指定しておけば、複数表示させれる事なので、ナビゲーションの最上部と最下部に「閉じる」ボタンを設置しました。
まず、お決まりの本家jQueryを読み込みます。
その他、jQueryの記述が長くなるので、別でJSファイルを作成して、それも読み込ませます。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" src="js/modal.js"></script>
$(function(){
// 「.modal-open」をクリック
$('.modal-open').click(function(){
// スクロールバーの横幅を取得
var scrollsize = $(window).width() - $('body').prop('clientWidth');
// html、bodyを固定(overflow:hiddenにする)
$('html, body').addClass('lock');
// オーバーレイ用の要素を追加
$('body').append('<div class="modal-overlay"></div>');
// オーバーレイをフェードイン
$('.modal-overlay').fadeIn('slow');
// モーダルコンテンツのIDを取得
var modal = '#' + $(this).attr('data-target');
// モーダルコンテンツを囲む要素を追加
$(modal).wrap("<div class='modal-wrap'></div>");
// モーダルコンテンツを囲む要素を表示
$('.modal-wrap').show();
// モーダルコンテンツの表示位置を設定
modalResize();
// モーダルコンテンツフェードイン
$(modal).fadeIn('slow');
// モーダルコンテンツをクリックした時はフェードアウトしない
$(modal).click(function(e){
e.stopPropagation();
});
// 「.modal-overlay」あるいは「.modal-close」をクリック
$('.modal-wrap, .modal-close').off().click(function(){
// モーダルコンテンツとオーバーレイをフェードアウト
$(modal).fadeOut('slow');
$('.modal-overlay').fadeOut('slow',function(){
// html、bodyの固定解除
$('html, body').removeClass('lock');
// オーバーレイを削除
$('.modal-overlay').remove();
// モーダルコンテンツを囲む要素を削除
$(modal).unwrap("<div class='modal-wrap'></div>");
});
});
// リサイズしたら表示位置を再取得
$(window).on('resize', function(){
modalResize();
});
// モーダルコンテンツの表示位置を設定する関数
function modalResize(){
// ウィンドウの横幅、高さを取得
var w = $(window).width();
var h = $(window).height();
// モーダルコンテンツの横幅、高さを取得
var mw = $(modal).outerWidth(true);
var mh = $(modal).outerHeight(true);
// モーダルコンテンツの表示位置を設定
if ((mh > h) && (mw > w)) {
$(modal).css({'left': 0 + 'px','top': 0 + 'px'});
} else if ((mh > h) && (mw < w)) {
var x = (w - scrollsize - mw) / 2;
$(modal).css({'left': x + 'px','top': 0 + 'px'});
} else if ((mh < h) && (mw > w)) {
var y = (h - scrollsize - mh) / 2;
$(modal).css({'left': 0 + 'px','top': y + 'px'});
} else {
var x = (w - mw) / 2;
var y = (h - mh) / 2;
$(modal).css({'left': x + 'px','top': y + 'px'});
}
}
});
});
クリックしたら、オーバーレイ表示にさせるとか、表示位置とか、IDを取得とか、細かい設定を組んでいきます。
以下のサイトを参考にしましたm(__)m
ありがとうございます!!
最後は、CSSで細かくレイアウトを組みます。
.lock {
overflow:hidden;
}
.modal-content {
position:relative;
display:none;
width:96%;
margin:30px 2%;
padding:10px 0 0;
border:1px solid #061a63;
background:#fff;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
.modal-content p {
margin:0;
padding:0;
}
.modal-overlay {
z-index:1;
display:none;
position:fixed;
top:0;
left:0;
width:100%;
height:120%;
background-color:rgba(0,0,0,0.75);
}
.modal-wrap {
z-index:2;
display:none;
position:fixed;
top:0;
left:0;
width:100%;
height:100%;
overflow:auto;
}
.modal-open {
color:#00f;
text-decoration:underline;
}
.modal-open:hover {
cursor:pointer;
color:#f00;
}
.modal-close {
color:#00f;
text-align: right;
}
.modal-close:hover {
cursor:pointer;
color:#f00;
}
p.close_top{
text-align: right;
margin: 10px 0 20px;
}
p.close_top .modal-close{
height:35px;
border:1px solid #A5A4A4;
color: #A5A4A4;
font-size: 1.2em;
margin-right: 20px;
padding:10px 20px;
border-radius: 10px;
background-color: #ffffff;
}
.modal-content > ul{
overflow: hidden;
margin:0;
padding:0;
}
.modal-content > ul li.lavel{
background-color: #F70841;
font-size: 1.6em;
padding:5px 30px;
font-weight: bold;
}
.modal-content > ul li.lavel a{
color: #fff;
}
ul.nav_box{
background-color: #f1f1f1;
margin:0;
padding:15px 0 0;
overflow: hidden;
}
ul.nav_box li{
font-size: 1.5em;
width: 47%;
float: left;
margin:0 0 20px 3%;
}
ul.nav_box li a{
color: #505050;
display: block;
}
p.close_bottom{
background-color: #e8e6c2;
overflow: hidden;
text-align: center;
}
p.close_bottom a{
display: block;
color:#a5a4a4;
background-color: #fff;
padding:10px 30px;
font-size: 1.4em;
}
完成品のDEMOは以下↓
スマホ用のナビゲーションメニュー向けって事で、一応iPhoneの「safari」とAndroidの「ブラウザ」と「Chrome」で動作確認済みです。
今回のjQueryのコードは、ほとんど@arayutwさんから参考にさせていただいたものですが、使いようによってはナビゲーションメニューとしても使えたりと、モーダルウィンドウは何かと使えますね(・∀・)
空で書けって言われたら、「ちょっとすいません」なんで、もっとjQuery勉強しないといけませんね・・・。
またまたスマホサイトのナビゲーションメニューのバリエーションが増えたところで、今回は以上ですm(_ _)m