webkit & firefox
Forked from Dima Karpov's Pen CSS 3D Panorama.
webkit & firefox
Forked from Dima Karpov's Pen CSS 3D Panorama.
| <h1>CSS 3D Panorama</h1> | |
| <h2>webkit & firefox</h2> | |
| <div class="wrap"> | |
| <div id="demo"> | |
| <div id="loader"></div> | |
| <div id="panorama"> | |
| <div class="face f1"></div> | |
| <div class="face f2"></div> | |
| <div class="face f3"> | |
| </div> | |
| <div class="face f4"> | |
| <div class="label" id="l1"> | |
| Public Library | |
| <hr /> | |
| </div> | |
| </div> | |
| <div class="face f5"> | |
| <div class="label" id="l2"> | |
| Hospital | |
| <hr /> | |
| </div> | |
| </div> | |
| <div class="face f6"> | |
| <div class="label" id="l3"> | |
| Middle school | |
| <hr /> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> |
| window.requestAnimFrame = (function() { | |
| return window.requestAnimationFrame || | |
| window.webkitRequestAnimationFrame || | |
| window.mozRequestAnimationFrame || | |
| function(callback) { | |
| window.setTimeout(callback, 1000 / 60); | |
| }; | |
| })(); | |
| var Demo = { | |
| loaded: 0, | |
| drag: false, | |
| speed: 0.5, | |
| brake: 1, | |
| r: 0, | |
| images: [ | |
| 'http://cs617727.vk.me/v617727366/942f/DqbS0IRIATA.jpg', | |
| 'http://cs617727.vk.me/v617727366/9436/Ig4ieHZXvNo.jpg', | |
| 'http://cs617727.vk.me/v617727366/943d/g8xqn7S87kQ.jpg', | |
| 'http://cs617727.vk.me/v617727366/9444/DfhvfFfTarY.jpg', | |
| 'http://cs617727.vk.me/v617727366/944b/-McVeNNxf-A.jpg', | |
| 'http://cs617727.vk.me/v617727366/9452/w1bBTnHANig.jpg' | |
| ], | |
| Down: function(e) { | |
| Demo.o = Demo.r; | |
| Demo.x = Demo.r + e.clientX; | |
| Demo.drag = true; | |
| Demo.time = new Date(); | |
| }, | |
| Move: function(e) { | |
| if (Demo.drag) { | |
| Demo.r = Demo.x - e.clientX; | |
| Demo.p.style.webkitTransform = 'rotateY(' + Demo.r * 180 / 400 + 'deg)'; | |
| Demo.p.style.mozTransform = 'rotateY(' + Demo.r * 180 / 400 + 'deg)'; | |
| Demo.p.style.transform = 'rotateY(' + Demo.r * 180 / 400 + 'deg)'; | |
| } | |
| }, | |
| Up: function() { | |
| if (Demo.drag) { | |
| var time = new Date() - Demo.time; | |
| var path = Demo.r - Demo.o; | |
| Demo.speed = path / time * 5; | |
| Demo.brake = 1.01; | |
| Demo.drag = false; | |
| } | |
| }, | |
| Spin: function() { | |
| if (!Demo.drag) { | |
| Demo.r += Demo.speed; | |
| Demo.speed /= Demo.brake; | |
| Demo.p.style.webkitTransform = 'rotateY(' + Demo.r * 180 / 400 + 'deg)'; | |
| Demo.p.style.mozTransform = 'rotateY(' + Demo.r * 180 / 400 + 'deg)'; | |
| Demo.p.style.transform = 'rotateY(' + Demo.r * 180 / 400 + 'deg)'; | |
| } | |
| window.requestAnimFrame(Demo.Spin); | |
| }, | |
| Bind: function() { | |
| Demo.e.addEventListener('mousedown', Demo.Down, false); | |
| Demo.e.addEventListener('mousemove', Demo.Move, false); | |
| Demo.e.addEventListener('mouseup', Demo.Up, false); | |
| Demo.e.addEventListener('mouseleave', Demo.Up, false); | |
| window.requestAnimFrame(Demo.Spin); | |
| }, | |
| Progress: function() { | |
| Demo.loaded++; | |
| Demo.l.style.width = Demo.loaded / Demo.images.length * 100 + '%'; | |
| if (Demo.loaded === Demo.images.length) { | |
| Demo.l.style.opacity = 0; | |
| Demo.p.style.opacity = 1; | |
| Demo.Bind(); | |
| }; | |
| }, | |
| Load: function() { | |
| for (var i = 0; i < Demo.images.length; i++) { | |
| var img = new Image(); | |
| img.addEventListener('load', Demo.Progress, false); | |
| img.src = Demo.images[i]; | |
| } | |
| }, | |
| Init: function() { | |
| Demo.e = document.getElementById('demo'); | |
| Demo.p = document.getElementById('panorama'); | |
| Demo.l = document.getElementById('loader'); | |
| Demo.Load(); | |
| } | |
| }; | |
| document.addEventListener('DOMContentLoaded', Demo.Init, false); |
| html, body { | |
| height: 100%; width: 100%; | |
| } | |
| body { | |
| margin: 0; | |
| background: #E3E3E3; | |
| font-family: "Times New Roman", Times, serif; | |
| } | |
| h1 { | |
| text-align: center; | |
| margin: 0; | |
| font-size: 28px; | |
| font-style: italic; | |
| color: #FFF; | |
| text-shadow: 1px 1px 2px #AAA; | |
| padding: 40px 0 0 0; | |
| } | |
| h2 { | |
| text-align: center; | |
| margin: 0; | |
| font-size: 18px; | |
| font-style: italic; | |
| font-weight: normal; | |
| color: #FFF; | |
| text-shadow: 1px 1px 2px #AAA; | |
| padding: 10px 0 20px 0; | |
| } | |
| .wrap { | |
| background: #FFF; | |
| padding: 10px; | |
| box-shadow: 0 0 3px #AAA; | |
| margin: 0 auto; | |
| height: 400px; width: 400px; | |
| border-radius: 3px; | |
| } | |
| #demo { | |
| height: 100%; width: 100%; | |
| overflow: hidden; | |
| position: relative; | |
| -webkit-perspective: 300px; | |
| -moz-perspective: 300px; | |
| perspective: 300px; | |
| -webkit-user-select: none; | |
| -moz-user-select: none; | |
| user-select: none; | |
| } | |
| #loader { | |
| position: absolute; | |
| left: 0; top: 198px; | |
| height: 4px; | |
| background: #222; | |
| border-radius: 2px; | |
| } | |
| #panorama { | |
| opacity: 0; | |
| -webkit-transition: opacity 0.5s ease; | |
| -moz-transition: opacity 0.5s ease; | |
| transition: opacity 0.5s ease; | |
| } | |
| #panorama, #panorama .face { | |
| position: absolute; | |
| top: 0; left: 0; | |
| width: 100%; height: 100%; | |
| -webkit-transform-style: preserve-3d; | |
| -moz-transform-style: preserve-3d; | |
| transform-style: preserve-3d; | |
| } | |
| #panorama .face, .label { | |
| -webkit-backface-visibility:hidden; | |
| -moz-backface-visibility:hidden; | |
| backface-visibility:hidden; | |
| } | |
| #panorama .face:nth-child(1) { | |
| background-image: url("http://cs617727.vk.me/v617727366/942f/DqbS0IRIATA.jpg"); | |
| -webkit-transform: rotateX(90deg) translateZ(-199px); | |
| -moz-transform: rotateX(90deg) translateZ(-199px); | |
| transform: rotateX(90deg) translateZ(-199px); | |
| } | |
| #panorama .face:nth-child(2) { | |
| background-image: url("http://cs617727.vk.me/v617727366/9436/Ig4ieHZXvNo.jpg"); | |
| -webkit-transform: rotateX(-90deg) translateZ(-199px); | |
| -moz-transform: rotateX(-90deg) translateZ(-199px); | |
| transform: rotateX(-90deg) translateZ(-199px); | |
| } | |
| #panorama .face:nth-child(3) { | |
| background-image: url("http://cs617727.vk.me/v617727366/943d/g8xqn7S87kQ.jpg"); | |
| -webkit-transform: rotateY(90deg) translateZ(-199px); | |
| -moz-transform: rotateY(90deg) translateZ(-199px); | |
| transform: rotateY(90deg) translateZ(-199px); | |
| } | |
| #panorama .face:nth-child(4) { | |
| background-image: url("http://cs617727.vk.me/v617727366/9444/DfhvfFfTarY.jpg"); | |
| -webkit-transform: rotateY(-90deg) translateZ(-199px); | |
| -moz-transform: rotateY(-90deg) translateZ(-199px); | |
| transform: rotateY(-90deg) translateZ(-199px); | |
| } | |
| #panorama .face:nth-child(5) { | |
| background-image: url("http://cs617727.vk.me/v617727366/944b/-McVeNNxf-A.jpg"); | |
| -webkit-transform: translateZ(-199px); | |
| -moz-transform: translateZ(-199px); | |
| transform: translateZ(-199px); | |
| } | |
| #panorama .face:nth-child(6) { | |
| background-image: url("http://cs617727.vk.me/v617727366/9452/w1bBTnHANig.jpg"); | |
| -webkit-transform: rotateY(180deg) translateZ(-199px); | |
| -moz-transform: rotateY(180deg) translateZ(-199px); | |
| transform: rotateY(180deg) translateZ(-199px); | |
| } | |
| .label { | |
| position: absolute; | |
| color: #FFF; | |
| font-size: 16px; | |
| text-shadow: 1px 1px 2px #000; | |
| padding: 3px 3px 3px 0; | |
| font-style: italic; | |
| } | |
| .label:before, .label hr { | |
| position: absolute; | |
| left: 0; bottom: 0; | |
| height: 2px; | |
| background: #FFF; | |
| } | |
| .label:before { | |
| content: ''; | |
| width: 100%; | |
| box-shadow: 1px 1px 2px rgba(0,0,0,.50); | |
| } | |
| .label hr { | |
| margin: 0; border: 0; | |
| box-shadow: 1px -1px 2px rgba(0,0,0,.50); | |
| -webkit-transform: rotate(110deg); | |
| -moz-transform: rotate(110deg); | |
| transform: rotate(110deg); | |
| -webkit-transform-origin: 1px 1px; | |
| -moz-transform-origin: 1px 1px; | |
| transform-origin: 1px 1px; | |
| } | |
| .label hr:before { | |
| content: ''; | |
| position: absolute; | |
| right: -3px; top: -3px; | |
| height: 8px; width: 8px; | |
| background: #FFF; | |
| border-radius: 4px; | |
| box-shadow: 1px -1px 2px rgba(0,0,0,.50); | |
| } | |
| #l1 { | |
| left: 140px; bottom: 30px; | |
| -webkit-transform: translateZ(50px); | |
| -moz-transform: translateZ(50px); | |
| transform: translateZ(50px); | |
| } | |
| #l1 hr {width: 30px;} | |
| #l2 { | |
| left: 190px; bottom: 70px; | |
| -webkit-transform: translateZ(70px); | |
| -moz-transform: translateZ(70px); | |
| transform: translateZ(70px); | |
| } | |
| #l2 hr {width: 70px;} | |
| #l3 { | |
| left: 190px; bottom: 50px; | |
| -webkit-transform: translateZ(30px); | |
| -moz-transform: translateZ(30px); | |
| transform: translateZ(30px); | |
| } | |
| #l3 hr {width: 50px;} |