You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
4.7 KiB

4 months ago
<template>
4 months ago
<view>
<swiper class="main-swiper" :vertical="true" :current="currentIndex" @change="handleSwiperChange" :duration="300">
<swiper-item>
<view class="page-container home-page">
<template v-if="loadedPages[0]">
3 months ago
<image v-show="shouldShowContent(0)" class="bg-image" src="https://static.ticket.sz-trip.com/epicSoul/image/chapter1/feel.png" mode=""
4 months ago
:lazy-load="true"></image>
<view v-show="shouldShowContent(0)" class="arrow-content">
3 months ago
<image class="arrow-down" src="https://static.ticket.sz-trip.com/epicSoul/image/chapter3/botIcon.png" mode="" :lazy-load="true"></image>
4 months ago
</view>
</template>
</view>
</swiper-item>
<swiper-item>
<view class="page-container home-page">
<template v-if="loadedPages[1]">
3 months ago
<image v-show="shouldShowContent(1)" class="bg-image" src="https://static.ticket.sz-trip.com/epicSoul/image/chapter1/feel2.png"
4 months ago
mode="" :lazy-load="true"></image>
<view v-show="shouldShowContent(1)" :class="['animate-content', {'animate-visible': isVisible}]">
3 months ago
<image class="feel2-img" src="https://static.ticket.sz-trip.com/epicSoul/image/chapter1/feel2-img.png" mode="" :lazy-load="true">
4 months ago
</image>
</view>
4 months ago
<image v-show="shouldShowContent(1)" @click="goback" class="btn" src="https://static.ticket.sz-trip.com/epicSoul/reselect-btn.png"
4 months ago
mode="" :lazy-load="true"></image>
</template>
</view>
</swiper-item>
</swiper>
<MusicControl />
<NavMenu :nav-index="0" @jump-to-page="handleJumpToPage" />
<AudioControl audioSrc="https://des.js-dyyj.com/data/2025/09/05/fac61c02-6cfd-41bf-9270-0ecd69881da2.MP3" />
4 months ago
</view>
4 months ago
</template>
4 months ago
<script>
import AudioControl from '@/components/AudioControl.vue';
3 months ago
import MusicControl from '@/components/MusicControl.vue';
import NavMenu from '../components/NavMenu.vue';
4 months ago
export default {
components: {MusicControl,AudioControl,
NavMenu},
4 months ago
data() {
return {
isVisible: false,
currentIndex: 0,
loadedPages: {
0: false,
1: false
},
preloadBuffer: 1
};
},
methods: {
shouldShowContent(index) {
return Math.abs(index - this.currentIndex) <= this.preloadBuffer;
},
handleSwiperChange(e) {
this.currentIndex = e.detail.current;
},
goback() {
uni.navigateBack({
delta: 1
});
}
},
watch: {
currentIndex: {
handler(newIndex) {
for (let i = Math.max(0, newIndex - this.preloadBuffer); i <= Math.min(1, newIndex + this.preloadBuffer); i++) {
this.loadedPages[i] = true;
}
this.isVisible = newIndex === 1;
},
immediate: true
}
},
mounted() {
this.loadedPages[0] = true;
if (this.preloadBuffer >= 1) {
this.loadedPages[1] = true;
}
}
};
4 months ago
</script>
<style scoped>
4 months ago
.main-swiper {
width: 100%;
height: 100vh;
}
.page-container {
height: 100vh;
}
.home-page {
position: relative;
overflow: hidden;
}
.bg-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
}
.animate-content {
position: absolute;
left: 0;
top: 18%;
width: 100%;
display: flex;
justify-content: center;
z-index: 2;
opacity: 0;
transform: scale(0.9);
filter: blur(5px);
transition: opacity 0.6s ease-out 0.2s,
transform 0.6s ease-out 0.2s,
filter 0.6s ease-out 0.2s;
}
.animate-visible {
opacity: 1;
transform: scale(1);
filter: blur(0px);
}
.feel2-img {
width: 89%;
height: 248rpx;
}
.arrow-content {
width: 100%;
position: absolute;
bottom: 5%;
left: 50%;
transform: translate(-50%, -50%);
display: flex;
align-items: center;
justify-content: center;
z-index: 2;
}
.arrow-down {
width: 200rpx;
height: 40rpx;
animation: bounce 1.5s infinite;
}
.btn {
position: absolute;
left: 50%;
bottom: 12%;
transform: translate(-50%, -50%);
z-index: 2;
width: 180rpx;
height: 56rpx;
}
@keyframes bounce {
0%,
20%,
50%,
80%,
100% {
transform: translateY(0);
}
40% {
transform: translateY(-20rpx);
}
60% {
transform: translateY(-10rpx);
}
}
4 months ago
</style>