位置: 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)

  • 抖音钱包零钱怎么买东西(抖音钱包零钱怎么充值抖币)

    抖音钱包零钱怎么买东西(抖音钱包零钱怎么充值抖币)

  • 360压缩zip格式转rar格式(360压缩zip文件怎么转换成电子文档)

    360压缩zip格式转rar格式(360压缩zip文件怎么转换成电子文档)

  • 手机微信误卸载了怎样恢复(手机微信误卸载了怎样恢复微信密码)

    手机微信误卸载了怎样恢复(手机微信误卸载了怎样恢复微信密码)

  • qq空间头像怎么换不了(qq空间头像怎么看)

    qq空间头像怎么换不了(qq空间头像怎么看)

  • iphone11音量键一高一低(iphone11音量键一个好按一个很难按)

    iphone11音量键一高一低(iphone11音量键一个好按一个很难按)

  • ps如何制作一寸照片?(ps如何制作一寸蓝底照片)

    ps如何制作一寸照片?(ps如何制作一寸蓝底照片)

  • iphone11录音功能在哪(苹果11的录音功能)

    iphone11录音功能在哪(苹果11的录音功能)

  • 微信拉黑名单后发的信息能看到吗(微信拉黑名单后对方还能看到朋友圈吗)

    微信拉黑名单后发的信息能看到吗(微信拉黑名单后对方还能看到朋友圈吗)

  • 60v锂电池充满电电压是多少(60V锂电池充满电是多少)

    60v锂电池充满电电压是多少(60V锂电池充满电是多少)

  • 荣耀30pro可以贴钢化膜吗(荣耀30pro可以贴膜吗)

    荣耀30pro可以贴钢化膜吗(荣耀30pro可以贴膜吗)

  • 冷链配送是什么意思(冷链配送的三个特点是什么?)

    冷链配送是什么意思(冷链配送的三个特点是什么?)

  • xr可以更新ios13吗(xr可以更新ios17吗)

    xr可以更新ios13吗(xr可以更新ios17吗)

  • ape格式用什么播放器(ape 格式)

    ape格式用什么播放器(ape 格式)

  • qq相册上传照片怎么才能不发动态(qq相册上传照片显示本地空间不足)

    qq相册上传照片怎么才能不发动态(qq相册上传照片显示本地空间不足)

  • 企业版比专业版流畅吗(企业版比专业版稳定)

    企业版比专业版流畅吗(企业版比专业版稳定)

  • 荣耀20怎么清理云空间(荣耀20怎么清理手机)

    荣耀20怎么清理云空间(荣耀20怎么清理手机)

  • 手机黑屏如何导出数据(手机黑屏如何导出里边的数据)

    手机黑屏如何导出数据(手机黑屏如何导出里边的数据)

  • 数据透视表的字段列表显示不出来怎么办(数据透视表的字段)

    数据透视表的字段列表显示不出来怎么办(数据透视表的字段)

  • 删了好友再加回来巨轮还在吗(删了好友再加回来聊天记录还能恢复吗)

    删了好友再加回来巨轮还在吗(删了好友再加回来聊天记录还能恢复吗)

  • 苹果量距离在哪里(iphone测量距离的功能在哪里)

    苹果量距离在哪里(iphone测量距离的功能在哪里)

  • 怎么取消空间状态为私密(如何取消空间状态为私密)

    怎么取消空间状态为私密(如何取消空间状态为私密)

  • 王者荣耀如何充值?(王者荣耀如何充值退款)

    王者荣耀如何充值?(王者荣耀如何充值退款)

  • vue播放rtsp视频流

    vue播放rtsp视频流

  • 马拉克勒国家公园中一只隐身的chia象,南非林波波河 (© Staffan Widstrand/Minden Pictures)(拉马克是哪国人)

    马拉克勒国家公园中一只隐身的chia象,南非林波波河 (© Staffan Widstrand/Minden Pictures)(拉马克是哪国人)

  • JavaScript 删除对象中的某一项(js删除对象的方法)

    JavaScript 删除对象中的某一项(js删除对象的方法)

  • 车船税退税办理时限
  • 预收账款什么时候确认收入
  • 建筑公司分包项目违法吗
  • 税务局 强制
  • 一般纳税人税费计算明细表
  • 增值税发票是什么纸张型号
  • 预收款开发票,不确认收入可以吗?
  • 税控盘及服务费会计分录
  • 新公司第一年要做亏
  • 合伙企业投入资金是否缴纳印花税
  • 所得税在什么情况下扣除
  • 分公司是否需要刻章
  • 电商平台返佣金税务怎么走
  • 筹建期间购买的机械配件
  • 私募基金管理公司
  • 存货计提跌价准备什么意思
  • 商业汇票的使用范围
  • 私人出租房子发票怎么开
  • 多交的应交税费怎么算
  • 发票已认证还能作废吗2020
  • 利息费用需要取消吗
  • 公司对公银行账户可以注销吗
  • 个人缴纳物业费怎么开发票
  • 行政费用包括哪些企业行政后勤管理费用
  • 小公司发工资怎么做账
  • 生产企业低值高报骗税
  • 金税盘减免税款贷方余额
  • 鸿蒙系统怎么看运行程序
  • 设备维修费增值税
  • 速动比率的合理范围
  • 本月无生产,有折旧怎么办
  • 未计提的上一年企业所得税
  • 增资后持股比例怎么算
  • 民间非营利组织会计制度及操作实务
  • 销售已使用过的小汽车增值税
  • apache是什么文件
  • php两个数组相加结果
  • php中unlink
  • 企业收回应收账款会计分录
  • 未达起征点销售额和小微企业免税销售额
  • 季报的利润表本月金额填的是当月数可以吗
  • php 替换
  • javascript创建对象及应用
  • tsop封装
  • 企业有代扣代缴个税义务
  • 原材料退库的会计分录
  • 向股东免息借款怎么做账
  • 税盘开票机号怎么看
  • 工程项目该如何分类
  • 珠宝首饰可以开发票吗
  • 发放职工薪酬计入什么科目
  • 变动成本法的计算步骤
  • 残疾人就业保障金是什么意思啊
  • 现金日记账年结怎么划线
  • 实收资本可以做现金吗
  • 银行公司账户限额
  • 企业盘亏的设备会计分录
  • 坏账损失记入
  • 汽车保险费能不能不交
  • mysql删除重复字段
  • 高效的sql语句
  • solaris教程
  • SWNETSUP.EXE - SWNETSUP是什么进程 有什么用
  • win7移动硬盘无法弹出
  • 怎么更改windows商店的安装位置
  • win10的命令行在哪里
  • 在linux系统中获取帮助信息的命令为
  • android view动画
  • js脚本使用
  • javascript常用语句
  • linux定时备份文件
  • shell脚本中实现rm -fr !(file1)
  • c# unity 教程
  • canvas基础
  • Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
  • 重庆电子税务局app下载
  • 辽宁省国家税务局网上申报
  • 江苏优抚对象
  • 2020年个体税收政策
  • 金税三期可以申报个税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设