|
@@ -1,166 +0,0 @@
|
|
-<template>
|
|
|
|
- <div class="air-door-container" @click="toggleDoor">
|
|
|
|
- <!-- 添加3D变换专用包装器 -->
|
|
|
|
- <div class="svg-3d-wrapper">
|
|
|
|
- <svg viewBox="0 0 800 400" width="800" height="400">
|
|
|
|
- <!-- 定义渐变和图案 -->
|
|
|
|
- <defs>
|
|
|
|
- <linearGradient id="tunnelGradient" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
|
|
- <stop offset="0%" stop-color="#222" />
|
|
|
|
- <stop offset="50%" stop-color="#444" />
|
|
|
|
- <stop offset="100%" stop-color="#222" />
|
|
|
|
- </linearGradient>
|
|
|
|
- <pattern id="tunnelBottomPattern" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
|
|
- <!-- <rect width="40" height="40" fill="#333" fill-opacity="0.8" /> -->
|
|
|
|
- </pattern>
|
|
|
|
- </defs>
|
|
|
|
-
|
|
|
|
- <!-- 巷道顶部 - 只有左上和右上圆角 -->
|
|
|
|
- <path d="M0,20 A20,20 0 0 1 20,0 H780 A20,20 0 0 1 800,20 V120 H0 Z"
|
|
|
|
- fill="url(#tunnelGradient)" />
|
|
|
|
-
|
|
|
|
- <!-- 巷道底部 -->
|
|
|
|
- <rect x="0" y="120" width="800" height="300" fill="url(#tunnelBottomPattern)" />
|
|
|
|
-
|
|
|
|
- <!-- 门框 -->
|
|
|
|
- <rect x="8" y="128" width="784" height="272" rx="20" ry="10" fill="none" stroke="#8B4513" stroke-width="8" />
|
|
|
|
-
|
|
|
|
- <!-- 左门 -->
|
|
|
|
- <g
|
|
|
|
- :class="{ 'left-door-open': isOpen, 'left-door-closed': !isOpen }"
|
|
|
|
- transform-origin="left center"
|
|
|
|
- >
|
|
|
|
- <rect
|
|
|
|
- x="16"
|
|
|
|
- y="136"
|
|
|
|
- width="384"
|
|
|
|
- height="256"
|
|
|
|
-
|
|
|
|
- fill="#A9A9A9"
|
|
|
|
- stroke="#696969"
|
|
|
|
- stroke-width="2"
|
|
|
|
- />
|
|
|
|
- <line x1="200" y1="146" x2="200" y2="392" stroke="#696969" stroke-width="1" />
|
|
|
|
- <line x1="16" y1="264" x2="399" y2="264" stroke="#696969" stroke-width="1" />
|
|
|
|
- </g>
|
|
|
|
-
|
|
|
|
- <!-- 右门 -->
|
|
|
|
- <g
|
|
|
|
- :class="{ 'right-door-open': isOpen, 'right-door-closed': !isOpen }"
|
|
|
|
- transform-origin="right center"
|
|
|
|
- >
|
|
|
|
- <rect
|
|
|
|
- x="400"
|
|
|
|
- y="136"
|
|
|
|
- width="384"
|
|
|
|
- height="256"
|
|
|
|
- fill="#A9A9A9"
|
|
|
|
- stroke="#696969"
|
|
|
|
- stroke-width="2"
|
|
|
|
- />
|
|
|
|
- <line x1="584" y1="146" x2="584" y2="392" stroke="#696969" stroke-width="1" />
|
|
|
|
- <line x1="400" y1="264" x2="783" y2="264" stroke="#696969" stroke-width="1" />
|
|
|
|
- </g>
|
|
|
|
- </svg>
|
|
|
|
- </div>
|
|
|
|
- <div class="status">
|
|
|
|
- {{ isOpen ? '风门开启' : '风门关闭' }}
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
-</template>
|
|
|
|
-
|
|
|
|
-<script lang="ts" setup>
|
|
|
|
-import { ref } from 'vue';
|
|
|
|
-
|
|
|
|
-const isOpen = ref(false);
|
|
|
|
-
|
|
|
|
-const toggleDoor = () => {
|
|
|
|
- isOpen.value = !isOpen.value;
|
|
|
|
-};
|
|
|
|
-</script>
|
|
|
|
-
|
|
|
|
-<style scoped>
|
|
|
|
-.air-door-container {
|
|
|
|
- position: relative;
|
|
|
|
- width: 800px;
|
|
|
|
- height: 400px;
|
|
|
|
- margin: 0 auto;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.svg-3d-wrapper {
|
|
|
|
- width: 100%;
|
|
|
|
- height: 100%;
|
|
|
|
- perspective: 800px; /* 透视距离 */
|
|
|
|
- transform-style: preserve-3d;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-svg {
|
|
|
|
- display: block;
|
|
|
|
- overflow: visible; /* 确保旋转内容不被裁剪 */
|
|
|
|
- transform-style: preserve-3d;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* 门元素3D优化 */
|
|
|
|
-g {
|
|
|
|
- transform-box: fill-box;
|
|
|
|
- backface-visibility: visible;
|
|
|
|
- will-change: transform; /* 性能优化 */
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* 左门打开动画 */
|
|
|
|
-@keyframes leftDoorOpen {
|
|
|
|
- from { transform: translateZ(1px) rotateY(0deg); }
|
|
|
|
- to { transform: translateZ(1px) rotateY(-75deg); }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* 左门关闭动画 */
|
|
|
|
-@keyframes leftDoorClose {
|
|
|
|
- from { transform: translateZ(1px) rotateY(-75deg); }
|
|
|
|
- to { transform: translateZ(1px) rotateY(0deg); }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* 右门打开动画 */
|
|
|
|
-@keyframes rightDoorOpen {
|
|
|
|
- from { transform: translateZ(1px) rotateY(0deg); }
|
|
|
|
- to { transform: translateZ(1px) rotateY(-75deg); }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* 右门关闭动画 */
|
|
|
|
-@keyframes rightDoorClose {
|
|
|
|
- from { transform: translateZ(1px) rotateY(-75deg); }
|
|
|
|
- to { transform: translateZ(1px) rotateY(0deg); }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* 左门打开状态 */
|
|
|
|
-.left-door-open {
|
|
|
|
- animation: leftDoorOpen 2s cubic-bezier(0.22, 1, 0.36, 1) forwards;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* 左门关闭状态 */
|
|
|
|
-.left-door-closed {
|
|
|
|
- animation: leftDoorClose 2s cubic-bezier(0.22, 1, 0.36, 1) forwards;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* 右门打开状态 */
|
|
|
|
-.right-door-open {
|
|
|
|
- animation: rightDoorOpen 2s cubic-bezier(0.22, 1, 0.36, 1) forwards;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* 右门关闭状态 */
|
|
|
|
-.right-door-closed {
|
|
|
|
- animation: rightDoorClose 2s cubic-bezier(0.22, 1, 0.36, 1) forwards;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.status {
|
|
|
|
- position: absolute;
|
|
|
|
- top: 10px;
|
|
|
|
- left: 0;
|
|
|
|
- width: 100%;
|
|
|
|
- text-align: center;
|
|
|
|
- font-size: 18px;
|
|
|
|
- font-weight: bold;
|
|
|
|
- color: #fff;
|
|
|
|
- text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
|
|
|
|
- pointer-events: none; /* 防止遮挡点击事件 */
|
|
|
|
-}
|
|
|
|
-</style>
|
|
|