|
|
@@ -60,7 +60,7 @@
|
|
|
<div class="image-container">
|
|
|
<el-carousel
|
|
|
v-if="getFieldValue(artifactData, 'imageFiles') && getFieldValue(artifactData, 'imageFiles').length > 0"
|
|
|
- height="90%" indicator-position="outside" arrow="hover">
|
|
|
+ height="90%" arrow="hover" ref="slideCarousel" @change="setActiveItem">
|
|
|
<el-carousel-item v-for="(image, index) in getFieldValue(artifactData, 'imageFiles')" :key="index">
|
|
|
<img :src="image" :alt="`文物图片${index + 1}`" class="carousel-image">
|
|
|
</el-carousel-item>
|
|
|
@@ -79,8 +79,8 @@
|
|
|
<div class="artifact-meta">
|
|
|
<span class="year">{{ getFieldValue(artifactData, 'era') }}</span>
|
|
|
<span class="source">{{ getFieldValue(artifactData, 'texture') }}</span>
|
|
|
- <span class="level">{{ getFieldValue(artifactData, 'level') || getFieldValue(artifactData, 'grade') || '等级不详'
|
|
|
- }}</span>
|
|
|
+ <span class="level">{{ getFieldValue(artifactData, 'level') || '等级不详'
|
|
|
+ }}</span>
|
|
|
</div>
|
|
|
<div class="artifact-size">{{ getFieldValue(artifactData, 'size') || getFieldValue(artifactData, 'dimensions')
|
|
|
|| '尺寸不详' }}</div>
|
|
|
@@ -99,7 +99,7 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
-import { ref, onMounted, computed } from 'vue'
|
|
|
+import { ref, onMounted, computed, nextTick } from 'vue'
|
|
|
import { useRouter, useRoute } from 'vue-router'
|
|
|
import { museumApi } from '@/api/indexPage'
|
|
|
|
|
|
@@ -162,6 +162,9 @@ const switchTab = (tab) => {
|
|
|
if (isZoomed.value) {
|
|
|
toggleZoom()
|
|
|
}
|
|
|
+ if (activeTab.value === 'image') {
|
|
|
+ slideBanner()
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 切换放大缩小状态
|
|
|
@@ -180,6 +183,125 @@ const toggleZoom = () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// 轮播图引用
|
|
|
+const slideCarousel = ref(null)
|
|
|
+
|
|
|
+// 轮播图切换事件
|
|
|
+const setActiveItem = (index) => {
|
|
|
+ console.log('轮播图切换到:', index)
|
|
|
+}
|
|
|
+
|
|
|
+// 滑动切换
|
|
|
+const slideBanner = () => {
|
|
|
+ // 等待DOM更新后再添加事件监听
|
|
|
+ nextTick(() => {
|
|
|
+ const box = document.querySelector('.el-carousel__container')
|
|
|
+ if (!box) return
|
|
|
+
|
|
|
+ let startPoint = 0
|
|
|
+ let stopPoint = 0
|
|
|
+ let isDragging = false
|
|
|
+
|
|
|
+ // 重置坐标
|
|
|
+ const resetPoint = () => {
|
|
|
+ startPoint = 0
|
|
|
+ stopPoint = 0
|
|
|
+ isDragging = false
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理滑动切换逻辑
|
|
|
+ const handleSlideChange = () => {
|
|
|
+ if (stopPoint === 0 || startPoint - stopPoint === 0) {
|
|
|
+ resetPoint()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ console.log(slideCarousel.value, 999)
|
|
|
+ if (slideCarousel.value) {
|
|
|
+ if (startPoint - stopPoint > 0) {
|
|
|
+ // 向左滑动,下一张
|
|
|
+ slideCarousel.value.next()
|
|
|
+ } else {
|
|
|
+ // 向右滑动,上一张
|
|
|
+ slideCarousel.value.prev()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ resetPoint()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 移除之前的事件监听器(避免重复绑定)
|
|
|
+ box.removeEventListener('touchstart', handleTouchStart)
|
|
|
+ box.removeEventListener('touchmove', handleTouchMove)
|
|
|
+ box.removeEventListener('touchend', handleTouchEnd)
|
|
|
+ box.removeEventListener('mousedown', handleMouseDown)
|
|
|
+ box.removeEventListener('mousemove', handleMouseMove)
|
|
|
+ box.removeEventListener('mouseup', handleMouseUp)
|
|
|
+ box.removeEventListener('mouseleave', handleMouseLeave)
|
|
|
+
|
|
|
+ // === 触摸事件处理 ===
|
|
|
+ // 手指按下
|
|
|
+ function handleTouchStart(e) {
|
|
|
+ startPoint = e.changedTouches[0].pageX
|
|
|
+ }
|
|
|
+
|
|
|
+ // 手指滑动
|
|
|
+ function handleTouchMove(e) {
|
|
|
+ stopPoint = e.changedTouches[0].pageX
|
|
|
+ }
|
|
|
+
|
|
|
+ // 手指抬起
|
|
|
+ function handleTouchEnd(e) {
|
|
|
+ handleSlideChange()
|
|
|
+ }
|
|
|
+
|
|
|
+ // === 鼠标事件处理 ===
|
|
|
+ // 鼠标按下
|
|
|
+ function handleMouseDown(e) {
|
|
|
+ isDragging = true
|
|
|
+ startPoint = e.pageX
|
|
|
+ box.style.cursor = 'grabbing'
|
|
|
+ // 阻止默认的拖拽行为
|
|
|
+ e.preventDefault()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 鼠标移动
|
|
|
+ function handleMouseMove(e) {
|
|
|
+ if (!isDragging) return
|
|
|
+ stopPoint = e.pageX
|
|
|
+ // 阻止默认行为
|
|
|
+ e.preventDefault()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 鼠标抬起
|
|
|
+ function handleMouseUp(e) {
|
|
|
+ if (!isDragging) return
|
|
|
+ box.style.cursor = 'grab'
|
|
|
+ handleSlideChange()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 鼠标离开容器
|
|
|
+ function handleMouseLeave(e) {
|
|
|
+ if (!isDragging) return
|
|
|
+ box.style.cursor = 'grab'
|
|
|
+ handleSlideChange()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加触摸事件监听器
|
|
|
+ box.addEventListener('touchstart', handleTouchStart)
|
|
|
+ box.addEventListener('touchmove', handleTouchMove)
|
|
|
+ box.addEventListener('touchend', handleTouchEnd)
|
|
|
+
|
|
|
+ // 添加鼠标事件监听器
|
|
|
+ box.addEventListener('mousedown', handleMouseDown)
|
|
|
+ box.addEventListener('mousemove', handleMouseMove)
|
|
|
+ box.addEventListener('mouseup', handleMouseUp)
|
|
|
+ box.addEventListener('mouseleave', handleMouseLeave)
|
|
|
+
|
|
|
+ // 设置初始鼠标样式
|
|
|
+ box.style.cursor = 'grab'
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
// 初始化
|
|
|
onMounted(() => {
|
|
|
getArtifactDetail()
|
|
|
@@ -302,7 +424,7 @@ onMounted(() => {
|
|
|
}
|
|
|
|
|
|
.el-carousel {
|
|
|
- height: 100%;
|
|
|
+ height: 96%;
|
|
|
|
|
|
.el-carousel__container {
|
|
|
height: 100%;
|
|
|
@@ -314,6 +436,23 @@ onMounted(() => {
|
|
|
align-items: center;
|
|
|
height: 100%;
|
|
|
}
|
|
|
+
|
|
|
+ /*指示器按钮*/
|
|
|
+ :deep(.el-carousel__button) {
|
|
|
+ width: 10px;
|
|
|
+ height: 10px;
|
|
|
+ border: none;
|
|
|
+ border-radius: 50%;
|
|
|
+ background-color: rgba(255, 255, 255, 0.5);
|
|
|
+ // margin-left: 6px;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*指示器激活按钮*/
|
|
|
+ :deep(.is-active) {
|
|
|
+ .el-carousel__button {
|
|
|
+ background-color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.carousel-image {
|