v1.3.2
1、更换loading页背景,调整回使用开始按钮进入首页的方式,主要是需要进行音乐播放 2、前门大鼓互动增加提示文字 3、海报下载后先转换为base64,然后再进行展示,主要用于app中图片长按分享。另外调整海报展示的样式,使其不出现滚动 4、scroll-view页面移除无效样式
This commit is contained in:
parent
736e7b7aa0
commit
03cf0c23fa
|
|
@ -12,7 +12,7 @@
|
||||||
<div class="loading-text">海报加载中...</div>
|
<div class="loading-text">海报加载中...</div>
|
||||||
</div>
|
</div>
|
||||||
<img
|
<img
|
||||||
:src="couplet?.image_url"
|
:src="base64Image"
|
||||||
alt="春联海报"
|
alt="春联海报"
|
||||||
style="width: 100%; max-width: 300px; height: auto;"
|
style="width: 100%; max-width: 300px; height: auto;"
|
||||||
@load="isLoading = false"
|
@load="isLoading = false"
|
||||||
|
|
@ -56,20 +56,62 @@ const emit = defineEmits(['close'])
|
||||||
|
|
||||||
// 图片加载状态
|
// 图片加载状态
|
||||||
const isLoading = ref(true)
|
const isLoading = ref(true)
|
||||||
|
// base64格式的图片
|
||||||
|
const base64Image = ref('')
|
||||||
|
|
||||||
|
// 将图片URL转换为base64
|
||||||
|
const convertImageToBase64 = (imageUrl) => {
|
||||||
|
if (!imageUrl) {
|
||||||
|
base64Image.value = ''
|
||||||
|
isLoading.value = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
isLoading.value = true
|
||||||
|
|
||||||
|
const img = new Image()
|
||||||
|
img.crossOrigin = 'Anonymous' // 解决跨域问题
|
||||||
|
|
||||||
|
img.onload = () => {
|
||||||
|
const canvas = document.createElement('canvas')
|
||||||
|
canvas.width = img.width
|
||||||
|
canvas.height = img.height
|
||||||
|
|
||||||
|
const ctx = canvas.getContext('2d')
|
||||||
|
ctx.drawImage(img, 0, 0)
|
||||||
|
|
||||||
|
// 将canvas转换为base64
|
||||||
|
base64Image.value = canvas.toDataURL('image/jpeg', 0.9)
|
||||||
|
isLoading.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
img.onerror = () => {
|
||||||
|
console.error('图片加载失败:', imageUrl)
|
||||||
|
base64Image.value = ''
|
||||||
|
isLoading.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
img.src = imageUrl
|
||||||
|
}
|
||||||
|
|
||||||
// 监听couplet变化,重新开始加载
|
// 监听couplet变化,重新开始加载
|
||||||
watch(() => props.couplet?.image_url, (newImageUrl) => {
|
watch(() => props.couplet?.image_url, (newImageUrl) => {
|
||||||
if (newImageUrl) {
|
if (newImageUrl) {
|
||||||
isLoading.value = true
|
convertImageToBase64(newImageUrl)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// 监听visible变化,当显示时重置加载状态
|
// 监听visible变化,当显示时重置加载状态
|
||||||
watch(() => props.visible, (newVisible) => {
|
watch(() => props.visible, (newVisible) => {
|
||||||
if (newVisible && props.couplet?.image_url) {
|
if (newVisible && props.couplet?.image_url) {
|
||||||
isLoading.value = true
|
convertImageToBase64(props.couplet.image_url)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 组件挂载时初始化
|
||||||
|
if (props.couplet?.image_url) {
|
||||||
|
convertImageToBase64(props.couplet.image_url)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|
@ -102,7 +144,6 @@ watch(() => props.visible, (newVisible) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
.couplet-content {
|
.couplet-content {
|
||||||
max-height: 80vh;
|
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -115,11 +156,6 @@ watch(() => props.visible, (newVisible) => {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.poster-image img {
|
|
||||||
border-radius: 8px;
|
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 图片加载提示 */
|
/* 图片加载提示 */
|
||||||
.image-loading {
|
.image-loading {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,9 @@ const emit = defineEmits(['loaded', 'start'])
|
||||||
const loadingProgress = ref(0)
|
const loadingProgress = ref(0)
|
||||||
// 是否加载完成
|
// 是否加载完成
|
||||||
const isLoadingComplete = ref(false)
|
const isLoadingComplete = ref(false)
|
||||||
|
// 是否显示开始按钮
|
||||||
|
const showStartButton = ref(false)
|
||||||
|
|
||||||
// 生成带时间戳的图片URL(避免缓存)
|
// 生成带时间戳的图片URL(避免缓存)
|
||||||
const generateImageUrl = (name) => {
|
const generateImageUrl = (name) => {
|
||||||
const url = new URL(`/static/bg/${name}.jpg`, import.meta.url)
|
const url = new URL(`/static/bg/${name}.jpg`, import.meta.url)
|
||||||
|
|
@ -24,6 +27,11 @@ const generateImageUrl = (name) => {
|
||||||
return url.href
|
return url.href
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 计算开始按钮是否可见
|
||||||
|
const startButtonVisible = computed(() => {
|
||||||
|
return isLoadingComplete.value && showStartButton.value
|
||||||
|
})
|
||||||
|
|
||||||
// 加载图片函数
|
// 加载图片函数
|
||||||
const loadImages = async () => {
|
const loadImages = async () => {
|
||||||
// 图片名称数组
|
// 图片名称数组
|
||||||
|
|
@ -66,16 +74,12 @@ const loadImages = async () => {
|
||||||
isLoadingComplete.value = true
|
isLoadingComplete.value = true
|
||||||
loadingProgress.value = 100
|
loadingProgress.value = 100
|
||||||
|
|
||||||
// 延迟后自动开始,让用户看到100%的进度
|
// 延迟显示开始按钮,让用户看到100%的进度
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
showStartButton.value = true
|
||||||
// 通知父组件加载完成
|
// 通知父组件加载完成
|
||||||
emit('loaded')
|
emit('loaded')
|
||||||
// 自动开始,进入首页
|
|
||||||
// 等待100ms确保进度条完全显示
|
|
||||||
setTimeout(() => {
|
|
||||||
emit('start')
|
|
||||||
}, 500)
|
}, 500)
|
||||||
}, 100)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 单个图片加载函数
|
// 单个图片加载函数
|
||||||
|
|
@ -88,7 +92,10 @@ const loadImage = (src) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 点击开始按钮
|
||||||
|
const handleStart = () => {
|
||||||
|
emit('start')
|
||||||
|
}
|
||||||
|
|
||||||
// 组件挂载后开始加载图片
|
// 组件挂载后开始加载图片
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|
@ -104,12 +111,17 @@ onMounted(() => {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 进度条区域 -->
|
<!-- 进度条区域 -->
|
||||||
<div class="progress-container">
|
<div v-if="!startButtonVisible" class="progress-container">
|
||||||
<div class="progress-bar">
|
<div class="progress-bar">
|
||||||
<div class="progress-fill" :style="{ width: `${loadingProgress}%` }"></div>
|
<div class="progress-fill" :style="{ width: `${loadingProgress}%` }"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="progress-text">{{ loadingProgress }}%</div>
|
<div class="progress-text">{{ loadingProgress }}%</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 开始按钮 -->
|
||||||
|
<div v-if="startButtonVisible" class="start-button" @click="handleStart">
|
||||||
|
<img src="/static/loading/btn_start.png" alt="开始" class="start-btn-image" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -300,6 +300,7 @@ onUnmounted(() => {
|
||||||
<div class="pulse-indicator">
|
<div class="pulse-indicator">
|
||||||
<div class="pulse-circle"></div>
|
<div class="pulse-circle"></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="hotspot-text">点击播放京韵大鼓</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- sq1图片 -->
|
<!-- sq1图片 -->
|
||||||
|
|
@ -487,4 +488,20 @@ onUnmounted(() => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 热点文字提示 */
|
||||||
|
.hotspot-text {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -40rpx;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #fff;
|
||||||
|
background-color: rgba(0, 0, 0, 0.6);
|
||||||
|
padding: 8rpx 16rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
white-space: nowrap;
|
||||||
|
z-index: 30;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -1204,36 +1204,15 @@ onUnmounted(() => {
|
||||||
transform: scale(1);
|
transform: scale(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.scroll-tip {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 50px;
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
animation: bounce 1.5s infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes bounce {
|
|
||||||
0%, 20%, 50%, 80%, 100% {
|
|
||||||
transform: translateX(-50%) translateY(0);
|
|
||||||
}
|
|
||||||
40% {
|
|
||||||
transform: translateX(-50%) translateY(-20px);
|
|
||||||
}
|
|
||||||
60% {
|
|
||||||
transform: translateX(-50%) translateY(-10px);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 音乐控制按钮样式 */
|
/* 音乐控制按钮样式 */
|
||||||
.music-control {
|
.music-control {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 20px;
|
width: 40px;
|
||||||
right: 20px;
|
height: 40px;
|
||||||
width: 50px;
|
top: 10px;
|
||||||
height: 50px;
|
right: 10px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
/* background-color: rgba(0, 0, 0, 0.3); */
|
/* background-color: rgba(0, 0, 0, 0.3); */
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
@ -1278,35 +1257,4 @@ onUnmounted(() => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 响应式设计 */
|
|
||||||
@media (max-width: 480px) {
|
|
||||||
.scene-title {
|
|
||||||
font-size: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scene-description {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.couplet-item {
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-couplet, .bottom-couplet {
|
|
||||||
margin-right: 20px;
|
|
||||||
margin-left: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.music-control {
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
top: 10px;
|
|
||||||
right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.music-icon {
|
|
||||||
width: 24px;
|
|
||||||
height: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 59 KiB |
Loading…
Reference in New Issue