vue實(shí)現(xiàn)簡(jiǎn)易圖片左右旋轉(zhuǎn),上一張,下一張組件案例
項(xiàng)目需求,嵌到elementUi里的小組件,寫得不好,不喜勿噴,謝謝
父組件代碼
<template>
<div>
<see-attachment :filesLists='files' :file='imgFile' v-if="showmask" @hideMask='showmask=false'></see-attachment>
</div>
</template>
<script>
import seeAttachment from "./seeAttachment.vue";
export default {
data() {
return {
showmask: false,
imgFile: {}
};
},
components: {
seeAttachment
},
methods: {
lookImg(f) {
this.showmask = true;
this.imgFile = f;
},
}
};
</script>
子組件代碼
<template>
<div>
<div class="proview_box" @click="hideMask">
<div class="img_box">
<img :src="imgPath" :width="width" :height="height" @click="stopEvent" id='img' />
</div>
</div>
<div class="handleImg_box">
<div @click="prevOne"><img src="../../../../static/img/prev.png" /></div>
<div @click="rotate(0)"><img src="../../../../static/img/turn_left.png" /></div>
<div @click="rotate(1)"><img src="../../../../static/img/turn_right.png" /></div>
<div @click="nextOne"><img src="../../../../static/img/next.png" /></div>
</div>
</div>
</template>
<script>
export default {
name: 'seeAttachment',
props: ['filesLists', 'file'],
data: function() {
return {
imgPath: '',
width: 0,
height: 0,
imgIndex: 0
}
},
mounted() {
this.getImgIndex();
this.seeAttachment(this.imgIndex);
},
computed: {
//去掉不是圖片的附件
imgList() {
const ARR = ["png", "PNG", "jpeg", "JPEG", "bmp", "BMP", "jpg", "JPG", "gif", "GIF"];
let arrs = '';
let suffix = '';
let type = '';
let newList = [];
this.filesLists.forEach((item) => {
arrs = item.name.split('.');
suffix = arrs[arrs.length - 1];
type = item.type ? item.type : item.raw ? item.raw.type : suffix;
ARR.some(items => {
if (type.includes(items)) {
newList.push(item)
}
})
})
return newList;
}
},
methods: {
//通過(guò)父組件傳入的file獲取當(dāng)前查看的圖片index
getImgIndex() {
let that = this;
that.imgList.forEach((item, index) => {
if(that.file.id == item.id){
that.imgIndex = index;
}
})
},
//隱藏查看圖片
hideMask() {
this.$emit('hideMask', false);
},
stopEvent(event) {
//阻止冒泡事件
//取消事件冒泡
let e = event; //若省略此句,下面的e改為event,IE運(yùn)行可以,但是其他瀏覽器就不兼容
if (e && e.stopPropagation) {
e.stopPropagation();
} else if (window.event) {
window.event.cancelBubble = true;
}
},
//上一張
prevOne() {
if (this.imgIndex == 0) {
return false;
}
let img = document.getElementById('img')
img.style.transform = 'rotate(0deg)';
this.imgIndex = this.imgIndex - 1;
this.seeAttachment(this.imgIndex);
},
//下一張
nextOne() {
let listLength = this.imgList.length - 1;
if (this.imgIndex >= listLength) {
return false;
}
let img = document.getElementById('img')
img.style.transform = 'rotate(0deg)';
this.imgIndex = this.imgIndex + 1;
this.seeAttachment(this.imgIndex);
},
//右轉(zhuǎn)
rotate(t) {
let img = document.getElementById('img')
var reg = /(rotate\([\-\+]?((\d+)(deg))\))/i;
var wt = img.style['-webkit-transform'],
wts = wt.match(reg);
var $3 = RegExp.$3;
var current = $3 ? parseInt($3) : 0;
if (t == 0) {
current = current == 0 ? 360 : current;
current = (current - 90) % 360;
} else {
current = (current + 90) % 360;
}
img.style.transform = 'rotate(' + current + 'deg)';
},
seeAttachment(index = 0) {
if (this.imgList.length == 0) {
return false;
}
let that = this;
let basePath = "http://" + (process.env.OSS_PATH.indexOf("test") == -1 ? "opyx-mtds-pro" :
"opyx-mtds-test") + ".oss-cn-shenzhen.aliyuncs.com/";
that.imgPath = basePath + that.imgList[index]['path'];
let img_url = basePath + that.imgList[index]['path'];
// 創(chuàng)建對(duì)象
var img = new Image();
// 改變圖片的src
img.src = img_url;
// 定時(shí)執(zhí)行獲取寬高
var check = function() {
// 只要任何一方大于0
// 表示已經(jīng)服務(wù)器已經(jīng)返回寬高
if (img.width > 0 || img.height > 0) {
let wdt = document.body.offsetWidth;
let hgt = document.body.offsetHeight;
let ratio = 1;
if (img.width > img.height && img.width > wdt * ratio) {
img.height = img.height * wdt * ratio / img.width;
img.width = wdt * ratio;
console.log('寬大于高', img)
} else if (img.height > img.width && img.height > hgt * ratio) {
img.width = img.width * hgt * ratio / img.height;
if (img.width > wdt) {
img.width = wdt;
}
img.height = hgt * ratio;
console.log('高大于寬', img)
} else {
img.height = img.height * wdt * ratio / img.width
img.width = wdt * ratio
console.log('正常', img)
}
that.width = img.width;
that.height = img.height;
clearInterval(set);
}
};
var set = setInterval(check, 40);
},
}
}
</script>
<style lang="scss" scoped>
.handleImg_box {
position: fixed;
bottom: 0;
left: 50%;
z-index: 100;
margin-left: -150px;
width: 300px;
padding: 1rem 0;
display: flex;
align-items: center;
justify-content: space-around;
}
.handleImg_box div {
font-size: 0;
}
.handleImg_box div img {
width: 3rem;
}
</style>
補(bǔ)充知識(shí):vue圖片放大、縮小、旋轉(zhuǎn)等。僅需要兩行代碼?。。?/strong>
效果圖

