首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js手势缩放源码

以下是一个使用JavaScript实现手势缩放(双指缩放)的基本示例代码:

一、基础概念

  1. 手势事件
    • 在移动设备或触摸屏浏览器上,手势事件用于检测用户的特定手势操作,如缩放(pinch)、旋转(rotate)等。对于缩放手势,主要涉及到touchstarttouchmovetouchend事件。
  • 缩放原理
    • 通过检测两个触摸点之间的距离变化来确定缩放比例。在touchstart事件中记录初始的两个触摸点的距离,在touchmove事件中计算当前两个触摸点的距离,然后根据两者的比例关系来调整要缩放元素的大小。

二、代码示例

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF - 8">
    <meta name="viewport" content="width=device-width, initial - scale = 1.0">
    <title>Gesture Zoom</title>
    <style>
        #zoomElement {
            width: 200px;
            height: 200px;
            background-color: lightblue;
            transition: transform 0.1s ease - out;
        }
    </style>
</head>

<body>
    <div id="zoomElement"></div>

    <script>
        const zoomElement = document.getElementById('zoomElement');
        let startDistance = 0;
        let currentScale = 1;

        function getDistance(touches) {
            const dx = touches[0].pageX - touches[1].pageX;
            const dy = touches[0].pageY - touches[1].pageY;
            return Math.sqrt(dx * dx + dy * dy);
        }

        zoomElement.addEventListener('touchstart', function (event) {
            if (event.touches.length === 2) {
                startDistance = getDistance(event.touches);
            }
        });

        zoomElement.addEventListener('touchmove', function (event) {
            if (event.touches.length === 2) {
                const currentDistance = getDistance(event.touches);
                const scale = currentDistance / startDistance;
                currentScale *= scale;
                zoomElement.style.transform = `scale(${currentScale})`;
                startDistance = currentDistance;
            }
        });

        zoomElement.addEventListener('touchend', function (event) {
            if (event.touches.length < 2) {
                startDistance = 0;
            }
        });
    </script>
</body>

</html>

三、优势

  1. 用户体验友好
    • 符合用户在移动设备上的操作习惯,方便用户对内容进行缩放查看,例如查看图片、地图等。
  • 交互性强
    • 相比传统的通过按钮或滚轮缩放,手势缩放更加直观和自然。

四、应用场景

  1. 图片查看器
    • 用户可以用双指缩放图片来查看细节或整体布局。
  • 地图应用
    • 在移动设备上方便地缩放地图以查看不同比例尺下的地理信息。

五、可能遇到的问题及解决方法

  1. 缩放超出边界
    • 问题:元素可能会被缩放到不可见或者超出屏幕范围。
    • 解决方法:设置最小和最大缩放比例限制。例如,在计算currentScale时,添加判断条件,如果scale < minScale(如0.5),则将currentScale设置为minScale;如果scale > maxScale(如3),则将currentScale设置为maxScale
  • 缩放中心不准确
    • 问题:双指缩放时,元素可能不是以两指中心为缩放中心进行缩放。
    • 解决方法:计算两指的中心坐标,在缩放时将元素的变换原点设置到这个中心坐标位置。可以通过transform-origin属性结合触摸点坐标计算来实现。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

图片操作系列 —(1)手势缩放图片功能

,贴上源码分析一个个具体的功能,但是因为源码是考虑到很多功能,所以有很多代码量,而且太多看着很乱,所以我的方案是直接自己写个demo,然后根据我们要讲解的功能,仿照PhotoView的源码,在自己一个个具体的功能...具体具体可以看这篇文章,写的很详细:用户手势检测-GestureDetector使用详解 而此处我们因为做的功能是通过手势来缩放图片,所以我们就要监听二个手指头缩放动作,所以我们使用的是ScaleGestureDetector...float scaleFactor = detector.getScaleFactor();复制代码 我们可以通过这个方法获取到缩放因子,缩放因子会根据你的手势的变大会越来越大,如果你返回了true,那就说明这次的缩放行为就已经结束了...我们可以看到,我们设置了大于2才返回true,(前提二个手指是做放大手势)那么缩放因子就会一直变大到2,才会认为这次缩放行为结束了,就再次从1开始了。...3.图片实时手势缩放 我们前面已经知道了。手势变化的时候会触发onScale方法,所以我们只要把图片的具体的放大缩小的逻辑放在onScale里面即可。

