今回は[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ではオプション設定についての詳細な説明も掲載されています。
ぜひお試しください。