實(shí)現(xiàn)步驟:
1.下載Viewer組件
npm install v-viewer --save
2.在圖片顯示的頁(yè)面引用 viewer組件(一個(gè)js文件,一個(gè)css樣式文件)
import Viewer from "@/assets/js/viewer.min.js";
import '@/assets/css/viewer.min.css';
3.再需要點(diǎn)擊圖片的標(biāo)簽添加點(diǎn)擊事件@click
<img :id ="item.publicFileURL" :src="item.publicFileURL" @click="aaa(item)" >

說(shuō)明:因?yàn)槲业膱D片是在集合中存的需要?jiǎng)討B(tài)的點(diǎn)擊放大(點(diǎn)哪個(gè)放大哪個(gè))----id很重要 aaa()方法中要用
4.@click="aaa(item)"方法
aaa(item) {
var viewer = new Viewer(document.getElementById(item.publicFileURL), {
url: item.publicFileURL,
});
},

以上這篇vue實(shí)現(xiàn)簡(jiǎn)易圖片左右旋轉(zhuǎn),上一張,下一張組件案例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- vue使用exif獲取圖片旋轉(zhuǎn),壓縮的示例代碼
- Vue2.0實(shí)現(xiàn)調(diào)用攝像頭進(jìn)行拍照功能 exif.js實(shí)現(xiàn)圖片上傳功能
- vue 實(shí)現(xiàn)Web端的定位功能 獲取經(jīng)緯度
- 基于elementUI使用v-model實(shí)現(xiàn)經(jīng)緯度輸入的vue組件
- vue-preview動(dòng)態(tài)獲取圖片寬高并增加旋轉(zhuǎn)功能的實(shí)現(xiàn)
- Vue圖片瀏覽組件v-viewer用法分析【支持旋轉(zhuǎn)、縮放、翻轉(zhuǎn)等操作】
- 移動(dòng)端 Vue+Vant 的Uploader 實(shí)現(xiàn)上傳、壓縮、旋轉(zhuǎn)圖片功能
- vue實(shí)現(xiàn)裁切圖片同時(shí)實(shí)現(xiàn)放大、縮小、旋轉(zhuǎn)功能
- vue2實(shí)現(xiàn)移動(dòng)端上傳、預(yù)覽、壓縮圖片解決拍照旋轉(zhuǎn)問(wèn)題
- vuejs開(kāi)發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問(wèn)題處理
- vue使用exif獲取圖片經(jīng)緯度的示例代碼
相關(guān)文章
vue實(shí)現(xiàn)省市區(qū)的級(jí)聯(lián)選擇
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)省市區(qū)的級(jí)聯(lián)選擇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
基于ElementUI中Table嵌套實(shí)現(xiàn)多選的示例代碼
這篇文章主要介紹了基于ElementUI中Table嵌套實(shí)現(xiàn)多選的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Vue中transition單個(gè)節(jié)點(diǎn)過(guò)渡與transition-group列表過(guò)渡全過(guò)程
這篇文章主要介紹了Vue中transition單個(gè)節(jié)點(diǎn)過(guò)渡與transition-group列表過(guò)渡全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue2?this?能夠直接獲取到?data?和?methods?的原理分析
這篇文章主要介紹了Vue2?this能夠直接獲取到data和methods的原理分析,因?yàn)閙ethods里的方法通過(guò)bind指定了this為new?Vue的實(shí)例2022-06-06

