最近、CSSのみでの3D表現を実験的に行っているサイトを多々見かけます。
CSSでの3D表現はCSS3から追加となったプロパティ「transform」で実装可能となります。
そんな「transform」を使ってCSS3での3D的表現方法を実験してみたので
簡単なサンプルにて紹介してみます。
まずは動作サンプルから。
※「transform」プロパティも今現在Webkitブラウザのみの対応となっていることもあり、
このサンプルの動作環境はSafariのみです!!!
CSS3 3D ROTATE
5枚の画像に角度を付け、
レイヤー風に重ね合わせた見た目を表現しています。
各画像にマウスオーバーすることで、
角度を回転させ画像を正常の角度で見るアニメーションが実行されます。(ギャラリー風)
内部構成について。
HTMLソースは単純なリストのみです。
◆HTML <div id="contents"> <ul> <li><a href="#"><img src="img/photo01.jpg" width="300" height="225" alt=""></a></li> <li><a href="#"><img src="img/photo02.jpg" width="300" height="225" alt=""></a></li> <li><a href="#"><img src="img/photo03.jpg" width="300" height="225" alt=""></a></li> <li><a href="#"><img src="img/photo04.jpg" width="300" height="225" alt=""></a></li> <li><a href="#"><img src="img/photo05.jpg" width="300" height="225" alt=""></a></li> </ul> </div><!--/#contents-->
画像一枚一枚を<li>で囲っている、
通常のリストの構成です。
これらのリストに対してCSS3「transform」で角度をつけたり、
「:hover」時のアニメーションを実装します。
CSSの記述は以下。
◆CSS /* ContentsArea -------------------------- */ #contents { margin: 0 auto; width: 300px; min-height: 450px; text-align: left; } #contents ul { width: 300px; } #contents ul li { width: 300px; min-height: 50px; list-style: none; position: relative; -webkit-perspective: 400; -webkit-transition-property: perspective; -webkit-transform-style: preserve-3d; -webkit-transition-duration: 0.5s; } #contents ul li img { -webkit-transform: rotateX(75deg); -webkit-transition-property: transform; -webkit-transition-duration: 0.3s; -webkit-box-shadow:0 3px 10px #888; top: -90px; left: 0; width: 300px; position: absolute; display: block; opacity: 0.7; z-index: 10; } /* CSS3 Hover 3D TurnAnimation -------------------------- */ @-webkit-keyframes hoverTurn { 0% {min-height: 50px;} 100% {min-height: 225px;} } #contents ul li:hover { -webkit-animation-name: hoverTurn; -webkit-animation-duration: 0.3s; -webkit-animation-iteration-count: 1; min-height: 225px; } @-webkit-keyframes ImgRotate { 0% {top: -90px; -webkit-transform: rotateX(75deg);opacity: 0.7;} 100% {top: 20px; -webkit-transform: rotateX(0deg);opacity: 1;} } #contents ul li:hover img { -webkit-animation-name: ImgRotate; -webkit-animation-duration: 1s; -webkit-animation-iteration-count: 1; -webkit-transform: rotateX(0deg); -webkit-box-shadow: 0 0 10px #000; top: 20px; opacity: 1; z-index: 20; }
「#contents ul li」で「transform-style:preserve-3d」等を指定し、
その中の画像「#contents ul li img」で傾き角度「transform: rotateX(75deg);」を指定しています。
「transform: rotateX」の指定は「transform: rotateY」とすることで
角度を設定する基準となるX軸、Y軸の変更が可能となります。
「:hover」の動作はリストに対しては高さ(最小値)の変化のみ
画像に対して角度を0℃に変化させることに加えて表示位置を若干調整しています。
仕組みについてはこんな感じになります。
リストと画像の2つに対して同時にアニメーションを付けているせいなのか
「:hover」時に画面がチラつくこともあります。(←原因解明できず…)
少々荒削りなサンプルになっているので
CSSでの3Dアニメーションの参考程度に留めておいてください。。。
CSS3の「transform」や「rotate」を使って
今後は3D表現をサイト内に盛り込んでいきたいものです。