ボタンを押したら画面外からスライドして表示されるメニューの作り方と注意点
ボタンを押したら画面外からスライドして表示されるメニューの作り方
ボタンを押すと表示されるメニューを簡単に作っていきます。
動作イメージは以下。
画面に表示されるボタンを押すと…
上からにゅ~っとメニューが現れます。
再びボタンを押すと閉じます。
論よりコード
HTML
<!DOCTYPE html> <html lang="ja"> <head> <link rel="stylesheet" href="style.css"> </head> <body> <div class="cover js-cover"> <div class="list">test1</div> <div class="list">test2</div> <div class="list">test3</div> <div class="list">test4</div> <div class="list">test5</div> </div> <div class="btn js-toggle-cover">ボタン</div> </body> <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> <script src="app.js"></script> </html>
CSS
.cover{ width: 100vw; height: 100vh; background-color: black; opacity: 0.5; position: fixed; top:0; z-index: 2; /* ボタンを押す前は見えないようにメニューは画面外にずらす */ transform: translateY(-100%); transition: .5s; } .list{ font-size: 100px; color: red; text-align: center; } /*ボタンをクリックするとactiveクラスが付与される*/ .active{ /* Y方向に要素を移動させる */ transform: translateY(0%); transition: .5s; } .btn{ cursor: pointer; font-size: 100px; border: 1px solid black; background-color: white; position: fixed; z-index: 3; top: 50%; }
JavaScript
$('.js-toggle-cover').on('click', function () { $('.js-cover').toggleClass('active'); });
まとめ
・メニューの画面を作っておき、transform: translate() ;を使い、画面外に表示しておく。
・ボタンがクリックされたら、JSでクラスを付与し、画面に表示されるようにCSSを適用する。
注意点
下記のように、画面サイズの縦方向が小さくなってしまうと画面上部から、メニューの要素がはみ出してきてしまいます。
画面サイズと同じだけメニューの要素はずらして画面外に表示していますが、画面が小さくなると十分な量ずらすことができず、その分メニューの要素がはみ出して表示されてしまいます。
なのでメニューを移動させる方向はヨコ方向(X方向)がオススメです。
特にスマートフォンのソフトキーボード(文字入力しようとしたときに表示されるキーボード)によって、表示画面が小さくなったときに上記の減少が起こりやすいです。
(ソフトキーボード利用時の挙動はブラウザの開発ツールでは確認できないので気が付かないことも多いと思います。)
追伸
Twitterでコメントを頂いたのですが、slideToggleを使うのが良さそう。(特に縦方向のアニメーションで表示させたい場合)
以下、コード(HTMLは特に変更なし)
CSS
.cover{ width: 100vw; height: 100vh; background-color: black; opacity: 0.5; position: fixed; top:0; z-index: 2; } .list{ font-size: 100px; color: red; text-align: center; } .btn{ cursor: pointer; font-size: 100px; border: 1px solid black; background-color: white; position: fixed; z-index: 3; top: 50%; }
JavaScript
$('.js-toggle-cover').on('click', function () { $('.js-cover').slideToggle('slow'); });
多少アニメーションの差異はありますが、特に気にするほどでなければ、こちらの実装のほうが良さそうですね。(特に縦方向のアニメーションの場合)