3.2K10
  • HarmonyOS 开发实践 —— 基于手势的图片预览与缩放

    :Parallel,并行识别组合手势中注册的手势将同时进行识别,直到所有手势识别结束,并行识别手势组合中的手势进行识别时互不影响。...2、在对图片进行双指捏合时,优先触发绑定的PinchGesture手势,对图片进行缩放操作;当滑动拖拽图片时,识别绑定的PanGesture手势,对图片进行拖拽移动。...onActionUpdate和onActionEnd回调中修改scale参数,进行图片缩放处理。...// 当捏合手势触发时,可以通过回调函数获取缩放比例,从而修改组件的缩放比例onPinchGestureActionUpdate(event: GestureEvent) {  const SCALE_VALUE...,计算当前的isScaling// 如果缩放比例小于1,弹簧效果重置成原比例onPinchGestureActionEnd() {  this.pinchValue = this.scaleValue;

    19110

    Fabric.js 元素中心缩放

    本文简介 点赞 + 关注 + 收藏 = 学会了 使用 fabric.js 创建的图形,默认的缩放原点是元素操作点的对角点。 如下图所示: 如果按住 alt 键 操作会把原点移动到元素中心。...如下图所示: 如果想将默认缩放操作设置为“中心缩放”,只需将 centeredScaling 属性设置为 true 即可。...设置中心缩放 虽然只要将 ``centeredScaling 设置为 true 就行了,但还能再细分成2种情况。 一个是全局设置,一个是只设置指定元素。...单独设置指定元素 如果只是设置指定元素以中心点为缩放原点,那么被设置的元素会生效,其他元素不会生效。 本例只将矩形设置成以中心点为缩放原点,圆形还是默认的操作。...rect.centeredScaling = true 代码仓库 ⭐ Fabric.js 中心缩放

    3.1K10

    在小程序里实现手势缩放,你可以这样做 | 实战教程

    因此,如果要在小程序中展示带有细节信息的图片(例如地铁线网图),就需要为其加上缩放功能。而用双指张合手势进行缩放,是大部分智能手机用户都已经习惯了的缩放方法。...今天,知晓程序就为大家带来有关手势缩放功能的实现方法,以及手势缩放实现在小程序中的局限和问题。 手势动态检测 首先,我们需要获得用户的触摸事件。...手势缩放的核心思想是:根据两只手指相对距离的变化,对图片进行放大或缩小。因此,我们需要知道两只手指相对距离的变化值,才能让图片按预期缩放。...图片动态缩放 到这里,我们已经可以探测用户的手指距离变化了。接下来,我们需要根据用户的手势,确定图片缩放倍数,然后根据倍数缩放图片。...以上就是知晓程序(微信号 zxcx0101)带来的手势缩放图片功能的实现教程。虽然目前手势缩放并不能完美实现,但也希望大家可以举一反三,通过这个思路,创造出体验更好的小程序。

    2K20

    ArcGIS JS API 4.16控制地图的缩放大小

    在3.X的ArcGIS JS API版本中我们可以轻松的调用相应的API来实现地图的缩放大小的控制,让实例化后的地图在我们设置的范围中进行缩放,但是在4.X的版本中并没有相应的属性来控制,所以我们采用一种折中的方式来实现...问题描述 在WebGIS项目开发过程中,有时候我们的数据服务在某些级别下是没有数据的,比如一个切片服务,仅仅切了5-12级,所以当我们将地图缩放到0-4级或者12级往后的话,会看不到我们的切片图层。...为了解决这个问题,我们就要控制地图的缩放级别,换句话说就是将地图的最大和最小比例控制在5-12级,这样一来不管用户怎么样去缩放地图,都会在不同级别看到我们的切片图层。...操作步骤 1、ArcGIS JS API 4.16,也就是ArcGIS JS API 4.X版本的实现方法如下: // 控制图层的缩放级别 view.when(function () { view.on...2、ArcGIS JS API 3.33,也就是ArcGIS JS API 3.X版本的实现方法如下: //通过scale属性实现 var map = new Map("map", { "maxScale

    4.8K10

    读Zepto源码之Gesture模块

    其实就是缩小和放大的手势操作。 其中变量 gesture 对象和 Touch 模块中的 touch 对象的作用差不多,可以先看看 《读Zepto源码之Touch模块》对 Touch 模块的分析。...,在起点的缩放值和终点的缩放值不相同的情况下,触发 pinch 事件;如果起点的缩放值比终点的缩放值大,则继续触发 pinchIn 事件,则缩小效果;如果起点的缩放值比终点的缩放值小,则继续触发 pinchOut...系列文章 读Zepto源码之代码结构 读Zepto源码之内部方法 读Zepto源码之工具函数 读Zepto源码之神奇的$ 读Zepto源码之集合操作 读Zepto源码之集合元素查找 读Zepto源码之操作...DOM 读Zepto源码之样式操作 读Zepto源码之属性操作 读Zepto源码之Event模块 读Zepto源码之IE模块 读Zepto源码之Callbacks模块 读Zepto源码之Deferred...模块 读Zepto源码之Ajax模块 读Zepto源码之Assets模块 读Zepto源码之Selector模块 读Zepto源码之Touch模块 参考 指尖下的js —— 多触式web前端开发之三:处理复杂手势

    82100

    推荐10个React Native 开源项目,yyds~

    使用的同时也建议小伙伴们多阅读他们的源码,有利于我们写出更优秀的代码,不要只做代码的搬运工!...1.React Native Gesture Handler React Native Gesture Handler 是一个声明式原生触摸和手势库,提供了包括缩放、旋转、屏蔽滑动等手势的处理系统;能够定义多个手势之间的关系...比如旋转进入视图、滑动、淡入、缩放、翻转等。仅支持 React 17+。如果您使用的是 React 16,请继续使用 v1。...Theatre.js 以编程和可视化的方式为使用 Three.js、React Three Fiber、HTML/SVG 等创建的 3D 对象设置动画,甚至用于“动画”变量值。...Github: https://github.com/theatre-js/theatre 10.react-player 一个可播放各大网站内容的组件。

    1.9K20

    Touch 移动设备上的 手势识别 与 Js事件库

    Touch.js 是移动设备上的手势识别与事件库, 由百度云Clouda团队维护,也是在百度内部广泛使用的开发工具。 Touch.js手势库专为移动设备设计。...Touch.js对于网页设计师来说,是一款不错的辅助工具,可以减少很多写框架控制器的时间。 网页合理使用Touch.js不但能增加网页的美观感,而且在节约时间,减少人力投入也有极大的帮助。...(‘#btn-ok’,’tap’,function(ev){ //这里是你想要执行的操作,随便写 }) 上面是一个简单的tap操作,touch.js还支持滑动、缩放等等手势操作,详细的手势事件如下:...2. touch.js支持的手势事件类型: 分类 参数 描述 缩放 pinchstart 缩放手势起点 ~ pinchend 缩放手势终点 ~ pinch 缩放手势 ~ pinchin 收缩 ~ pinchout...以下为手势新增的属性: 属性 描述 originEvent 触发某事件的原生对象 type 事件的名称 rotation 旋转角度 scale 缩放比例 direction 操作的方向属性 fingersCount

    4.1K40

    加载Flash、禁用JS脚本、滚动页面至元素、缩放页面

    好了,收回来,Selenium很多难解决的问题,我们要首先想到从JS脚本出发,毕竟Selenium还是支持驱动浏览器运行JS脚本的。...issue 2676: Some ChromeDriver status codes are wrong [[Pri-2]] Resolved issue 2665: compile error in JS...,location获取的坐标是按显示100%时得到的坐标,而截图所使用的坐标却是需要根据显示缩放比例缩放后对应的图片所确定的,因此就出现了偏差。...这是最简单的方法; 2.缩放截取到的页面图片,即将截图的size缩放为宽和高都除以缩放比例后的大小; 3.修改Image.crop的参数,将参数元组的四个值都乘以缩放比例。...运行js document.body.style.zoom='0.5' 关注我 我目前是一名后端开发工程师。

    6.5K10
    领券