お気楽スマホメニュー
スマホメニューの実装で、これが一番簡単で調整しやすいのでは?と思ったものがあったので、メモしておく。
まず、きっかけになったのは、cssの transform: translate;
が、絶対値(px指定)で使うものだとなんとなく思い込んでいたけれど、普通に%指定やviewport size(vhやvw)なんかも指定できたこと。
実装サンプル
See the Pen smartphone menu sample by hiroaki tachibana (@eedamame) on CodePen.
メニューを全画面に表示
とりあえずメニューになるボックスを作っていく。
.menu {
position: fixed;
top: 0;
left: 0;
z-index: 10000;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,.8);
}
全画面を覆うボックス出現。
<body>
<div class="contents">
...
</div>
<nav class="menu">
<ul>
<li><a href="#menu01">メニュー1</a></li>
<li><a href="#menu02">メニュー2</a></li>
<li><a href="#menu03">メニュー3</a></li>
<li><a href="#menu04">メニュー4</a></li>
</ul>
</nav>
</body>
こんな感じでメニューを足していくとメニューが画面からはみ出していくけど、fixed / height 100% で指定してるのでスクロールできない。 なので、下記の感じで縦スクロールできるようにする。
.menu {
... 以下を追加 ...
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
ここまでで、全画面に表示されて縦スクロールできる箱ができたので、ナビゲーションとして、最初は隠れていてボタンタップで表示されるように調整。
ここでは、左から出てくるメニューを想定。
.menu {
... 以下を追加 ...
transform: translateX(-100%); // ベンダープレフィックスは適宜
}
これで左に隠れて…
$(function() {
$('#btn-menu').on('click', function() {
$('body').addClass('is-menu-open');
});
});
.menu {
... 以下を追加 ...
transition: transform .5s ease;
will-change: transform;
}
.is-menu-open .menu {
transform: translateX(0);
}
これでメニュー(#btn-menu) をクリックするとアニメーションして出て来る。
もろもろ調整のお手軽さ
上から下に出てくるメニューの場合
transform: translate の方向をYにしてあげればOK。
.menu {
...
transform: translateY(-100%);
}
.is-menu-open .menu {
transform: translateY(0);
}
固定ヘッダにメニュー出すボタンがあって、固定ヘッダ以下のエリアにメニュー表示したい
上にヘッダ分の余白をいれてあげるだけ。
.menu {
/* z-indexの調整はいい感じにやる */
padding-top: (固定ヘッダの高さ);
box-sizing: border-box;
}
コンテンツレイヤーがスクロールしないようにロック
.is-menu-open {
overflow: hidden;
width: 100%;
height: 100%;
}