今回は[Snap.js]を使って左右にスライドするタイプのメニューを作成する方法を紹介します。
まずはサンプルをご覧ください。
Snap.js : オンズのサンプル
これ、正式名称が不明確なんですが、巷では「スワイプ・メニュー」や「ドロワー・メニュー」と呼ばれていますね。
指定した特定の要素をスワイプまたはクリックすると、メインのコンテンツ部分が左右にスライドしてメニューが表示されます。
特にiPhoneをはじめとするスマートフォンタイプの小さなデバイスでは、表示領域を節約したうえでメニューもわかりやすく表示されるので、非常にユーザビリティが高くなります。
モバイル版のFacebookでも採用されているので動作についてはもうお馴染みでしょう。
以下、導入方法を具体的に紹介していきます。
[Snap.js]をダウンロードする
まず最初に、必要なファイル一式をダウンロードします。
ダウンロードは下記GitHubより。「Download ZIP」というボタンをクリックしましょう。
GitHub : https://github.com/jakiestfu/Snap.js
これで「Snap.js-develop.zip」という圧縮ファイルがダウンロードされます。
解凍するといくつかのフォルダとファイルに展開されますが、今回ここで使うのは「snap.js」と「snap.css」の2つ。
これらをサーバーにアップロードして、HTMLの適当な箇所で読み込んでおきます。
<link rel="stylesheet" href="snap.css"> <script src="snap.js"></script>
メニュー部分とコンテンツ部分を作る
スライドさせて表示されるメニュー部分とメインのコンテンツ部分を作り込んでいきます。
ここではメニュー部分を「.snap-drawers」で、コンテンツ部分を「.snap-content」で囲みます。
また JavaScript で要素を操作するためにID属性で「#content」と「#snap」もそれぞれ付与しておきましょう。
<div class="snap-content" id="content"> <div id="open">メニューを開く</div> ...コンテンツを記述 </div> <div class="snap-drawers" id="snap"> ...メニューを記述 </div>
コンテンツ部分には[Snap.js]を起動させてメニューを表示するためのボタンも用意しておきます。この要素には「#open」を指定しておきます。
[Snap.js]を起動させる初期設定
最後に[Snap.js]を動かすためのコードを記述します。これはHTMLの最後、閉じる「</body>
」タグの直前に書くようにします。
<script> // 基本設定 var snapper = new Snap({ element: document.getElementById('content'), dragger: document.getElementById('open') }); // フリック・スワイプ・ドラッグ入力の他、指定した要素のクリックでもメニューを開閉するための設定 var addEvent = function addEvent(element, eventName, func) { if (element.addEventListener) { return element.addEventListener(eventName, func, false); } else if (element.attachEvent) { return element.attachEvent("on" + eventName, func); } }; // 指定した要素をクリックするとメニューが開く addEvent(document.getElementById('open'), 'click', function(){ snapper.open('right'); }); </script>
ここでは「#open」要素でコンテンツ部分がスライドするようになり、また同要素をクリックしてもメニューが開く設定にしてみました。
オプション設定
挙動を細かく制御するための設定項目と、その初期値は以下のようになっています。
<script> var snapper = new Snap({ element: null, dragger: null, disable: 'none', addBodyClasses: true, hyperextensible: true, resistance: 0.5, flickThreshold: 50, transitionSpeed: 0.3, easing: 'ease', maxPosition: 266, minPosition: -266, tapToClose: true, touchToDrag: true, slideIntent: 40, minDragDistance: 5 }); </script>
各項目の詳細
以下、各オプションの詳細です。
element | 左右にスライドするコンテンツ部分のID。通常は document.getElementById('content') のように指定。 |
---|---|
dragger | 左右にスライドさせるために使用される要素。通常は document.getElementById('dragger') のように指定。 |
disable | 右左どちらか、動かさないほうを "left" または "right" で指定できる。 |
addBodyClasses | メニューが開いている状態のときに body タグにクラス名が付与される。 |
hyperextensible | "false" を指定すると「maxPosition」と「minPosition」で指定した値を超えてスライドしない。 |
resistance | 「maxPosition」と「minPosition」で指定した値を超えてスライドしたときに動作を遅らせる係数。 |
flickThreshold | 指定したピクセル単位分のフリック入力で[Snap.js]が起動。 |
transitionSpeed | 開閉時のスピードを調節。 |
easing | CSS3メソッドによるイージングを指定可能。 |
maxPosition | スライドする最大値 |
minPosition | スライドする最小値 |
tapToClose | メニューが開いているとき、他の要素をクリックするとメニューが閉じる。 |
touchToDrag | ドラッグ操作を有効化 |
slideIntent | スライドを有効化する角度 |
minDragDistance | ドラッグする必要がある距離の最小値。 |
最低限、必要とされるオプションが揃っており、比較的簡単に扱えます。またjQuery不要で単体で動くのも嬉しいポイントですね。
公式サイトとダウンロード用のURLは以下より。
GitHubではオプション設定についての詳細な説明も掲載されています。
ぜひお試しください。