jQueryで作ったモーダルウィンドウナビゲーション
以前画面の外から出てくるスートフォンのメニューと言う記事で、jQueryのslideDownとslideUpを使って実装するナビゲーションを取り扱いましたが、最近制作したもう一つの方のサイトに実装してみました。 以前はスマホサイト用に作っている最中のものをご紹介したのですが、今回はレスポンシブでPCにも対応させます。
まずはjQuery、イージングと「Androidでoverflowした要素をスクロール可能にするjQueryプラグイン」で紹介されていた、Androidでoverflowするとスクロールできない問題を解消するためのjquery.overflowScroll.jsを読み込みます。 記述位置はbody閉じタグ直上でもヘッダーでも大丈夫です。
1 2 3 |
<script src="http://code.jquery.com/jquery-1.10.2.js"></script> <script src="js/jquery.easing.1.3.js"></script> <script src="js/jquery.overflowScroll.js"></script> |
slideDownでナビを表示させ、モーダルウィンドウ展開中はスクロールを禁止します。IE7やiPhoneはこのままではスクロールしてしまいますので別途対処が必要ですが、今回はい行いません。
1 2 3 4 5 6 7 8 |
jQuery(function($){ var dblock = $('#dblock'); $("#dnonebtn").click(function () { dblock.slideDown(500,"easeOutExpo",function(){ $('body').css('overflow', 'hidden'); $(this).clearQueue([]); }); }); |
slideUpでナビを閉じスクロール禁止を解除します。
1 2 3 4 5 6 7 |
$('#dblockbtn,#dnonebtn').click(function () { dblock.slideUp(500,"easeOutExpo",function(){ $('body').css('overflow', 'auto'); $(this).clearQueue([]); }); }); }); |
例のAndroidでスクロールするための記述です。
1 2 3 4 5 |
if(navigator.userAgent.indexOf('Android') > 0){ jQuery(function($) { $("#dblock"). overflowScroll(); }); } |
今回はグローバルを固定してそれ以外の全画面に展開する仕様なのでナビの高さと余白を減算し、画面の高さを取得します。 スマホはアドレスバーが展開時と非展開時では高さが違いますので、高さの取得はクリック時にしています。 それとは別に画面サイズを変更した時にも高さを取得するために関数化しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function menubox(){ var w = $(window).width(); var x = 601; if (w <= x) { var wh = window.innerHeight; var mh = (wh -= 45); $('#dblock').css('height',mh+'px'); }else{ var wh = $(window).height(); var mh = (wh -= 140); $('#dblock').css('height',mh+'px'); } } $("#dnonebtn").click(function(){ menubox(); }); $(window).resize(function(){ menubox(); }); |
とりあえずはこれだけでOKですが本格的にAndroidやクロスブラウザ対応するとなると、もっとちゃんと考えないと駄目ですね! ですが、逆に言うとこれだけでこの程度のものなら簡単に実装できちゃうjQueryはやっぱ便利ですね。もっと勉強しないと・・・。
イージングのライブラリー
jquery.overflowScroll.js
実装したページはこちら
該当箇所のsassです。commonは全てのデバイス、phoneはスマホ、screenはPCです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
@mixin ib{ display: -moz-inline-stack; display: inline-block; vertical-align: middle; *vertical-align: auto; zoom: 1; *display: inline; } @mixin wma{ width: 1000px; margin-right: auto; margin-left: auto; } #dblock{ @if $type == common{ @include ib; background:#363942; padding-top: 80px; *left: 0; filter: alpha(opacity= 97);// IE opacity: 0.97;// CSS3 display:none; width: 100%; overflow: auto; -webkit-overflow-scrolling: touch; -webkit-transition: none; } @if $type == phone{ padding-top: 2.0em; z-index: 2; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } @if $type == screen{ width: 100%; } >div{ @if $type == screen{ @include ib; @include wma; } } } |
実装したページのトップページはキービジュアルの下にグローバルナビナビが配置されていますので、メニュー展開時に次のブロックにスクロールするようにしています。
- 2014年03月24日月曜日
- :Naruhiko Wakai
コメントを残す