方法:

  adjustStart1 (e) {
e.preventDefault()
let event = e.touches
if (event.length === 2) {
this.styles = 'transform: scale(2)'
}
},
// 调整开始
adjustStart (e) {
let event = e.touches
this.fingerA.startX = event[0].pageX
this.fingerA.startY = event[0].pageY
// 移动
if (event.length === 1) {
this.isDrag = true
this.isScale = false
// 缩放
} else if (event.length === 2) {
this.isScale = true
this.isDrag = false
this.fingerB.startX = event[1].pageX
this.fingerB.startY = event[1].pageY
}
},
// 调整中,移动或缩放
adjustIng (e) {
let event = e.touches
this.fingerA.endX = event[0].pageX
this.fingerA.endY = event[0].pageY
// 移动
if (this.isDrag) {
// 本次移动距离要加上之前移动的距离
this.move.x = this.fingerA.endX - this.fingerA.startX + this.move.temX
this.move.y = this.fingerA.endY - this.fingerA.startY + this.move.temY
this.styles = `transform: translate(${this.move.x}px,${this.move.y}px) scale(${this.move.scale})`
} else if (this.isScale) {
// 缩放
this.fingerB.endX = event[1].pageX
this.fingerB.endY = event[1].pageY
// 两手指间距离
let distanceStart = Math.sqrt(
Math.pow(this.fingerA.startX - this.fingerB.startX, 2) + Math.pow(this.fingerA.startY - this.fingerB.startY, 2)
)
let distanceEnd = Math.sqrt(
Math.pow(this.fingerA.endX - this.fingerB.endX, 2) + Math.pow(this.fingerA.endY - this.fingerB.endY, 2)
)
this.move.scale = (distanceEnd / distanceStart) * this.move.temScale
// 向量叉乘,求出旋转方向及角度
// 开始两个手指的向量
var vector1 = new this.Vector(
this.fingerA.startX,
this.fingerA.startY,
this.fingerB.startX,
this.fingerB.startY
)
// 结束时两个手指的向量
var vector2 = new this.Vector(
this.fingerA.endX,
this.fingerA.endY,
this.fingerB.endX,
this.fingerB.endY
)
var cos = this.calculateVM(vector1, vector2)
var angle = (Math.acos(cos) * 180) / Math.PI
var direction = this.calculateVC(vector1, vector2)
this.move.allDeg = direction * angle + this.move.temDeg
this.styles = `transform: translate(${this.move.x}px,${this.move.y}px) scale(${this.move.scale})`
}
},
// 调整结束
adjustEnd (e) {
this.move.temX = this.move.x
this.move.temY = this.move.y
this.move.temScale = this.move.scale
this.move.temDeg = this.move.allDeg
this.isDrag = false
this.isScale = false
},
calculateVM (vector1, vector2) {
return (
(vector1.x * vector2.x + vector1.y * vector2.y) /
(Math.sqrt(vector1.x * vector1.x + vector1.y * vector1.y) *
Math.sqrt(vector2.x * vector2.x + vector2.y * vector2.y))
)
},
calculateVC (vector1, vector2) {
return vector1.x * vector2.y - vector2.x * vector1.y > 0 ? 1 : -1
},
Vector (x1, y1, x2, y2) {
this.x = x2 - x1
this.y = y2 - y1
}

调用方法:

<div :style="styles" @touchstart.stop="adjustStart($event)" @touchmove.stop="adjustIng" @touchend.stop="adjustEnd"></div>

data 中定义变量:

   isScale: false,
isDrag: false,
styles: '',
actived: 1,
value1: '',
limitHourValue: '',
hourList: ['11', '12', '13', '14', '17', '18', '19', '20', '21'],
// 手指A
fingerA: {
startX: 0,
startY: 0,
endX: 0,
endY: 0
},
// 手指B
fingerB: {
startX: 0,
startY: 0,
endX: 0,
endY: 0
},
// 调整数据
move: {
x: 0,
y: 0,
temX: 0,
temY: 0,
scale: 1,
temScale: 1,
allDeg: 0,
temDeg: 0
},
// 默认样式
imgPosition: {
left: 0,
top: 0,
width: 0,
height: 0
}

