JS 移动端双击缩放,拖动,双指缩放的解决方案
分类专栏: Javascript&
简介 在工作中解决的问题,记录一下。
<pre class="language-javascript"><code>// 监听预览图片加载事件
freshLayoutMaskImg.load(function (){
let startTop = this.offsetTop;
let startLeft = this.offsetLeft;
globaImgWidth = this.width;
globaImgHeight = this.height;
globaImgTop = startTop;
globaImgLeft = startLeft;
let scale = 1.0;
let startX = null;
let startY = null;
let startDst = null;
const _self = this;
let _startTapTime = null; // 触摸开始时间
let _lastTapTime = null; // 触摸结束时间
let oddNumber = 0; // 设置奇偶数
let isSingleHand = false; // 是否是单手
let firstDistance = 0; // 存放手指开始放上的时,两根手指之间的距离
// 缩放事件的处理 计算两根手指之间的距离
var getDistance = function (start, stop) {
return Math.sqrt(Math.pow(Math.abs(start.x - stop.x), 2) + Math.pow(Math.abs(start.y - stop.y), 2));
}
$(this).bind('touchstart', function(event) {
// event.stopPropagation();
_startTapTime = Date.now();
const touches = event.originalEvent.touches;
console.log('touchstart :>> ', touches);
if(touches.length > 1) { //判断是否是两指
const events1 = touches[0];
const events2 = touches[1];
isSingleHand = false;
const one = {
x:events1.pageX, //第一根手指的横坐标
y:events1.pageY, //第一根手指的纵坐标
}; //第一根手指的横坐标
const two = {
x:events2.pageX, //第二根手指的横坐标
y:events2.pageY, //第二根手指的纵坐标
};
firstDistance = CommonJs.getDistance(one,two);
} else {
isSingleHand = true;
startX = touches[0].clientX;
startY = touches[0].clientY;
startTop = _self.offsetTop;
startLeft = _self.offsetLeft;
}
//阻止浏览器默认行为
event.preventDefault();
})
$(this).bind('touchmove', function (event) {
event.preventDefault();
const touches = event.originalEvent.touches;
if (touches.length > 1) {
const events1 = touches[0];
const events2 = touches[1];
const one = {
x:events1.pageX, //第一根手指的横坐标
y:events1.pageY, //第一根手指的纵坐标
}; //第一根手指的横坐标
const two = {
x:events2.pageX, //第二根手指的横坐标
y:events2.pageY, //第二根手指的纵坐标
};
const distance = CommonJs.getDistance(one,two);
const zoom = distance / firstDistance;
isSingleHand = false;
$('#fresh_layout_mask_img').css('transform', 'scale(' + zoom +')');
} else {
var X = touches[0].clientX - startX;
var Y = touches[0].clientY - startY;
_self.style.left = X + startLeft + 'px';
_self.style.top = Y + startTop + 'px';
isSingleHand = true;
}
})
// 手势结束
$(this).bind('touchend', function (event) {
const touches = event.originalEvent.changedTouches;
let curTime = Date.now();
console.log('event', event);
console.log('touchend :>> ', touches);
if (touches.length == 1 isSingleHand) {
//从两指变成一指, 要重置 触点的坐标 和 img的top和left ,不然会乱飙
startX = touches[0].clientX;
startY = touches[0].clientY;
startTop = _self.offsetTop;
startLeft = _self.offsetLeft;
if (curTime - _lastTapTime < 300) {
oddNumber += 1;
if (oddNumber % 2 == 0) {
$('#fresh_layout_mask_img').css('transform', 'scale(1)');
} else {
$('#fresh_layout_mask_img').css('transform', 'scale(2)');
}
}
}
// 点击结束时间
_lastTapTime = Date.now();
})
});
</code></pre>
分享到:
转载:
https://blog.csdn.net/JulyNight/article/details/128934881
喜欢 0
收藏
暂无评论信息
- 文章推荐
-
Node 配置sequelize + mysql,根据模型自动创建数据库表
研究了一下午的node + sequelize + mysql。
-
乐视官方确认还有 400 多人:消息称员工“没有内卷和 996”,过着“没有老板”的神仙日子
7 月 11 日消息,近期,微博博主 @Fenng 分享了一个冷知识:乐视居然还剩下 400 多人,有不少是五年以上的老员工。这些老员工称“幸福感是很多老乐视人留下来的理由”,没有内卷和 996,没拖欠过留下来的员工的工资,也没停过社保。
-
Docker 常用命令
docker目前代替虚拟机使用的一个容器,灵活好用。
-
群辉nas docker容器 配置svn仓库,并实现外网访问
2022-08-11的这一天, 群辉nas到手了, 实现svn仓库外网的访问,折腾了好久。记录一下。
- 点击排行
- 站长推荐
- 猜你喜欢
- 网站信息
- 站内问答:12篇
- 站内文章:212篇
- 建站时间:已运行1107天
- 备案号: 浙ICP备2022018799号
- 语言:
English(USA)
French(FR)
Chinese(ZH)
无数据