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

  • 微信转账怎么加对方好友(微信转账怎么加回好友)

    微信转账怎么加对方好友(微信转账怎么加回好友)

  • 微信图片查看原图不显示了(微信图片查看原图是什么意思)

    微信图片查看原图不显示了(微信图片查看原图是什么意思)

  • 抖音直播和平台怎么分成(抖音怎么开直播?)

    抖音直播和平台怎么分成(抖音怎么开直播?)

  • mgak2ch/a是什么型号(mgak2j/a是什么型号)

    mgak2ch/a是什么型号(mgak2j/a是什么型号)

  • 苹果x为什么更新不了软件(苹果x为什么更新不了系统)

    苹果x为什么更新不了软件(苹果x为什么更新不了系统)

  • ctrl f是什么快捷键(ctrl f快捷键)

    ctrl f是什么快捷键(ctrl f快捷键)

  • iphonex时间显示蓝色(苹果x时间显示)

    iphonex时间显示蓝色(苹果x时间显示)

  • 华为键盘震动怎么关(华为键盘震动怎么弄掉)

    华为键盘震动怎么关(华为键盘震动怎么弄掉)

  • 笔记本开机慢运行慢是什么原因(笔记本开机慢运行慢怎么解决安装什么硬盘)

    笔记本开机慢运行慢是什么原因(笔记本开机慢运行慢怎么解决安装什么硬盘)

  • 手机号很久不用会自动注销吗(手机号很久不用现在有别人在用)

    手机号很久不用会自动注销吗(手机号很久不用现在有别人在用)

  • 苹果se2home键是按的吗(苹果手机se2home键)

    苹果se2home键是按的吗(苹果手机se2home键)

  • http502是什么意思

    http502是什么意思

  • 蓝牙电池休眠冷冻激活(蓝牙电池休眠冷却多久)

    蓝牙电池休眠冷冻激活(蓝牙电池休眠冷却多久)

  • 手机充电充一晚上对手机会有危害吗(手机充电充一晚上对电池有没有影响)

    手机充电充一晚上对手机会有危害吗(手机充电充一晚上对电池有没有影响)

  • 重启路由器ip会变吗(重启路由器ip会变吗,光猫不重启)

    重启路由器ip会变吗(重启路由器ip会变吗,光猫不重启)

  • 快手关注0显示1个人(快手关注10几个为什么显示50多)

    快手关注0显示1个人(快手关注10几个为什么显示50多)

  • 投屏费流量吗(投屏费流量吗手机)

    投屏费流量吗(投屏费流量吗手机)

  • 苹果手机喜马拉雅下载的音频在哪里(苹果手机喜马拉雅音频怎么导出mp3)

    苹果手机喜马拉雅下载的音频在哪里(苹果手机喜马拉雅音频怎么导出mp3)

  • ipad无线局域网和蜂窝移动网络有什么区别(ipad无线局域网打不开)

    ipad无线局域网和蜂窝移动网络有什么区别(ipad无线局域网打不开)

  • 手机支付宝红包怎么用(手机支付宝红包码在哪里)

    手机支付宝红包怎么用(手机支付宝红包码在哪里)

  • 农村淘宝家乡版怎么弄(农村淘宝家乡版怎么切换)

    农村淘宝家乡版怎么弄(农村淘宝家乡版怎么切换)

  • 小米无人机怎么不卖了(小米无人机怎么起飞)

    小米无人机怎么不卖了(小米无人机怎么起飞)

  • ios13特点(iphone 13 新特性)

    ios13特点(iphone 13 新特性)

  • 苹果xr如何设置主副卡(苹果xr如何设置应用锁)

    苹果xr如何设置主副卡(苹果xr如何设置应用锁)

  • 退格键和删除键的区别(退格键和删除键互换了)

    退格键和删除键的区别(退格键和删除键互换了)

  • 苹果xsmax耳机是无线的吗(苹果xsmax耳机长什么样)

    苹果xsmax耳机是无线的吗(苹果xsmax耳机长什么样)

  • 三星手机如何录屏(三星手机如何录入门禁卡nfc)

    三星手机如何录屏(三星手机如何录入门禁卡nfc)

  • 律师事务所个人所得税如何计算
  • 宁波财税网会计之窗官网
  • 以个人名义汇货要交税吗
  • 疫情期间餐饮发票税点
  • 最新增值税申报表及附表下载
  • 按收入比例结转怎么做账
  • 资本公积是企业所得税吗
  • 商品房的销售方式有哪些
  • 原材料计划成本和实际成本的区别
  • 房屋建筑物折旧率计算
  • 公司转买旧车怎么过户
  • 外商企业所得税可享受什么优惠政策
  • 当月有待发货如何退货
  • 支付境外费用需要交哪些税
  • 预付费用计入当期费用吗
  • 建筑企业1%承包承租个人所得税的会计分录
  • 核定征收营业范围
  • 进项税额加计抵扣税收优惠政策
  • 小规模开税票怎么开
  • 因税负低补缴上年度增值税分录怎么写?
  • 税盘服务费抵税分录
  • 技术合同指什么
  • php利用云片网实现短信验证码功能的示例代码
  • win7右键设置方法
  • 苹果mac画图工具
  • (Select)解决:Element-ui 中 Select 选择器下拉框样式及输入框样式的修改问题(背景色透明与悬停背景色变化与下拉框边距变化等操作)
  • Cpqset.exe是什么系统进程 Cpqset有啥作用
  • 债券转让增值税例子
  • kavsvc.exe - kavsvc是什么进程 有什么作用
  • 增值税发票没认证 可以重新开吗
  • 会计政策变更累计数
  • 资金筹集业务核算实训内容
  • thinkphp count
  • framework模块
  • 利息收入属于什么税目
  • vue国际化解决方案
  • 命令default
  • 增值税一般纳税人
  • Testing Applications with WebTest¶
  • 织梦技巧
  • 详解PostgreSQL 语法中关键字的添加
  • sql有数据保护功能
  • python如何实现事务机制
  • 一般纳税人简易征收最新政策
  • 其他应收款借方表示增加吗
  • 小规模纳税人销售商品会计分录
  • 怎样计提税金及附加
  • 以前年度损益调整
  • 水利建设基金申报表哪里
  • 实收资本需要明细科目吗
  • 失控发票进项税额结转成本
  • 印花税申报成功未扣款还能更正吗
  • 残保金申报可以随便填吗
  • 福利费列支范围及标准
  • 出口退税进项发票会计分录
  • 福利费要交个人所得税嘛
  • 防伪公司应该选用什么目标市场策略
  • 新成立公司实收资本没到位该怎么做账
  • 目前哪些费用不能抵扣
  • 会计分录借贷怎么分视频教程
  • mysql案例分析
  • mysql查询时间语句
  • mysql在本地主机创建用户账号
  • linux命令i
  • 如何关闭windows密钥
  • excel2016 win7
  • centos 开机启动
  • win7无法删除d盘
  • vi 技巧
  • Linux CentOS系统下tomcat配置ssl教程
  • Unity3D游戏开发(第2版)
  • java的理解
  • qt5 opengl
  • 添加ie
  • js刷新当前窗口
  • python微信公众号开发教程
  • 网页中实现浏览的快捷键
  • 国家税务总局政策法规司
  • 发票开了,税务局上查不到信息是怎么回事
  • 法人注册怎么注册
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设