329 lines
6.3 KiB
CSS
329 lines
6.3 KiB
CSS
/* 文旅主题加载动画样式 */
|
|
|
|
/* 加载器容器 */
|
|
.page-loader {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
background: linear-gradient(135deg, #0a0e27 0%, #1a2947 50%, #0a0e27 100%);
|
|
z-index: 10000;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
transition: opacity 0.8s ease, visibility 0.8s ease;
|
|
}
|
|
|
|
.page-loader.fade-out {
|
|
opacity: 0;
|
|
visibility: hidden;
|
|
}
|
|
|
|
/* 加载内容容器 */
|
|
.loader-content {
|
|
position: relative;
|
|
width: 400px;
|
|
height: 400px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
/* 飞机路径动画 */
|
|
.plane-container {
|
|
position: absolute;
|
|
width: 300px;
|
|
height: 200px;
|
|
top: 50%;
|
|
left: 50%;
|
|
transform: translate(-50%, -50%);
|
|
}
|
|
|
|
.plane-path {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
.flight-path {
|
|
animation: drawPath 2s ease infinite;
|
|
}
|
|
|
|
@keyframes drawPath {
|
|
0% {
|
|
stroke-dashoffset: 400;
|
|
opacity: 0;
|
|
}
|
|
50% {
|
|
opacity: 0.5;
|
|
}
|
|
100% {
|
|
stroke-dashoffset: 0;
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
/* 飞机动画 */
|
|
.plane {
|
|
position: absolute;
|
|
font-size: 24px;
|
|
color: #00b4d8;
|
|
animation: fly 2s ease-in-out infinite;
|
|
filter: drop-shadow(0 4px 8px rgba(0, 180, 216, 0.3));
|
|
}
|
|
|
|
.plane i {
|
|
display: block;
|
|
transform: rotate(-45deg);
|
|
}
|
|
|
|
@keyframes fly {
|
|
0% {
|
|
left: 10%;
|
|
top: 50%;
|
|
transform: translate(-50%, -50%) scale(0.8);
|
|
opacity: 0;
|
|
}
|
|
50% {
|
|
left: 50%;
|
|
top: 25%;
|
|
transform: translate(-50%, -50%) scale(1.2);
|
|
opacity: 1;
|
|
}
|
|
100% {
|
|
left: 90%;
|
|
top: 50%;
|
|
transform: translate(-50%, -50%) scale(0.8);
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
/* 世界地图点动画 */
|
|
.map-outline {
|
|
position: absolute;
|
|
width: 400px;
|
|
height: 200px;
|
|
top: 50%;
|
|
left: 50%;
|
|
transform: translate(-50%, -50%);
|
|
opacity: 0.3;
|
|
}
|
|
|
|
.map-outline circle {
|
|
animation: pulse 2s ease-in-out infinite;
|
|
}
|
|
|
|
.map-outline circle:nth-child(1) { animation-delay: 0s; }
|
|
.map-outline circle:nth-child(2) { animation-delay: 0.2s; }
|
|
.map-outline circle:nth-child(3) { animation-delay: 0.4s; }
|
|
.map-outline circle:nth-child(4) { animation-delay: 0.6s; }
|
|
.map-outline circle:nth-child(5) { animation-delay: 0.8s; }
|
|
|
|
@keyframes pulse {
|
|
0%, 100% {
|
|
r: 3;
|
|
opacity: 0.3;
|
|
}
|
|
50% {
|
|
r: 8;
|
|
opacity: 0.8;
|
|
}
|
|
}
|
|
|
|
/* 护照戳动画 */
|
|
.passport-stamps {
|
|
position: absolute;
|
|
width: 100%;
|
|
height: 100%;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.stamp {
|
|
position: absolute;
|
|
padding: 8px 20px;
|
|
border: 3px solid;
|
|
border-radius: 8px;
|
|
font-weight: bold;
|
|
text-transform: uppercase;
|
|
opacity: 0;
|
|
transform: rotate(-15deg) scale(1.5);
|
|
animation: stampIn 0.6s ease forwards;
|
|
}
|
|
|
|
.stamp-1 {
|
|
top: 20%;
|
|
left: 15%;
|
|
color: #ff6b35;
|
|
border-color: #ff6b35;
|
|
animation-delay: 0.3s;
|
|
}
|
|
|
|
.stamp-2 {
|
|
top: 25%;
|
|
right: 20%;
|
|
color: #00b4d8;
|
|
border-color: #00b4d8;
|
|
transform: rotate(10deg) scale(1.5);
|
|
animation-delay: 0.6s;
|
|
}
|
|
|
|
.stamp-3 {
|
|
bottom: 25%;
|
|
left: 50%;
|
|
transform: translateX(-50%) rotate(-5deg) scale(1.5);
|
|
color: #90e0ef;
|
|
border-color: #90e0ef;
|
|
animation-delay: 0.9s;
|
|
}
|
|
|
|
@keyframes stampIn {
|
|
0% {
|
|
opacity: 0;
|
|
transform: rotate(-15deg) scale(2) translateY(-20px);
|
|
}
|
|
50% {
|
|
opacity: 1;
|
|
transform: rotate(-15deg) scale(0.9) translateY(0);
|
|
}
|
|
70% {
|
|
transform: rotate(-15deg) scale(1.1) translateY(0);
|
|
}
|
|
100% {
|
|
opacity: 0.2;
|
|
transform: rotate(-15deg) scale(1) translateY(0);
|
|
}
|
|
}
|
|
|
|
/* 加载文字 */
|
|
.loader-text {
|
|
position: relative;
|
|
z-index: 10;
|
|
text-align: center;
|
|
margin-top: 50px;
|
|
}
|
|
|
|
.loader-text h3 {
|
|
color: #fff;
|
|
font-size: 28px;
|
|
font-weight: 700;
|
|
margin-bottom: 15px;
|
|
letter-spacing: 2px;
|
|
background: linear-gradient(135deg, #00b4d8, #90e0ef, #ff6b35);
|
|
-webkit-background-clip: text;
|
|
-webkit-text-fill-color: transparent;
|
|
animation: shimmer 2s ease infinite;
|
|
}
|
|
|
|
@keyframes shimmer {
|
|
0%, 100% {
|
|
opacity: 0.8;
|
|
}
|
|
50% {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
/* 加载点动画 */
|
|
.loading-dots {
|
|
display: flex;
|
|
gap: 8px;
|
|
justify-content: center;
|
|
}
|
|
|
|
.loading-dots span {
|
|
width: 10px;
|
|
height: 10px;
|
|
background: #00b4d8;
|
|
border-radius: 50%;
|
|
animation: dotPulse 1.5s ease infinite;
|
|
}
|
|
|
|
.loading-dots span:nth-child(1) { animation-delay: 0s; }
|
|
.loading-dots span:nth-child(2) { animation-delay: 0.2s; }
|
|
.loading-dots span:nth-child(3) { animation-delay: 0.4s; }
|
|
|
|
@keyframes dotPulse {
|
|
0%, 80%, 100% {
|
|
transform: scale(0.8);
|
|
opacity: 0.5;
|
|
}
|
|
40% {
|
|
transform: scale(1.2);
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
/* 进度条 */
|
|
.loader-progress {
|
|
position: absolute;
|
|
bottom: 80px;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
width: 200px;
|
|
height: 4px;
|
|
background: rgba(255, 255, 255, 0.1);
|
|
border-radius: 2px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.progress-bar {
|
|
height: 100%;
|
|
background: linear-gradient(90deg, #00b4d8, #90e0ef, #ff6b35);
|
|
border-radius: 2px;
|
|
animation: progress 2s ease forwards;
|
|
}
|
|
|
|
@keyframes progress {
|
|
0% {
|
|
width: 0;
|
|
}
|
|
100% {
|
|
width: 100%;
|
|
}
|
|
}
|
|
|
|
/* 响应式设计 */
|
|
@media (max-width: 768px) {
|
|
.loader-content {
|
|
width: 300px;
|
|
height: 300px;
|
|
}
|
|
|
|
.plane-container {
|
|
width: 250px;
|
|
height: 150px;
|
|
}
|
|
|
|
.map-outline {
|
|
width: 300px;
|
|
height: 150px;
|
|
}
|
|
|
|
.loader-text h3 {
|
|
font-size: 24px;
|
|
}
|
|
|
|
.stamp {
|
|
font-size: 12px;
|
|
padding: 6px 15px;
|
|
}
|
|
|
|
.loader-progress {
|
|
width: 150px;
|
|
bottom: 60px;
|
|
}
|
|
}
|
|
|
|
/* 快速加载模式 */
|
|
.page-loader.quick-load .progress-bar {
|
|
animation-duration: 0.8s;
|
|
}
|
|
|
|
.page-loader.quick-load .plane {
|
|
animation-duration: 1s;
|
|
}
|
|
|
|
.page-loader.quick-load .stamp {
|
|
animation-duration: 0.3s;
|
|
} |