386 lines
7.3 KiB
Vue
386 lines
7.3 KiB
Vue
<template>
|
||
<view class="swiper-content" v-if="visable">
|
||
<view class="hander-top p-lr-32 w-s flex-j-sb--a-ct">
|
||
<view class="icon-back-wrap" @click="onBack">
|
||
<image class="icon-back" src="./images/icon-back.png" mode="widthFix" />
|
||
</view>
|
||
<view class="count">{{ currentImg + 1 }} / {{ imgs.length }}</view>
|
||
</view>
|
||
|
||
<swiper
|
||
class="swiper-img"
|
||
:current="currentImg"
|
||
:duration="300"
|
||
@change="changeSwiper"
|
||
>
|
||
<swiper-item
|
||
class="swiper-item"
|
||
v-for="(item, index) in imgs"
|
||
:key="index"
|
||
>
|
||
<view class="img-page">
|
||
<movable-area scale-area>
|
||
<movable-view
|
||
direction="all"
|
||
scale="true"
|
||
scale-min="1"
|
||
scale-max="4"
|
||
@click.stop="onBack"
|
||
|
||
>
|
||
<image
|
||
@click.stop="onBack"
|
||
class="max-img"
|
||
:src="item"
|
||
:lazy-load="true"
|
||
mode="aspectFill"
|
||
/>
|
||
</movable-view>
|
||
</movable-area>
|
||
</view>
|
||
</swiper-item>
|
||
</swiper>
|
||
<view class="item-bottom" v-if="false">
|
||
<scroll-view
|
||
class="scroll-view_H"
|
||
:scroll-x="true"
|
||
:scroll-into-view="scrollTopIndex"
|
||
:scroll-with-animation="true"
|
||
scroll-left="20"
|
||
>
|
||
<view
|
||
class="img-page-box scroll-view-item_H"
|
||
:class="currentImg == index ? 'img-page-checked' : ''"
|
||
v-for="(item, index) in imgs"
|
||
:key="index"
|
||
:id="`scrollToIndex${index}`"
|
||
@click.stop="toImg(index)"
|
||
>
|
||
<image class="img" :src="item" mode="aspectFill" />
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
|
||
<view class="pop" v-if="isPop">
|
||
<view class="item" @click.stop="share()">分享图片</view>
|
||
<!-- #ifndef H5 -->
|
||
<view class="item" @click.stop="saveImg(false)">保存图片</view>
|
||
<view class="item" @click.stop="saveImg(true)">保存全部图片</view>
|
||
<!-- #endif -->
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
export default {
|
||
props: {
|
||
imgs: {
|
||
type: Array,
|
||
default: () => [],
|
||
},
|
||
visable: {
|
||
type: Boolean,
|
||
default: false,
|
||
},
|
||
},
|
||
emits: ['update:visable'],
|
||
data() {
|
||
return {
|
||
currentImg: 0,
|
||
isPop: false,
|
||
scrollTopIndex: "",
|
||
|
||
isScale: false,
|
||
isCollect: false,
|
||
isLike: false,
|
||
};
|
||
},
|
||
onLoad(options) {
|
||
// let { imgs, current } = options;
|
||
// this.imgs = JSON.parse(imgs);
|
||
// this.currentImg = current;
|
||
},
|
||
methods: {
|
||
changeSwiper(e) {
|
||
this.currentImg = e.detail.current;
|
||
console.log("e", e);
|
||
|
||
this.scrollTopIndex = `scrollToIndex${e.detail.current}`;
|
||
},
|
||
toImg(index) {
|
||
this.currentImg = index;
|
||
},
|
||
onBack() {
|
||
this.$emit('update:visable', false);
|
||
},
|
||
share() {
|
||
uni.downloadFile({
|
||
// 下面一行时拼接预览PDF的地址!!!
|
||
url: this.imgs[this.currentImg],
|
||
success: function (res) {
|
||
var filePath = res.tempFilePath;
|
||
if (!filePath) return;
|
||
uni.openDocument({
|
||
filePath: filePath,
|
||
success: function (res) {
|
||
console.log(res);
|
||
console.log("打开文档成功");
|
||
},
|
||
});
|
||
},
|
||
});
|
||
},
|
||
saveImg(isAll = false) {
|
||
const that = this;
|
||
if (!isAll) {
|
||
uni.downloadFile({
|
||
url: this.imgs[this.currentImg],
|
||
success: (res) => {
|
||
if (res.statusCode === 200) {
|
||
uni.saveImageToPhotosAlbum({
|
||
filePath: res.tempFilePath,
|
||
success: function () {
|
||
uni.showToast({
|
||
icon: "none",
|
||
title: "保存成功",
|
||
});
|
||
that.isPop = false;
|
||
},
|
||
fail: function () {},
|
||
});
|
||
} else {
|
||
}
|
||
},
|
||
});
|
||
return;
|
||
}
|
||
this.imgs.forEach((item) => {
|
||
uni.downloadFile({
|
||
url: item,
|
||
success: (res) => {
|
||
if (res.statusCode === 200) {
|
||
uni.saveImageToPhotosAlbum({
|
||
filePath: res.tempFilePath,
|
||
success: function () {
|
||
uni.showToast({
|
||
icon: "none",
|
||
title: "保存全部成功",
|
||
});
|
||
that.isPop = false;
|
||
},
|
||
fail: function () {},
|
||
});
|
||
} else {
|
||
}
|
||
},
|
||
});
|
||
});
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.swiper-content {
|
||
width: 100vw;
|
||
top: 0;
|
||
height: 100vh;
|
||
position: fixed;
|
||
background: #000;
|
||
z-index: 99999;
|
||
}
|
||
movable-view {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
|
||
movable-area {
|
||
position: fixed;
|
||
|
||
overflow: hidden;
|
||
|
||
width: 100%;
|
||
height: 100%;
|
||
|
||
transform: scale();
|
||
}
|
||
|
||
movable-view image {
|
||
width: 100%;
|
||
}
|
||
|
||
uni-image > img {
|
||
z-index: -1 !important;
|
||
}
|
||
|
||
.hander-top {
|
||
position: absolute;
|
||
z-index: 1000;
|
||
top: 48rpx;
|
||
left: 0;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
width: 100%;
|
||
padding: 0 32rpx;
|
||
box-sizing: border-box;
|
||
.icon-back-wrap {
|
||
width: 64rpx;
|
||
height: 64rpx;
|
||
.icon-back {
|
||
width: 64rpx;
|
||
height: 64rpx;
|
||
}
|
||
}
|
||
|
||
.count {
|
||
box-sizing: border-box;
|
||
padding: 8rpx 24rpx;
|
||
|
||
color: #fff;
|
||
border-radius: 24rpx;
|
||
background: rgba(0, 0, 0, 0.4);
|
||
|
||
font-size: 28rpx;
|
||
}
|
||
}
|
||
|
||
.swiper-img {
|
||
width: 100vw;
|
||
height: 100vh;
|
||
|
||
background-color: #000;
|
||
|
||
.swiper-item {
|
||
width: 100vw;
|
||
height: 100vh;
|
||
|
||
.img-page {
|
||
display: flex;
|
||
align-items: center;
|
||
|
||
width: 100vw;
|
||
height: 100vh;
|
||
|
||
.max-img {
|
||
// width: 100%;
|
||
// height: 100%;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.handle-wrap {
|
||
position: absolute;
|
||
z-index: 100;
|
||
bottom: 40rpx;
|
||
left: 0;
|
||
|
||
width: 100%;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
padding: 32rpx;
|
||
box-sizing: border-box;
|
||
image {
|
||
width: 64rpx;
|
||
height: 64rpx;
|
||
}
|
||
|
||
width: 100%;
|
||
}
|
||
|
||
.item-bottom {
|
||
position: fixed;
|
||
z-index: 9999;
|
||
bottom: 110rpx;
|
||
left: 0rpx;
|
||
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: space-between;
|
||
|
||
width: 100vw;
|
||
|
||
// height: 200rpx;
|
||
padding: 30rpx;
|
||
|
||
transition: ease-in-out 0.3s;
|
||
}
|
||
|
||
.small-list-page {
|
||
min-height: 60rpx;
|
||
}
|
||
|
||
.scroll-Y {
|
||
height: 300rpx;
|
||
}
|
||
|
||
.scroll-view_H {
|
||
width: 100%;
|
||
box-sizing: border-box;
|
||
padding-right: 32rpx;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.scroll-view-item_H {
|
||
display: inline-block;
|
||
|
||
margin-right: 10rpx;
|
||
|
||
transition: ease-in 0.1s;
|
||
transform: scale(0.8);
|
||
|
||
border-radius: 11rpx;
|
||
background: #c2c2c2;
|
||
|
||
&:last-child {
|
||
margin-right: 0;
|
||
}
|
||
|
||
.img {
|
||
display: block;
|
||
|
||
width: 160rpx;
|
||
height: 272rpx;
|
||
}
|
||
}
|
||
|
||
.img-page-checked {
|
||
transform: translateY(-28rpx) scale(1);
|
||
}
|
||
|
||
.pop {
|
||
position: fixed;
|
||
z-index: 999999;
|
||
top: 50%;
|
||
left: 50%;
|
||
|
||
overflow: hidden;
|
||
|
||
width: 500rpx;
|
||
|
||
transform: translate(-50%, -50%);
|
||
|
||
border-radius: 20rpx;
|
||
background-color: #fff;
|
||
|
||
.item {
|
||
height: 100rpx;
|
||
padding: 0 50rpx;
|
||
|
||
transition: all 0.2s;
|
||
|
||
border-radius: 20rpx;
|
||
|
||
line-height: 100rpx;
|
||
|
||
&:active {
|
||
background-color: #eee;
|
||
}
|
||
}
|
||
}
|
||
</style>
|