js 实现页面局部(或图片)放大功能(vue)的更多相关文章

  1. jqzoom插件图片放大功能的一些BUG

    建议使用cloud-zoom插件,jqzoom插件就不要使用了 点击查看——图片放大镜——jQuery插件Cloud Zoom 刚开始使用的是jqzoom插件,但问题太多了,就不说插入到页面中使用了, ...

  2. 图片放大功能如何做?jquery实现

    花了很长时间撸了个网站,观点,其中需要一个图片放大功能,网上找了半天发现都没有中意的,最后无奈之下自己写了一个,演示地址,演示图片: 自我感觉效果还不错,现在分享开来给大家看看,哪里不好还请多多指教, ...

  3. Typora配置双击图片放大功能

    在Typora中,默认没有点击图片放大功能,本文就教大家如何配置该功能. 我的环境版本 Typora版本:0.11.13 LightBox版本:2.11.3 下载LightBox 可以从Github下 ...

  4. jQuery.YesShow - 图片轮播插件(带图片放大功能)

    jQuery.YesShow - 图片轮播插件(带图片放大功能) 使用简单,原文件只要这样就可以了:<div id="yes">         <ul> ...

  5. 图片放大功能插件及jquery.extend函数理解

    前端时间,产品提出社区评论中的图片需要有放大功能.感觉可以共用,所以就想整合一个插件,过程中也借鉴了一些例子. 分析下自己的代码思路: var scaleImg = function(opts) { ...

  6. jquery图片放大功能简单实现

    图片放大在某些例如商品细节放大图比较常见,本文写了一个图片放大的示例适合日常应付,有需求的朋友可以参考下 <div class="jqzoom"> <img sr ...

  7. vue项目 一行js代码搞定点击图片放大缩小

    一行js代码搞定xue项目需要点击图片放大缩小,其实主要用的是用到了vue:class的动态切换,内容比较简单.一开始我把维护的需求想得太复杂了,和测试小姐姐聊了一下才反应过来. 两个月不到跟了四个项 ...

  8. JavaScript 点击图片放大功能

    <!doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. js实现页面局部弹窗打印

    原文出自:http://www.haorooms.com/post/css3media 在网页中经常看到有打印功能,点击之后,只针对特定区域进行的打印.网上看了一下,大体上有2中实现方法,一种是用cs ...

随机推荐

  1. nio读取文件,输出文件

    io流的一种: package com.cxy.ssp.Automic; import java.io.FileOutputStream; import java.io.IOException; im ...

  2. 【转】Java程序CPU飙升问题排查方法

    windows环境下cpu飙升问题 线上某台runtime机器(windows Server)cpu报警,这种情况初步就是代码里面死循环了,先把机器下线了保证不再有新的任务分配进来,然而cpu使用依然 ...

  3. PHP魔方解密

    安装composer参考:https://www.runoob.com/w3cnote/composer-install-and-usage.html 常用的加密类型及特征 加密类型 加密特征 Zen ...

  4. vue 项目 去哪儿

    去哪儿项目 使用vue +vue-router+vuex +axios完成,包括3个部分内容 1.首页演示,包括首页header,首页轮播图,周末去哪儿,热销推荐开发 2.城市列表页面开发 ,包括城市 ...

  5. JS请求服务器,并返回信息,请求过程中不需要跳转页面

    js请求服务器,并返回信息,请求过程中不需要跳转页面 这个可以通过jQuery框架轻松实现,jQuery中包含多种ajax的请求方式,详细可以参考下对应 的API. 你上面定义的按钮类型是submit ...

  6. Orika JavaBean映射工具探秘

    Orika是一个简单.快速的JavaBean拷贝框架,Orika使用字节代码生成来创建具有最小开销的快速映射器. 关于: 作为开发人员,我们必须为业务问题提供解决方案,我们希望利用我们的时间来做真正重 ...

  7. thinkphp url模式

    入口文件是应用的单一入口,对应用的所有请求都定向到应用入口文件,系统会从URL参数中解析当前请求的模块.控制器和操作: http://serverName/index.php/模块/控制器/操作 这是 ...

  8. hadoop Datanode多目录配置

    1. DataNode也可以配置成多个目录,每个目录存储的数据不一样.即:数据不是副本2.具体配置如下 hdfs-site.xml <property> <name>dfs.d ...

  9. VC中编辑框更新SetDlgItemText()与UpdateData()的区别

    SetDlgItemText(IDC_EDIT_RXDATA,m_strREData);  //前一个是ID号,后一个是编辑框的成员变量 UpdateData(FALSE);   它们都能更新编辑框的 ...

  10. Super OJ 序列计数

    题意: 给出序列 a1,a2,--an(0≤ai≤109),求三元组(ai,aj,ak)(1≤i<j<k≤n)满足 ai<aj>ak 的数量. 分析: 开两个\(BIT\),分 ...