スライドインタイプのスマホメニューなんかで、メニュー領域外をタップした時にメニューが閉じる動作。
スマホアプリのUIとしてはもはやデフォルトと言えますよね。
当然、WEB上でも同じ体験が求められます。WEBはどんどんアプリ化されていきますから、寄せていくのは必然。
という事で、jQueryを使ってこれを再現しました。
▼HTML※Bootstrap3ベース
<nav class="navbar navbar-default"> <div class="container"> <div class="navbar-header"> <button id="menu-toggle" type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <div class="bar"><span></span></div> </button> <a class="navbar-brand" href="#"><img src="images/logo.png" alt="ロゴ"></a> </div> <div id="sidebar-wrapper"> <div class="collapse1 navbar-collapse1 sidebar-nav" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav pull-right text-center"> <li><a href="#">ホーム</a> </li> <li><a href="#">メニュー1</a></li> <li><a href="#">メニュー2</a></li> <li><a href="#">メニュー3</a></li> <li><a href="#">メニュー4</a></li> </ul> </div> <!-- /.navbar-collapse --> </div> </div> <!-- /.container-fluid --> </nav>
▼css
.navbar-toggle .icon-bar { -webkit-transition: all 0.1s; -o-transition: all 0.1s; transition: all 0.1s; } .navbar-toggle:not(.collapsed) .icon-bar:nth-child(2) { -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); -o-transform: rotate(45deg); transform: rotate(45deg); position: absolute; top: 0; bottom: 0; right: 0; left: 0; margin: auto; } .navbar-toggle:not(.collapsed) .icon-bar:nth-child(3) { display: none; } .navbar-toggle:not(.collapsed) .icon-bar:nth-child(4) { -webkit-transform: rotate(-45deg); -ms-transform: rotate(-45deg); -o-transform: rotate(-45deg); transform: rotate(-45deg); position: absolute; top: 0; bottom: 0; right: 0; left: 0; margin: auto; } /* sp_Menu */ .bar { position: absolute; right: 4px; top: 14px; } .bar, .bar:before, .bar:after { -webkit-transition: all .25s; transition: all .25s; content: ""; position: absolute; right: 0; height: 3px; width: 28px; background-color: #fff; } .bar span{ position: absolute; bottom: -19px; font-size: 11px; } .bar { position: absolute; right: 4px; top: 14px; } .bar:before { top: -8px; } .navbar-toggle:not(.collapsed) .bar:before { top: 0; } .bar:after { top: 8px; } .navbar-toggle:not(.collapsed) .bar:before, .navbar-toggle:not(.collapsed) .bar:after { -webkit-transition: all .25s; transition: all .25s; top: -0px; } #menu-toggle .menu-collapsed { -webkit-transition: all .25s; transition: all .25s; margin: auto; right: 0; height: 24px; width: 100%; z-index: 1; cursor: pointer; } #menu-toggle .bar { background-color: #fff; -webkit-transition: all .25s; transition: all .25s; top: 23px; right: 0; left: 0; margin: auto; } #menu-toggle.navbar-toggle:not(.collapsed) .bar:before { -webkit-transform: rotate(45deg); transform: rotate(45deg); } #menu-toggle.navbar-toggle:not(.collapsed) .bar:after { -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } #menu-toggle.navbar-toggle:not(.collapsed) .bar span:nth-of-type(1) { -webkit-transform: translateY(16px) rotate(-45deg); transform: translateY(8px) rotate(-45deg); } #menu-toggle.navbar-toggle:not(.collapsed) .bar { background-color: transparent; } #menu-toggle.navbar-toggle:not(.collapsed) .bar span:nth-of-type(3) { -webkit-transform: translateY(-16px) rotate(45deg); transform: translateY(-8px) rotate(45deg); } /* Side Menu */ #sidebar-wrapper { z-index: 1000; position: fixed; top: 0; right: 0; width: 250px; height: 100%; margin-right: -250px; overflow-y: auto; background: #222; -webkit-transition: all 0.4s ease 0s; -moz-transition: all 0.4s ease 0s; -ms-transition: all 0.4s ease 0s; -o-transition: all 0.4s ease 0s; transition: all 0.4s ease 0s; } .sidebar-nav { position: absolute; top: 90px; width: 250px; margin: 0; padding: 0 15px; list-style: none; overflow-x: hidden; border: none; } .sidebar-nav li { line-height: 40px; font-size: 12px; } .sidebar-nav li a { display: block; text-decoration: none; color: #999; } .sidebar-nav li a:hover { text-decoration: none; color: #fff; background: rgba(255,255,255,0.2); } .sidebar-nav li a:active, .sidebar-nav li a:focus { text-decoration: none; } .sidebar-nav > .sidebar-brand { height: 55px; font-size: 18px; line-height: 55px; } .sidebar-nav > .sidebar-brand a { color: #999; } .sidebar-nav > .sidebar-brand a:hover { color: #fff; background: none; } #menu-toggle { z-index: 1001; position: fixed; top: 0; right: 0; background: #052A78; width: 50px; height: 50px; border-radius: 10px; border: none; margin-top: 20px; } #sidebar-wrapper { background: #fff; } #sidebar-wrapper.active { right: 250px; width: 250px; -webkit-transition: all 0.4s ease 0s; -moz-transition: all 0.4s ease 0s; -ms-transition: all 0.4s ease 0s; -o-transition: all 0.4s ease 0s; transition: all 0.4s ease 0s; -webkit-box-shadow: 2px 0px 15px #333; box-shadow: 2px 0px 15px #333; } #sidebar-wrapper.active ul.nav { float: none !important; margin: 0; } .toggle { margin: 5px 5px 0 0; }
▼jQuery
$(function () { // スライダーメニューを閉じる $("#menu-close").click(function(e) { e.preventDefault(); $("#sidebar-wrapper").toggleClass("active"); }); // スライダーメニューを開く $("#menu-toggle").click(function(e) { e.preventDefault(); $("#sidebar-wrapper").toggleClass("active"); $(this).toggleClass("collapsed"); $("body").toggleClass("open"); //背景をグレーアウトするためにclass付与 }); //領域外のクリックでメニューを閉じる $('#fadeLayer').on('click', function(){ if (window.innerWidth <= 768) { if($("#sidebar-wrapper").hasClass("active")){ $("#sidebar-wrapper").removeClass("active"); $("#menu-toggle").addClass("collapsed"); $("body").toggleClass("open"); } } }); //リンクをクリックした際にメニューを閉じる $('.navbar-nav li a').on('click', function(){ if (window.innerWidth <= 768) { if($("#sidebar-wrapper").hasClass("active")){ $("#sidebar-wrapper").removeClass("active"); $("#menu-toggle").addClass("collapsed"); $("body").toggleClass("open"); } } }); //ヘッダー領域ではイベントを停止 $('.navbar-header').click(function() { event.stopPropagation(); }); });