Css 3d slideshow
W tutorialu zajmiemy się stworzeniem pokazu zdjęć na bazie transformacji 3d w css. Końcowy efekt wygląda następująco Css 3d slideshow.
<div class="container"> <div id="slideshow"> <div class="front"></div> <div class="back"></div> <div class="right"></div> <div class="left"></div> </div> </div> <a href="#" id="prev">Prev</a> <a href="#" id="next">Next</a>Każdy z divów (front, back, right i left) odpowiada ścianom prostopadłościanu. Najważniejszą częścią przykładu są style css (przedstawione poniżej). Korzystamy tutaj z nowości css3 (css transforms i css transitions). Css transitions służą tutaj do animowania właściwości transform. Reguła transform-style: preserve-3d ustala aby dzieci tego elementu zachowywały transformacje 3d. Reguła transition określa, że płynne przejścia będą dotyczyć wszystkich właściwości transform w czasie 0.5 sekundy. Każdemu divowi wewnątrz #slideshow ustawiamy position: absolute i wymiary takie jak wymiary zdjęcia. Najważniejsze style dotyczą jednak divów .front, .back, .right i .left. Określamy ich tło na odpowiednie zdjęcie oraz dodajemy atrybut transform. W atrybucie tym używamy obrotu (rotate) i przesunięcia wzdłuż osi z (translateZ). Każda ze ścian ma ustawiony odpowiedni obrót oraz przesunięcie równe połowie szerokości (czyli 250px). Wszystko po to aby uzyskać kształt prostopadłościanu.
body { text-align:center; } .container { width: 500px; height: 375px; position: relative; -webkit-perspective: 3000px; -moz-perspective: 3000px; -o-perspective: 3000px; perspective: 3000px; margin: 100px auto; } #slideshow { width: 100%; height: 100%; position: absolute; -webkit-transform-style: preserve-3d; -moz-transform-style: preserve-3d; -o-transform-style: preserve-3d; transform-style: preserve-3d; -webkit-transition: -webkit-transform 0.5s; -moz-transition: -moz-transform 0.5s; -o-transition: -o-transform 0.5s; transition: transform 0.5s; } #slideshow div { width: 500px; height: 375px; display: block; position: absolute; line-height: 200px; text-align: center; } #slideshow .front { -webkit-transform: rotateY(0deg) translateZ(250px); -moz-transform: rotateY(0deg) translateZ(250px); -o-transform: rotateY(0deg) translateZ(250px); transform: rotateY(0deg) translateZ(250px); background: url("a.jpg") no-repeat; } #slideshow .back { -webkit-transform: rotateX(180deg) rotateZ(180deg) translateZ(250px); -moz-transform: rotateX(180deg) rotateZ(180deg) translateZ(250px); -o-transform: rotateX(180deg) rotateZ(180deg) translateZ(250px); transform: rotateX(180deg) rotateZ(180deg) translateZ(250px); background: url("b.jpg") no-repeat; } #slideshow .right { -webkit-transform: rotateY(90deg) translateZ(250px); -moz-transform: rotateY(90deg) translateZ(250px); -o-transform: rotateY(90deg) translateZ(250px); transform: rotateY(90deg) translateZ(250px); background: url("c.jpg") no-repeat; } #slideshow .left { -webkit-transform: rotateY(-90deg) translateZ(250px); -moz-transform: rotateY(-90deg) translateZ(250px); -o-transform: rotateY(-90deg) translateZ(250px); transform: rotateY(-90deg) translateZ(250px); background: url("d.jpg") no-repeat; } a { font-size:20px; font-weight:bold; margin-top:20px; color:black; text-decoration:none; }W javascripcie zmienamy wartość atrybutu rotateY po kliknięciu na next lub prev. Kod javascript:
$(document).ready(function(){ var props = 'transform WebkitTransform MozTransform OTransform msTransform'.split(' '), prop, i, el = document.createElement('div'), y_angle = 0; for(i = 0, l = props.length; i < l; i++) { if(typeof el.style[props[i]] !== "undefined") { prop = props[i]; break; } } $('#next').click(function() { y_angle -= 90; document.getElementById('slideshow').style[prop] = "rotateY("+y_angle+"deg)"; }); $('#prev').click(function() { y_angle += 90; document.getElementById('slideshow').style[prop] = "rotateY("+y_angle+"deg)"; }); });