今天產(chǎn)品提出了一個(gè)查看影像的功能需求。

在查看單據(jù)的列表中,有一列是影像字段,一開(kāi)始根據(jù)單據(jù)號(hào)調(diào)用接口查看是否有圖片附件,如果有則彈出一個(gè)全屏的彈出層,如果沒(méi)有給出提示。而且,從列表進(jìn)入詳情之后,附件那邊也會(huì)有一個(gè)查看影像的按鈕。
所以,根據(jù)需求,多個(gè)組件需要用到查看影像的功能,所以考慮做一個(gè)公用組件,通過(guò)組件傳值的方法將查看影像文件的入?yún)鬟^(guò)去。
后來(lái),產(chǎn)品要求圖片可以旋轉(zhuǎn)縮放。
廢話不多說(shuō),貼上代碼:
<template>
<div class="filePreview">
<el-dialog
class="imgList"
title="預(yù)覽圖片列表"
:visible.sync="imgListShow"
@close="$emit('remove')"
fullscreen>
<div class="allImg">
<div >
<img v-for="(item,index) in imgList" :key="item.fileid" :src='item.furl' :class="{ changeColor:changeColor == index}" @click="handlerImg(item,index)">
</div>
</div>
<div >
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange1"
:current-page.sync="currentImg"
:page-size="1"
layout="prev, pager, next, jumper"
:total="num">
</el-pagination>
<div >
<button @click="rotateL" icon="el-icon-arrow-left">
<i class="el-icon-arrow-left"></i>左旋轉(zhuǎn)
</button>
<button @click="rotateR">右旋轉(zhuǎn)
<i class="el-icon-arrow-right"></i>
</button>
<button @click="scale">
<i class="el-icon-zoom-out"></i>縮小
</button>
<button @click="scale1">放大
<i class="el-icon-zoom-in"></i>
</button>
</div>
<div id="test_3" @mousemove="move" @mouseup="stop">
<p @mousedown="start" >
<img :src="furl" ref="singleImg" class="originStyle">
</p>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import {isgetFilePath}from 'api/public_api.js'
export default {
data() {
return {
imgList:[],
imgListShow:false,
num:0,
furl:'',
currentImg:1,
changeColor:-1,
currentRotate: 0 ,
currentScale:1,
canDrag: false,
offset_x:0,
offset_y:0,
mouse_x:0,
mouse_y:0,
}
},
props:['filePreviewShow','FDJH'],
created() {
this.imgListShow = this.filePreviewShow
this.preview()
},
methods: {
//點(diǎn)擊圖片顯示
handlerImg(obj,index){
this.currentRotate = 0
this.currentScale = 1
this.rotateScale()
this.$refs.singleImg.style.left = 0
this.$refs.singleImg.style.top = 0
this.furl = obj.furl
this.changeColor = index
this.currentImg = index+1
},
//影像
preview(){
let data = {
// FDJH:'000002'
FDJH:this.FDJH
}
isgetFilePath(data).then(res=>{
// console.log(res)
if(res.TYPE == "S"){
this.imgList = JSON.parse(res.MESSAGE)
this.num = this.imgList.length
if(this.imgList.length > 0){
this.furl = this.imgList[0].furl
this.changeColor = 0
}else{
this.$message.warning('影像文件為空')
}
}else{
this.$message.warning(res.MESSAGE)
}
})
},
handleSizeChange(val) {
console.log(`每頁(yè) ${val} 條`);
},
handleCurrentChange1(val) {
this.currentRotate = 0
this.currentScale = 1
this.rotateScale()
this.$refs.singleImg.style.left = 0
this.$refs.singleImg.style.top = 0
this.furl = this.imgList[val-1].furl
this.changeColor = val-1
},
start(e){
//鼠標(biāo)左鍵點(diǎn)擊
e.preventDefault && e.preventDefault(); //去掉圖片拖動(dòng)響應(yīng)
if(e.button==0){
this.canDrag=true;
//獲取需要拖動(dòng)節(jié)點(diǎn)的坐標(biāo)
this.offset_x = document.getElementsByClassName('originStyle')[0].offsetLeft;//x坐標(biāo)
this.offset_y = document.getElementsByClassName('originStyle')[0].offsetTop;//y坐標(biāo)
//獲取當(dāng)前鼠標(biāo)的坐標(biāo)
this.mouse_x = e.pageX;
this.mouse_y = e.pageY;
}
},
move(e){
e.preventDefault && e.preventDefault()
if(this.canDrag==true){
let _x = e.pageX - this.mouse_x;
let _y = e.pageY - this.mouse_y;
//設(shè)置移動(dòng)后的元素坐標(biāo)
let now_x = (this.offset_x + _x ) + "px";
let now_y = (this.offset_y + _y ) + "px";
document.getElementsByClassName('originStyle')[0].style.top = now_y
document.getElementsByClassName('originStyle')[0].style.left = now_x
}
},
stop(e){
this.canDrag = false;
},
//旋轉(zhuǎn)放大
rotateScale(){
this.$refs.singleImg.style.OTransform = 'rotate('+this.currentRotate+'deg)'+'scale('+this.currentScale+')'
this.$refs.singleImg.style.webkitTransform = 'rotate('+this.currentRotate+'deg)'+'scale('+this.currentScale+')'
this.$refs.singleImg.style.MozTransform = 'rotate('+this.currentRotate+'deg)'+'scale('+this.currentScale+')'
this.$refs.singleImg.style.msTransform = 'rotate('+this.currentRotate+'deg)'+'scale('+this.currentScale+')'
this.$refs.singleImg.style.transform = 'rotate('+this.currentRotate+'deg)'+'scale('+this.currentScale+')'
},
//旋轉(zhuǎn)
rotateL(){
this.currentRotate += 15
this.rotateScale()
},
rotateR(){
this.currentRotate -= 15
this.rotateScale()
},
//縮放
scale(){
this.currentScale -= 0.1
if(this.currentScale <= 0.1){
this.currentScale = 0.1
this.rotateScale()
}else{
this.rotateScale()
}
},
scale1(){
this.currentScale += 0.1
this.rotateScale()
},
}
}
</script>
<style rel="stylesheet/scss" lang="scss" slot-scope="scope">
.filePreview{
.imgList{
.el-dialog__headerbtn{
font-size:26px;
}
.el-dialog__body{
.allImg{
width:30%;
float:left;
height:600px;
img{
width: 150px;
height: 150px;
margin: 5px;
cursor: pointer;
}
.changeColor{
border:4px solid #409eff;
}
}
}
}
.originStyle{
position:absolute;
left:0;top:0;
cursor: pointer;
// transform-origin: 50% 50%;
}
#test_3{
position: relative;
width: 600px;
height: 400px;
overflow: hidden;
// overflow: scroll;
& > p{
position: absolute;
cursor: move;
transform-origin: center;
width: 100%;
height: 100%;
padding: 0;
-webkit-margin-before: 0;
-webkit-margin-after: 0;
left: 0;
top: 0;
& > img{
display: inline-block;
vertical-align: middle;
}
}
}
}
</style>
本文標(biāo)題:vue項(xiàng)目中實(shí)現(xiàn)圖片預(yù)覽的公用組件功能-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://chinadenli.net/article48/cepcep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、做網(wǎng)站、App設(shè)計(jì)、面包屑導(dǎo)航、網(wǎng)站排名、App開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容