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

  • 3dmax怎么把参考图放进去(3dmax怎么把参考图锁定)

    3dmax怎么把参考图放进去(3dmax怎么把参考图锁定)

  • 小米智能插座wifi版连接不上(小米智能插座wifi版能控制空调吗)

    小米智能插座wifi版连接不上(小米智能插座wifi版能控制空调吗)

  • OPPO手机如何在截屏的图片上写字(oppo手机如何在视频上添加文字)

    OPPO手机如何在截屏的图片上写字(oppo手机如何在视频上添加文字)

  • 荣耀畅玩平板2可以插手机卡吗(荣耀畅玩平板2怎样扩充内存)

    荣耀畅玩平板2可以插手机卡吗(荣耀畅玩平板2怎样扩充内存)

  • vivo强制恢复出厂设置怎么还要密码(vivo强制恢复出厂设置密码)

    vivo强制恢复出厂设置怎么还要密码(vivo强制恢复出厂设置密码)

  • 三星s系列和a系列区别(三星s系列和a系列的区别)

    三星s系列和a系列区别(三星s系列和a系列的区别)

  • 大数据应用领域成就有哪些(下列哪些属于大数据应用领域)

    大数据应用领域成就有哪些(下列哪些属于大数据应用领域)

  • 华为titcl10是什么型号(华为trt_tl10什么型号)

    华为titcl10是什么型号(华为trt_tl10什么型号)

  • 华为平板m5支持otg吗(华为平板m5支持扩展内存吗)

    华为平板m5支持otg吗(华为平板m5支持扩展内存吗)

  • 在线发送和离线发送的区别(在线发送和离线发送哪个快)

    在线发送和离线发送的区别(在线发送和离线发送哪个快)

  • 快手附近人怎么看(快手附近人怎么设置距离没有筛选)

    快手附近人怎么看(快手附近人怎么设置距离没有筛选)

  • 怎么合并退款(京东怎么合并退款)

    怎么合并退款(京东怎么合并退款)

  • 手机qq音乐收藏在哪(手机QQ音乐收藏的歌电脑看不到)

    手机qq音乐收藏在哪(手机QQ音乐收藏的歌电脑看不到)

  • word怎么改变行数(word怎么调行与行之间的距离)

    word怎么改变行数(word怎么调行与行之间的距离)

  • ios13长按多功能怎么关闭(ios 长按)

    ios13长按多功能怎么关闭(ios 长按)

  • 苹果x旁白是什么意思(苹果x旁白怎么解锁)

    苹果x旁白是什么意思(苹果x旁白怎么解锁)

  • 朋友圈被收藏能知道吗(朋友圈收藏能加密吗)

    朋友圈被收藏能知道吗(朋友圈收藏能加密吗)

  • 网易考拉怎么把商品增加到购物车(网易考拉怎么复制链接)

    网易考拉怎么把商品增加到购物车(网易考拉怎么复制链接)

  • 放映幻灯片的快捷键(放映幻灯片的快捷键是以下哪个)

    放映幻灯片的快捷键(放映幻灯片的快捷键是以下哪个)

  • 详解Linux系统中查询文档的man和info命令(简介linux系统中的10个常用命令及功能)

    详解Linux系统中查询文档的man和info命令(简介linux系统中的10个常用命令及功能)

  • Android Studio安装和使用教程(全文图解)

    Android Studio安装和使用教程(全文图解)

  • 常见浏览器兼容性问题及解决办法总结(常见浏览器兼容软件)

    常见浏览器兼容性问题及解决办法总结(常见浏览器兼容软件)

  • 织梦dedecms5.7无法上传图片的解决方法(织梦停止更新了吗)

    织梦dedecms5.7无法上传图片的解决方法(织梦停止更新了吗)

  • 增值税有哪些二类税种
  • 什么情况下需要补牙
  • 应付账款尾差怎么算
  • 没申报可以开票嘛
  • 核定征收可以无发票做账吗
  • 弥补以前年度亏损从哪里取数
  • 无偿赠送货物怎么做账
  • 债务重组双方如何进行会计处理
  • 销售使用过未抵扣进项税额的货运汽车
  • 红字发票信息开错该怎么撤回与相关会计处理
  • 委托贷款业务涉嫌诈骗吗
  • 餐饮刷卡机手续费多少
  • 营改增后服务业账务处理
  • 母公司名称的发票可以计入子公司的开办费处理吗?
  • 招聘发票可以抵扣吗
  • 接收境外汇款是什么意思
  • 筹建期如何界定
  • 小规模附加税怎么计提分录
  • 不管金税四期上线与否,税务严查一刻也没有放松!
  • 企业如何实现资源共享
  • 是否只有首次购买税控盘可以全额抵减增值税
  • 资产损失税前扣除备查资料
  • 溢价转让股权的会计处理
  • 环保税计算方法和税率1.2
  • 水利建设专项收入怎么申报不了
  • 购入空调
  • 我们无法创建新的分区,也找不到现有的分区 贴吧
  • 开红字发票后再开蓝字发票应如何入账?
  • php mktime函数
  • win10更新kb5005033
  • php aop
  • 外汇业务的核算ppt
  • ICCV, ECCV, CVPR,IEEE的关系
  • 政策性搬迁补偿收入
  • 发票密码什么意思
  • java web 购物车
  • 2022年终总结
  • Python怎么把数据倒着输出
  • 增值税申报表填错不影响税额
  • 股东之间股权转让需要股东会决议吗
  • 按摊余成本计量的应收账款
  • 个人注册投资有限公司
  • 玩转mongodb4.0从入门到实践
  • 支付版权使用费怎么记账
  • 保证人不承担责任的情形(上)
  • 固定资产清理科目有余额吗
  • 消费税在企业所得税前扣除吗
  • 车辆保险费如何提高
  • 已提足折旧的固定资产出售的账务处理
  • 初级会计计划成本例题
  • 以前年度的银行流水可以补进来做账嘛
  • 收款人是否应当承担还款责任
  • 年金现值和年金终值的例题
  • 人民币报关退税流程
  • 其他应付款贷方余额怎么冲平
  • 库存现金的主要内容有哪些
  • 月末未完工半成品的分录
  • 结转成本的方法有几种
  • 增值税结转是月结转还是年度
  • 企业如何建账之类的账目
  • Ubuntu Server 11.04安装GNOME 3的方法
  • win阅读软件
  • win10预览版选哪个
  • ubuntu拨号上网设置
  • win7系统中怎样
  • win8自带驱动吗
  • win10系统无法打开设置
  • cocos2d动画
  • js怎么删除
  • jquery 插件写法
  • js设置标签内容
  • android教学
  • python 二分查找函数
  • python并发原理
  • python教程目录
  • javascript面向对象 第三方类库
  • 福建省人民医院院长
  • 浙江省国税局地址
  • 以出让方式取得的土地
  • 北京朝阳国家税务总局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设