Files
faceFamilySource/src/components/SelectTemplateV2.vue
2025-09-12 22:20:39 +08:00

222 lines
4.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup>
import { ref, onMounted } from "vue"
import { useRouter } from 'vue-router'
import imageBackground from '../static/imageBackground.js';
import { globalStore } from "../globalstore.js";
defineProps({
show: true
})
onMounted(() => {
displayedImages.value = imageBackground[0].children;
})
const router = useRouter();
const navigateTodoList = () => {
router.push({
name: 'home'
})
}
const displayedImages = ref([]);
const goToGenerateImgPage = (item) => {
globalStore.people_count = item.peopleCount;
globalStore.select_template = item.imgUrl;
const hasVisitedBefore = localStorage.getItem('hasVisitedGenerateImg');
if (!hasVisitedBefore) {
localStorage.setItem('hasVisitedGenerateImg', 'true');
router.push({
name: 'generateImgConfirm',
query: { imageUrl: item.imageUrl }
});
} else {
router.push({
name: 'generateImg',
query: { imageUrl: item.imageUrl }
});
}
}
const currentBackground = ref(imageBackground[0].titleImgUrl);
const navImage = ref(null);
// 处理导航条点击事件
const handleNavClick = (event) => {
// 获取点击区域的id
const zone = event.target.closest('.click-zone');
if (!zone) return;
const id = parseInt(zone.dataset.id);
// 根据id找到对应的背景图片
const selectedItem = imageBackground.find(item => item.id === id);
if (selectedItem) {
currentBackground.value = selectedItem.titleImgUrl;
displayedImages.value = selectedItem.children || [];
console.log(`切换到ID ${id}的背景图`);
}
};
</script>
<template>
<div :show="show">
<div class="home-wrapper">
<div class="scene-item item-1">
<img src="../assets/images/back-btn.png" @click="navigateTodoList" alt="后退">
</div>
<!-- 显示当前选中的背景图片 -->
<div class="main-image">
<img :src="currentBackground" alt="Background Image" />
</div>
<!-- 导航条图片分成6个可点击区域 -->
<div class="nav-container">
<div
class="nav-image-wrapper"
ref="navImage"
@click="handleNavClick"
>
<img :src="imageBackground[0].titleImgUrl" alt="Navigation Image" />
<!-- 创建6个可点击区域 -->
<div
v-for="n in 6"
:key="n"
class="click-zone"
:style="{ left: `${(n-1)*16.666}%` }"
:data-id="n"
></div>
</div>
</div>
<div class="images-container">
<div
v-for="(item, index) in displayedImages"
:key="index"
@click="goToGenerateImgPage(item)"
class="mask-image mask-background"
:style="{ 'background-image': `url(${item.imgUrl})` }"
>
<img class="border-img" src="../assets/images/generate/border.png" alt="边框">
</div>
</div>
</div>
</div>
</template>
<style scoped>
.main-image {
position: absolute;
top: 24vw;
padding: 0 3vw;
}
.main-image img {
width: 100%;
}
.nav-container {
position: relative;
}
.nav-image-wrapper {
top: 24vw;
opacity: 0;
position: relative;
display: inline-block;
cursor: pointer;
}
.nav-image-wrapper img {
width: 100%;
display: block;
max-width: none;
}
.click-zone {
position: absolute;
top: -5px;
bottom: -5px;
width: calc(100% /6);
background-color: transparent;
transition: background-color .2s ease-in-out;
}
.images-container {
display: flex;
flex-wrap: wrap;
justify-content: center;
width: 100%;
gap: 3vw;
margin-top: 26vw;
overflow: hidden;
overflow-y: auto;
}
.mask-background {
-webkit-mask-image: url("../assets/images/generate/mengban.png");
mask-image: url("../assets/images/generate/mengban.png");
-webkit-mask-size: contain;
mask-size: contain;
-webkit-mask-position: center;
mask-position: center;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
}
.mask-image {
background-size: cover;
background-repeat: no-repeat;
position: relative;
width: 39vw;
height: 52vw;
}
.border-img {
width: 39.5vw;
height: 54vw;
position: absolute;
top: -0.5vw;
left: 0;
}
.home-wrapper {
width: 100%;
height: 92vh;
background-image: url('../assets/images/generate/select-template-bg.png');
background-size: cover;
background-repeat: no-repeat;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
min-height: -webkit-fill-available;
}
.scene-item {
position: absolute;
cursor: pointer;
transition: all 0.4s ease;
overflow: hidden;
border: 3px solid transparent;
animation: float 4s ease-in-out infinite;
}
.scene-item:hover {
transform: scale(1.05);
}
.scene-item img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.item-1 {
width: 5vw;
top: 6.7%;
left: 5%;
animation-delay: 0s;
}
</style>