4 changed files with 230 additions and 6 deletions
-
220supplier/components/lf-previewImage/lf-previewImage.vue
-
2supplier/components/wyb-table/wyb-table.vue
-
3supplier/main.js
-
11supplier/pages/gonghuo/detail.vue
@ -0,0 +1,220 @@ |
|||||
|
<template> |
||||
|
<view> |
||||
|
<swiper class="swiper" :animation="animationData" |
||||
|
:style="{'background-color': perspective ? 'rgba(0,0,0,0.5)' : '#000000'}" |
||||
|
:current="swiper_current" :circular="circular" |
||||
|
v-if="show_assembly" @click="hideAssembly" |
||||
|
@touchmove.stop.prevent="touchmove" |
||||
|
@change="e => switchItem(e.detail.current)"> |
||||
|
<swiper-item v-for="(item, index) in images" :key="index" |
||||
|
class="swiper-item"> |
||||
|
<!-- 可移动缩放操作的容器 --> |
||||
|
<movable-area class="movable-area" :scale-area="true"> |
||||
|
<movable-view class="movable-view" direction="all" :scale="true" :inertia="true" @scale="scale" :scale-value="scale_values[swiper_current]"> |
||||
|
<image :src="item" class="swiper-image" mode="aspectFit" @mousewheel.stop="mousewheel"></image> |
||||
|
</movable-view> |
||||
|
</movable-area> |
||||
|
<!-- 控制器 --> |
||||
|
<view class="controls" v-if="controls"> |
||||
|
<view> |
||||
|
<view @click.stop="switchItem(swiper_current - 1)" v-if="swiper_current != 0"> |
||||
|
<uni-icons type="arrowleft" size="36" color="#fff"></uni-icons> |
||||
|
</view> |
||||
|
<view v-else></view> |
||||
|
</view> |
||||
|
<view> |
||||
|
<view @click.stop="switchItem(swiper_current + 1)" v-if="swiper_current != images.length - 1"> |
||||
|
<uni-icons type="arrowright" size="36" color="#fff"></uni-icons> |
||||
|
</view> |
||||
|
<view v-else></view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<!-- 指示器 --> |
||||
|
<view class="indicators" v-if="indicators && images.length > 1"> |
||||
|
<view class="number" v-if="indicatorType == 'number'">{{ swiper_current + 1 }} / {{ images.length }}</view> |
||||
|
<view class="square" v-else-if="indicatorType == 'square'"> |
||||
|
<view v-for="(item, index) in images" :key="index" class="indicators-icon" :style="swiper_current == index ? 'background-color:'+ themeColor : ''"></view> |
||||
|
</view> |
||||
|
<view class="dot" v-else-if="indicatorType == 'dot'"> |
||||
|
<view v-for="(item, index) in images" :key="index" class="indicators-icon" :style="swiper_current == index ? 'background-color:'+ themeColor : ''"></view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</swiper-item> |
||||
|
</swiper> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
controls: { |
||||
|
type: Boolean, // 是否显示左右箭头控制 |
||||
|
default: true |
||||
|
}, |
||||
|
indicators: { |
||||
|
type: Boolean, |
||||
|
default: true // 是否显示指示器 |
||||
|
}, |
||||
|
indicatorType: { |
||||
|
type: String, // 指示器类型,dot圆点,square方形,number数字 |
||||
|
default: 'number' |
||||
|
}, |
||||
|
perspective: { |
||||
|
type: Boolean, // 是否开启背景透视,遮罩透明可以看见底下其他元素 |
||||
|
default: true |
||||
|
}, |
||||
|
circular: { |
||||
|
type: Boolean, // 是否可以衔接滑动 |
||||
|
default: false |
||||
|
}, |
||||
|
themeColor: { |
||||
|
type: String, // 主题色 |
||||
|
default: '#1833F2' |
||||
|
} |
||||
|
}, |
||||
|
data(){ |
||||
|
return { |
||||
|
swiper_current: 0, // 当前显示的图片下标 |
||||
|
images: [], |
||||
|
show_assembly: false, // 显示预览图片 |
||||
|
duration: 500, // 动画持续时间 |
||||
|
animation: {}, // 动画配置对象 |
||||
|
animationData: {}, // 动画导出执行对象 |
||||
|
scale_values: [], // 每张图的缩放比例 |
||||
|
clientY: 0 |
||||
|
} |
||||
|
}, |
||||
|
created(){ |
||||
|
// TODO PC端屏蔽遮罩滚动穿透 |
||||
|
// TODO PC端滚轮放大缩小 |
||||
|
// TODO 放大缩小百分比显示 |
||||
|
// TODO 双击时会被关掉 |
||||
|
}, |
||||
|
methods: { |
||||
|
// 初始化加载动画 |
||||
|
initAnimation(){ |
||||
|
let animation = uni.createAnimation({ |
||||
|
duration: this.duration |
||||
|
}); |
||||
|
this.animation = animation; |
||||
|
animation.opacity(0).step(); |
||||
|
animation.opacity(1).step(); |
||||
|
this.animationData = animation.export(); |
||||
|
}, |
||||
|
// swiper touchmove事件 |
||||
|
touchmove(){ |
||||
|
return false; |
||||
|
}, |
||||
|
// swiper被改变 |
||||
|
switchItem(current){ |
||||
|
this.swiper_current = current; |
||||
|
// this.clientY = 0; // 切换时需要复位 |
||||
|
}, |
||||
|
// movable 缩放事件 |
||||
|
scale(event){ |
||||
|
let scale = event.detail.scale; |
||||
|
this.$msg(scale); // TODO 轻提示层级不够,没有被显示出来 |
||||
|
}, |
||||
|
// 鼠标滚动缩放事件,目前会触发浏览器页面滚动事件,暂时先不要这个功能 |
||||
|
mousewheel(event){ |
||||
|
return; |
||||
|
let scale = this.scale_values[this.swiper_current]; |
||||
|
if(this.clientY > event.clientY){ |
||||
|
if(scale < 10){ |
||||
|
scale += 0.5; |
||||
|
} |
||||
|
}else{ |
||||
|
if(scale > 0.5){ |
||||
|
scale -= 0.5; |
||||
|
} |
||||
|
} |
||||
|
this.clientY = event.clientY; |
||||
|
this.scale_values.splice(this.swiper_current, 1, scale); |
||||
|
}, |
||||
|
// 显示图片 |
||||
|
show(options){ |
||||
|
this.images = options.images || []; |
||||
|
this.swiper_current = options.current || 0; |
||||
|
this.scale_values = this.images.map(item => 1); |
||||
|
this.show_assembly = true; |
||||
|
this.initAnimation(); |
||||
|
}, |
||||
|
// 关闭隐藏图片 |
||||
|
hideAssembly(){ |
||||
|
this.animation.opacity(0).step(); |
||||
|
this.animationData = this.animation.export(); |
||||
|
setTimeout(() => { |
||||
|
this.show_assembly = false; |
||||
|
}, this.duration); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped="scoped"> |
||||
|
.swiper{ |
||||
|
width: 100vw; |
||||
|
height: 100vh; |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
z-index: 1000; |
||||
|
opacity: 0; |
||||
|
.swiper-item{ |
||||
|
position: relative; |
||||
|
.movable-area, .movable-view, .swiper-image{ |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
.controls{ |
||||
|
position: absolute; |
||||
|
padding: 0 16rpx; |
||||
|
box-sizing: border-box; |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
top: 42vh; |
||||
|
left: 0; |
||||
|
font-size: 40rpx; |
||||
|
width: 100%; |
||||
|
z-index: 1002; |
||||
|
} |
||||
|
.indicators{ |
||||
|
width: 100%; |
||||
|
position: absolute; |
||||
|
left: 0; |
||||
|
bottom: 10vh; |
||||
|
z-index: 1002; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
.number, .square, .dot{ |
||||
|
width: max-content; |
||||
|
height: max-content; |
||||
|
background-color: #dfe4ea; |
||||
|
} |
||||
|
.number{ |
||||
|
padding: 4rpx 26rpx; |
||||
|
border-radius: 40rpx; |
||||
|
color: #555555; |
||||
|
} |
||||
|
.square{ |
||||
|
border-radius: 40rpx; |
||||
|
display: flex; |
||||
|
padding: 2rpx 4rpx; |
||||
|
view{ |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
} |
||||
|
.dot{ |
||||
|
display: flex; |
||||
|
padding: 4rpx 4rpx; |
||||
|
} |
||||
|
.indicators-icon{ |
||||
|
width: 20rpx; |
||||
|
height: 20rpx; |
||||
|
background-color: #bdc5bd; |
||||
|
margin: 2rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue