びよ〜んと弾むのが気持ちいい!タブレット・スマフォで使いたいナビゲーション -Bounce Menu
Post on:2013年9月27日
タップすると、びよ〜んと弾んでナビゲーションが表示されるタブレット・スマフォ向けに実装してみたいナビゲーションを紹介します。
紹介するのは、デザイン的なものと実際に動作するデモの2つです。
まずは、デザイン的な方から。
こちらではiPad, iPad Miniの精巧なテンプレートと共にこのナビゲーションの動作を楽しめます。
ダウンロードできるファイルにはテンプレートと.aepファイルがあります。
で、このナビゲーションをJavaScript/CSSで実装したデモです。
左下をタップで動作します。
実装はこんな感じです。
HTML
<div class="device"> <div class="screen"> <div class="menu"> <ul> <li class="lock"><a href="">Lock</a></li> <li class="share"><a href="">Share</a></li> <li class="download"><a href="">Download</a></li> </ul> </div> <div class="toggle"> <div class="x"></div> <div class="y"></div> </div> <div class="content"></div> </div> </div>
CSS
div.device { height: 798px; width: 378px; width: 440px; height: 807px; background: url('http://creativeda.sh/sandbox/bounce_menu/img/iphone_black.png') no-repeat center center; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; position: absolute; margin: auto; top: 0px; bottom: 100px; left: 0px; right: 0px; } div.screen { height: 568px; width: 320px; position: absolute; top: 119px; left: 60px; overflow: hidden; } div.content { height: 568px; width: 320px; background: #375585; position: absolute; top: 0px; left: 0px; z-index: 300; -webkit-transition: all 250ms ease; -moz-transition: all 250ms ease; -ms-transition: all 250ms ease; -o-transition: all 250ms ease; transition: all 250ms ease; } div.content.bounce { -webkit-transform: translate3d(70px, -65px, 0px); -moz-transform: translate3d(70px, -65px, 0px); -o-transform: translate3d(70px, -65px, 0px); transform: translate3d(70px, -65px, 0px); } div.content.open { -webkit-transform: translate3d(60px, -55px, 0px); -moz-transform: translate3d(60px, -55px, 0px); -o-transform: translate3d(60px, -55px, 0px); transform: translate3d(60px, -55px, 0px); } /* Toggle & Menu ---------------------------------------------------------------------- */ div.toggle { height: 30px; width: 40px; position: absolute; bottom: 15px; left: 10px; z-index: 500; cursor: pointer; } div.x, div.y { position: absolute; margin: auto; top: 0px; bottom: 0px; left: 0px; right: 0px; background: #fff; -webkit-transition: all 200ms ease-out; -moz-transition: all 200ms ease-out; -ms-transition: all 200ms ease-out; -o-transition: all 200ms ease-out; transition: all 200ms ease-out; } div.x { height: 4px; width: 30px; } div.y { height: 30px; width: 4px; } div.x.stretch { width: 40px; } div.x.shrink { width: 15px; } div.y.minus { height: 0px; } div.menu { background: #222; height: 568px; width: 320px; position: absolute; top: 0px; left: 0px; z-index: 100; } div.menu ul { list-style: none; padding: 0px; margin: 0px; height: 150px; width: 35px; position: absolute; bottom: 60px; left: 11px; } div.menu ul li { margin-top: 15px; } div.menu ul li a { display: block; height: 31px; width: 31px; text-indent: -9999px; font-size: 0px; background: #375585 center center; } div.menu ul li.animate a { -webkit-transition: all 300ms ease-out; -moz-transition: all 300ms ease-out; -ms-transition: all 300ms ease-out; -o-transition: all 300ms ease-out; transition: all 300ms ease-out; } div.menu ul li.lock a { background-image: url('http://creativeda.sh/sandbox/bounce_menu/img/icon_lock.png'); -webkit-transform: translate3d(-50px, -30px, 0px); -moz-transform: translate3d(-50px, -30px, 0px); -o-transform: translate3d(-50px, -30px, 0px); transform: translate3d(-50px, -30px, 0px); } div.menu ul li.share a { background-image: url('http://creativeda.sh/sandbox/bounce_menu/img/icon_share.png'); -webkit-transform: translate3d(-50px, 0px, 0px); -moz-transform: translate3d(-50px, 0px, 0px); -o-transform: translate3d(-50px, 0px, 0px); transform: translate3d(-50px, 0px, 0px); } div.menu ul li.download a { background-image: url('http://creativeda.sh/sandbox/bounce_menu/img/icon_download.png'); -webkit-transform: translate3d(-50px, 30px, 0px); -moz-transform: translate3d(-50px, 30px, 0px); -o-transform: translate3d(-50px, 30px, 0px); transform: translate3d(-50px, 30px, 0px); } div.menu ul li.color a { background-color: #fff; } div.menu ul li.move a { -webkit-transform: translate3d(0px, 0px, 0px); -moz-transform: translate3d(0px, 0px, 0px); -o-transform: translate3d(0px, 0px, 0px); transform: translate3d(0px, 0px, 0px); }
JavaScript
jquery.jsを外部スクリプトにします。
/* Define Click Event for Mobile ---------------------------------------------------------------------- */ if( 'ontouchstart' in window ){ var click = 'touchstart'; } else { var click = 'click'; } /* Click menu toggle ---------------------------------------------------------------------- */ $('div.toggle').on(click, function(){ if( flag ){ if( !$(this).hasClass('minus') ){ openMenu(); } else { closeMenu(); } } }); /* Click menu icons ---------------------------------------------------------------------- */ $('div.menu ul li a').on(click, function(e){ e.preventDefault(); closeMenu(); }); /* Open/ Close Menu Functions ---------------------------------------------------------------------- */ var flag = true; // Prevent menu change while animating function openMenu(){ flag = false; // Remove circle $('div.circle').remove(); // Update toggle $('div.toggle').addClass('minus'); $('div.y').addClass('minus'); setTimeout(function(){ $('div.x').addClass('stretch'); }, 100); setTimeout(function(){ $('div.x').removeClass('stretch'); }, 300); // Move content $('div.content').addClass('bounce'); setTimeout(function(){ $('div.content').removeClass('bounce').addClass('open'); }, 250); // Animate menu icons $('div.menu ul li').addClass('animate'); $('div.menu ul li').addClass('move'); setTimeout(function(){ $('div.menu ul li').addClass('color'); }, 200); setTimeout(function(){ flag = true; }, 400); } function closeMenu(){ flag = false; // Update toggle $('div.toggle').removeClass('minus'); $('div.y').removeClass('minus'); $('div.x').addClass('shrink'); setTimeout(function(){ $('div.x').removeClass('shrink'); }, 200); // Move content $('div.content').removeClass('open'); // Reset menu icons setTimeout(function(){ $('div.menu ul li').removeClass('animate'); $('div.menu ul li').removeClass('color move'); flag = true; }, 300); }
sponsors