CSS3 3d变换实现的开门效果-单门实例页面
回到相关文章 »效果:
我的书房
代码:
CSS代码:
.door-box { max-width: 100%; width: 375px; height: 628px; margin: 40px auto; background-color: #2a273c; font-family: STHeiTi, SimHei; overflow: hidden; position: relative; z-index: 1; } .door-box.active { animation: flyIntoRoom 1s both; } .door-box div { position: absolute; } .wall { left: 0; top: 0; right: 0; bottom: 46px; border-bottom: 3px solid #211820; background-color: #768bb6; max-height: calc(1.8 * (375px - 80px)); margin: auto; box-shadow: 0 -200px #768bb6; } .door-border { top: 28px; left: 40px; right: 40px; bottom: 0; border: 3px solid #211820; border-radius: 2px 2px 0 0; border-bottom: 0; background-color: #183269; } .door-frame { top: 10px; left: 9px; right: 9px; bottom: 0; border: 3px solid #211820; border-radius: 2px 2px 0 0; border-bottom: 0; background-color: #fbfad0; -webkit-perspective: 1200px; perspective: 1200px; } .door { left: 0; top: 0; right: 0; bottom: 0; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; transform-origin: left; transform: rotateY(0deg); -webkit-backface-visibility: hidden; backface-visibility: hidden; } .door-face-1, .door-face-0 { left: -3px; top: -3px; right: -3px; bottom: -3px; border: 3px solid #211820; background-color: #295489; } .door-face-0 { transform: translateZ(-12px); } .door-face-1 { transform: translateZ(0); } .door-face-2 { height: 6px; left: -3px; right: -3px; top: 0; border: 3px solid #211820; border-radius: 2px; background-color: #0c2e59; transform: translate3D(0, -7.5px, -6px) rotateX(90deg); } .door-face-3 { width: 6px; top: -3px; right: 0; bottom: -3px; border: 3px solid #211820; border-radius: 2px; background-color: #0c2e59; transform: translate3D(7.5px, 0, -6px) rotateY(90deg); } /*光线*/ .light { left: 0; top: 0; bottom: 0; background: #F7E08F; width: 1000px; transform: translateZ(-13px); } /*门牌*/ .door-card { width: 165px; height: 60px; line-height: 60px; background-color: #c1d0ec; top: 60px; left: 0; right: 0; margin: auto; text-align: center; font-size: 30px; border: 3px solid; border-radius: 2px; } .door-btn { left: 0; right: 0; text-align: center; margin-top: 140px; font-size: 24px; color: #9dbce3; line-height: 36px; } .door-in { width: 104px; height: 40px; border-radius: 40px; border: 2px solid; line-height: 40px; background-color: #eacc86; font-family: inherit; font-size: 24px; padding: 0; margin: 10px 0; } /* 动画 */ @keyframes flyIntoRoom { from { transform: scale(1) translateZ(0); opacity: 1; } to { transform: scale(2) translateZ(100px); opacity: 0; } } .room-img { position: absolute; width: 375px; max-width: 100%; left: 0; right: 0; top: 40px; margin: auto; }
HTML代码:
<div id="doorBox" class="door-box"> <div class="wall"> <div class="door-border"> <div class="door-frame"> <!-- 门 --> <div id="door" class="door"> <!-- 门后的光线 --> <div id="light" class="light" style="opacity: .8;" hidden=""></div> <!-- 门后 --> <div class="door-face-0"></div> <!-- 三个面 --> <div class="door-face-2"></div> <div class="door-face-1"> <!-- 门上的挂牌 --> <div class="door-card">我的书房</div> <!-- 进入按钮 --> <div class="door-btn"> <button id="doorBtnIn" class="door-in">进入</button> </div> </div> <div class="door-face-3"></div> </div> </div> </div> </div> </div> <!-- 书房 --> <img src="./room-s.jpg" class="room-img" width="375" height="500"> <div hidden><audio id="audioOpen" src="./open.mp3" preload></audio></div>
JS代码:
// 门,光线这类运动元素 var eleDoor = document.getElementById('door'); var eleLight = document.getElementById('light'); var eleDoorBox = document.getElementById('doorBox'); // 开门音效mp3 var eleAudioOpen = document.getElementById('audioOpen'); // 开门动画 var percentDoor = 0; var fnOpenDoor = function () { percentDoor++; // 门完全打开后,进入下一个画面 if (percentDoor == 100) { eleDoorBox.classList.add('active'); return; } // 门打开 eleDoor.style.transform = 'rotateY('+ (-90 * percentDoor / 100) +'deg)'; eleLight.removeAttribute('hidden'); // 光线变化 eleLight.style.opacity = 0.8 - 0.9 * percentDoor / 100; setTimeout(fnOpenDoor, 16); }; document.querySelector('#doorBtnIn').addEventListener('click', function () { eleAudioOpen.play(); fnOpenDoor(); });