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();
});