[CSS]重なった複数のパネルを扇状にアニメーションで優雅に開くスタイルシートのテクニック
Post on:2014年2月19日
レッド・イエロー・ブルーの三枚のパネルが重なっており、それをホバーするとそのパネルを扇状に開くスタイルシートのデモを紹介します。
アクションの度に、ぷるっと反動するのが細かい!
重なっている時の表示はカレンダーで、広がった時は時計になり、カレンダーは下へ移動。
実際の動作は下記ページで確認できます。
実装はけっこう複雑ですが、このインタラクションはかっこいいですね。
日付や時刻の取得、不透明度の変更にJavaScriptを使用していますが、ホバーのアニメーションはスタイルシートで実装されています。
HTML
3つのパネルはdiv要素で、1枚目はノーマル時のカレンダーとホバー時の年と分と日、2枚目はホバー時の時と曜日、3枚目はホバー時の秒と月が要素として配置されています。
<div class="signboard outer"> <div class="signboard front inner anim04c"> <li class="year anim04c"> <span></span> </li> <ul class="calendarMain anim04c"> <li class="month anim04c"> <span></span> </li> <li class="date anim04c"> <span></span> </li> <li class="day anim04c"> <span></span> </li> </ul> <li class="clock minute anim04c"> <span></span> </li> <li class="calendarNormal date2 anim04c"> <span></span> </li> </div> <div class="signboard left inner anim04c"> <li class="clock hour anim04c"> <span></span> </li> <li class="calendarNormal day2 anim04c"> <span></span> </li> </div> <div class="signboard right inner anim04c"> <li class="clock second anim04c"> <span></span> </li> <li class="calendarNormal month2 anim04c"> <span></span> </li> </div> </div>
CSS
スタイルシートは長いので、ベンダプレフィックスは削除しています。
.anim04c { transition: all .4s cubic-bezier(.5, .35, .15, 1.4); } html, body { width: 100%; height: 100%; font-family: 'Source Sans Pro', sans-serif; background: #eee; color: #666; } body { overflow-x: hidden; overflow-y: auto; } /*-----*/ .outer { position: relative; top: 50%; z-index: 1; transform: translateY(-50%); cursor: pointer; } /*-----*/ .signboard { width: 100px; height: 100px; margin: auto; color: #fff; border-radius: 10px; } /*-----*/ .front { position: absolute; top: 0; left: 0; z-index: 3; background: #ff726b; text-align: center; } .right { position: absolute; right: : 0; z-index: 2; transform: rotate(-10deg) translate(7px, 8px); background: #EFC94C; } .left { position: absolute; left: 0; z-index: 1; transform: rotate(5deg) translate(-4px, 4px); background: #3498DB; } /*-----*/ .outer:hover .inner { transform: rotate(0) translate(0); } /*-----*/ .outer:active .inner { transform: rotate(0) translate(0) scale(0.9); } .outer:active .front .date { -webkit-transform: scale(2); } .outer:active .front .day, .outer:active .front .month { visibility: hidden; opacity: 0; transform: scale(0); } .outer:active .right { transform: rotate(-5deg) translateX(80px) scale(0.9); } .outer:active .left { transform: rotate(5deg) translateX(-80px) scale(0.9); } /*-----*/ .outer:active .calendarMain { opacity: 0; visibility: hidden; } .outer:active .clock { opacity: 1; visibility: visible; } .outer:active .calendarNormal { bottom: -30px; opacity: 1; visibility: visible; } .outer:active .year { top: -30px; opacity: 1; visibility: visible; letter-spacing: 3px; } /*-----*/ .calendarMain { width: 100%; height: 100%; position: absolute; opacity: 1; } .month, .day { font-size: 10px; line-height: 30px; font-weight: 600; text-transform: uppercase; letter-spacing: 3px; } .date { font-size: 40px; line-height: 40px; font-weight: 300; text-transform: uppercase; letter-spacing: 3px; } /*-----*/ .clock { width: 100%; height: 100%; position: absolute; font-size: 40px; line-height: 100px; font-weight: 300; text-transform: uppercase; letter-spacing: 3px; text-align: center; opacity: 0; visibility: hidden; } /*-----*/ .year { width: 100%; position: absolute; top: 0; font-size: 14px; line-height: 30px; font-weight: 300; text-transform: uppercase; letter-spacing: 0; text-align: center; opacity: 0; visibility: hidden; color: #ff726b; } .calendarNormal { width: 100%; position: absolute; bottom: 0; font-size: 14px; line-height: 30px; font-weight: 600; text-transform: uppercase; letter-spacing: 3px; text-align: center; opacity: 0; visibility: hidden; } .date2 { color: #ff726b; } .day2 { color: #3498DB; } .month2 { color: #EFC94C; }
sponsors