位置: IT常识 - 正文

Vue2 实现图片的拖拽、缩放、旋转(vue设置图片)

编辑:rootadmin
Vue2 实现图片的拖拽、缩放、旋转

推荐整理分享Vue2 实现图片的拖拽、缩放、旋转(vue设置图片),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue实现图片编辑,vue使用图片,vue 显示图片,vue 显示图片,vue使用图片,vue如何引入图片,vue项目中图片放在哪里,vue项目中图片放在哪里,内容如对您有帮助,希望把文章链接给更多的朋友!

本文是基于vue2 实现图片的拖拽、旋转、鼠标滚动放大缩小等功能。

效果图分步骤实现

在这里看下 拖拽、旋转、缩放的几个方法

1.获取图片的实际宽高getImgSize(url) {return new Promise((resolve, reject) => {let imgObj = new Image();imgObj.src = url;imgObj.onload = () => {resolve({width: imgObj.width,height: imgObj.height,});};});}, 2.根据盒子的大小、图片的大小来计算 要显示多大的图片 async initImage() {if (!this.imageUrl) {return;}let { width, height } = await this.getImgSize(this.imageUrl);// 设置原始图片的大小let realWidth = width;let realHeight = height;// 获取高宽比例const whRatio = realWidth / realHeight;const hwRatio = realHeight / realWidth;//获取盒子的大小const boxW = this.$refs.maskBox.clientWidth;const boxH = this.$refs.maskBox.clientHeight;if (realWidth >= realHeight) {this.imgH = hwRatio * boxW;const nih = this.imgH;if (nih > boxH) {this.imgH = boxH;this.imgW = whRatio * boxH;} else {this.imgW = boxW;}this.top = (boxH - this.imgH) / 2;this.left = (boxW - this.imgW) / 2;} else {this.imgW = (boxH / realHeight) * realWidth;this.imgH = boxH;this.left = (boxW - this.imgW) / 2;}},

在这里主要是根据图片的宽高 ,以及盒子的大小来计算 盒子中展示多大的图片,将图片按照比例缩放后展示到盒子中。

3.拖拽图片

主要是监听@mousedown事件

onmousedownHandle(e) {const that = this;this.$refs.maskBox.onmousemove = function (el) {const ev = el || window.event; // 阻止默认事件ev.preventDefault();that.left += ev.movementX;that.top += ev.movementY;};this.$refs.maskBox.onmouseup = function () {// 鼠标抬起时将操作区域的鼠标按下和抬起事件置为null 并初始化that.$refs.maskBox.onmousemove = null;that.$refs.maskBox.onmouseup = null;};if (e.preventDefault) {e.preventDefault();} else {return false;}}, 4. 旋转图片handleRotate() {this.deg += 90;if (this.deg >= 360) {this.deg = 0;}this.size = 0;this.scale = `scale(1) rotateZ(${this.deg}deg)`;}, 5.监听鼠标的滚动,进行缩放图片Vue2 实现图片的拖拽、缩放、旋转(vue设置图片)

在 mounted() 中监听鼠标的滚动事件

mounted() {// 兼容火狐浏览器this.mousewheelevt = /Firefox/i.test(navigator.userAgent)? "DOMMouseScroll" : "mousewheel";// 为空间区域绑定鼠标滚轮事件 =》 处理函数是wheelHandle// 如果你监听了window的scroll或者touchmove事件,你应该把passive设置为true,这样滚动就会流畅很多this.$refs.maskBox.addEventListener(this.mousewheelevt, this.wheelHandle, {passive:true});},

处理鼠标的滚动事件

wheelHandle(e) {// 兼容性处理 => 火狐浏览器判断滚轮的方向是属性 detail,谷歌和ie浏览器判断滚轮滚动的方向是属性 wheelDeltaconst ev = e || window.event;// dir = -dir; // dir > 0 => 表示的滚轮是向上滚动,否则是向下滚动 => 范围 (-120 ~ 120)const dir = ev.detail ? ev.detail * -120 : ev.wheelDelta;//滚动的数值 / 2000 => 表示滚动的比例,用此比例作为图片缩放的比例this.imgScaleHandle(dir / 2000);},

放大缩小图片

/** * 图片的缩放 * zoom >0 放大 * zoom <0 缩小 */imgScaleHandle(zoom) {this.size += zoom;if (this.size < -0.5) {this.size = -0.5;}this.scale = `scale(${1 + this.size}) rotateZ(${this.deg}deg)`;},

页面销毁的时候 注意要取消鼠标的监听事件

beforeDestroy() {//取消监听this.$refs.maskBox.removeEventListener(this.mousewheelevt,this.wheelHandle,{passive:true});},

以上就是主要实现功能的方法

完整代码<template><div class="home"><div class="btn-area"><button @click="switchImgHandle(1)">竖图</button><button @click="switchImgHandle(2)">横图</button><button @click="handleRotate">旋转</button><button @click="imgScaleHandle(0.25)">放大</button><button @click="imgScaleHandle(-0.25)">缩小</button><button @click="handleReset">重置</button></div><div class="image-box" ref="maskBox" @mousedown="onmousedownHandle"><img :src="imageUrl" alt="" :style="{width: imgW + 'px', height: imgH + 'px',top: top + 'px', left: left + 'px', transform: scale, }" /></div></div></template><script>export default {name: "HomeView",data() {return {imageUrl: "",imageUrl1: require("@/assets/img1.jpg"),imageUrl2: require("@/assets/img2.jpg"),imgW: 0,imgW: 0,imgH: 0,deg: 0,top: 0,left: 0,scale: "scale(1)",size: 0,mousewheelevt: null,};},mounted() {this.imageUrl = this.imageUrl1;//初始化图片this.initImage();// 兼容火狐浏览器this.mousewheelevt = /Firefox/i.test(navigator.userAgent) ? "DOMMouseScroll" :"mousewheel";// 为空间区域绑定鼠标滚轮事件 =》 处理函数是wheelHandle// 如果你监听了window的scroll或者touchmove事件,你应该把passive设置为true,这样滚动就会流畅很多this.$refs.maskBox.addEventListener(this.mousewheelevt, this.wheelHandle, { passive:true});},beforeDestroy() {//取消监听this.$refs.maskBox.removeEventListener(this.mousewheelevt,this.wheelHandle,{passive:true});},methods: {/** * 切换图片 *flag: 1竖图 2 横图 */switchImgHandle(flag) {if (flag === 1) {this.imageUrl = this.imageUrl1;} else {this.imageUrl = this.imageUrl2;}this.handleReset();},/** * 获取图片的url * @param {string} url */getImgSize(url) {return new Promise((resolve, reject) => {let imgObj = new Image();imgObj.src = url;imgObj.onload = () => {resolve({width: imgObj.width,height: imgObj.height,});};});},/** * 初始化图片 */async initImage() {if (!this.imageUrl) {return;}let { width, height } = await this.getImgSize(this.imageUrl);// 设置原始图片的大小let realWidth = width;let realHeight = height;// 获取高宽比例const whRatio = realWidth / realHeight;const hwRatio = realHeight / realWidth;//获取盒子的大小const boxW = this.$refs.maskBox.clientWidth;const boxH = this.$refs.maskBox.clientHeight;if (realWidth >= realHeight) {this.imgH = hwRatio * boxW;const nih = this.imgH;if (nih > boxH) {this.imgH = boxH;this.imgW = whRatio * boxH;} else {this.imgW = boxW;}this.top = (boxH - this.imgH) / 2;this.left = (boxW - this.imgW) / 2;} else {this.imgW = (boxH / realHeight) * realWidth;this.imgH = boxH;this.left = (boxW - this.imgW) / 2;}},/** * 旋转 */handleRotate() {this.deg += 90;if (this.deg >= 360) {this.deg = 0;}this.size = 0;this.scale = `scale(1) rotateZ(${this.deg}deg)`;},/** * 图片的缩放 *zoom >0 放大 *zoom <0 缩小 */imgScaleHandle(zoom) {this.size += zoom;if (this.size < -0.5) {this.size = -0.5;}this.scale = `scale(${1 + this.size}) rotateZ(${this.deg}deg)`;},/** * 重置 */handleReset() {this.imgW = 0;this.imgH = 0;this.top = 0;this.left = 0;this.deg = 0;this.scale = "scale(1)";this.size = 0;this.initImage();},/** * 鼠标滚动 实现放大缩小 */wheelHandle(e) {const ev = e || window.event; // 兼容性处理 => 火狐浏览器判断滚轮的方向是属性 detail,谷歌和ie浏览器判断滚轮滚动的方向是属性 wheelDelta// dir = -dir; // dir > 0 => 表示的滚轮是向上滚动,否则是向下滚动 => 范围 (-120 ~ 120)const dir = ev.detail ? ev.detail * -120 : ev.wheelDelta;//滚动的数值 / 2000 => 表示滚动的比例,用此比例作为图片缩放的比例this.imgScaleHandle(dir / 2000);},/** * 处理图片拖动 */onmousedownHandle(e) {const that = this;this.$refs.maskBox.onmousemove = function (el) {const ev = el || window.event; // 阻止默认事件ev.preventDefault();that.left += ev.movementX;that.top += ev.movementY;};this.$refs.maskBox.onmouseup = function () {// 鼠标抬起时将操作区域的鼠标按下和抬起事件置为null 并初始化that.$refs.maskBox.onmousemove = null;that.$refs.maskBox.onmouseup = null;};if (e.preventDefault) {e.preventDefault();} else {return false;}},},};</script><style scoped>.home {width: 1000px;margin: 50px auto;}.btn-area {display: flex;justify-content: center;width: 100%;margin-bottom: 50px;}.btn-area button {width: 100px;height: 40px;font-size: 18px;margin-right: 10px;}.image-box {position: relative;margin: 0 auto;width: 1000px;height: 700px;border: 1px solid #333;overflow: hidden;}.image-box img {position: absolute;cursor: pointer;}</style> 最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。 有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:

文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文链接地址:https://www.jiuchutong.com/zhishi/289703.html 转载请保留说明!

上一篇:大熊雨林中一只柯莫德熊幼崽跟它的同胞挤在一起,加拿大 (© Ian McAllister/Offset)(大熊雨林中一只小熊)

下一篇:中科大ChatGPT学术镜像小白部署教程,全民都可以拥抱AI(中科大ustc-guest)

  • 银行承兑汇票提前承兑收多少手续费
  • 增值税发票认证平台
  • 邮局可以开发票吗 税点多少
  • 预缴的税款
  • 某公司是一家刚成立的大型化妆品生产企业
  • 城镇垃圾处理费计入什么科目
  • 法人的往来款可以转为实收资本吗?
  • 奖励给优质供应商会计处理怎么做?
  • 工程保险费属于企业管理费吗
  • 利息收入为什么是负数
  • 园林绿化苗木增值税抵扣税率是多少?
  • 一般纳税人销售旧货
  • 发生破损
  • 小型微利企业所得税优惠政策2023超过100万
  • 营改增文化体育服务包括哪些
  • 增值税专用发票有效期是多长时间
  • 新办企业税务办理
  • 房地产企业资金监管账户
  • 10万以下免征增值税 文件
  • 合同取得成本计入当期损益吗
  • 单位购买短期保本理财产品如何做账?
  • 鸿蒙系统智能设备怎么开启
  • 公司章程认缴时效是多久
  • 金税盘申请电子发票成功后怎样手工导入
  • 一般纳税人资质证明文件去哪打印
  • win10图片密码怎么全屏显示
  • 苹果14pro真实图片发朋圈
  • win10待机自动关机软件
  • s3tray2.exe - s3tray2是什么进程 有什么用
  • 货运业增值税税率
  • 采购过程中发生材料毁损,由保险公司赔偿的部分
  • 企业资本结构决策需要重点考虑的有
  • elementui的upload组件详解
  • 一篇文章让你了解什么
  • uni-app原理
  • javaweb:jquery中ajax的应用
  • 行政单位收到银行的存款
  • 物流公司增值税发票
  • 赔偿客户款应该怎么记账
  • mongodb安装过程
  • protobuf 文档
  • 金蝶系统结账之后反结账
  • 办公室租金会有公摊吗
  • 银行贷款可以置换险资吗
  • 坏账核销会计处理
  • mysql 执行动态语句
  • 外国企业常驻代表机构
  • 成品油办法废止后,加油站还需办理成品油许可证吗
  • 股权质押和股权抵押有什么区别
  • 委托收款背书和质押背书都属于转让背书
  • 企业如果为员工缴纳社保
  • 施工企业的具体工作有哪些
  • 其他货币资金微信和支付宝的管理
  • 增值税专用发票丢了怎么补救
  • 从事小额零星经营业务的个人,其支出
  • 年末待处理财产损益有余额怎么办
  • 减免税款借方余额
  • 企业所得税和增值税重复收税了吗
  • 建设工程毛利率如何计算
  • sqlserver使用方法
  • 如何在windows中添加字体
  • windows7录音怎么录
  • win8.1玩英雄联盟
  • linux没有ssh
  • linux常用命令csdn
  • win10 右下角
  • win10日历提醒不显示
  • pim架构
  • pm2使用手册
  • js导出excel文件前端插件
  • web ui控件
  • powershell实战指南
  • 编写shell脚本,实现备份文件:每天18:00归档
  • javascript基于什么的语言
  • jquery foreach循环
  • 个体办税控盘需要什么材料
  • 没有税费种认定信息是什么意思
  • 成都市税务app
  • 应税销售额和应纳税额
  • 可以在企业所得税税前扣除的税金
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设