移动端+PC端图片预览+手势缩放等功能合集

2023-11-19

话不多说,直接上代码,大家可按需求功能复制使用

        window.onload = function() {

    //点击图片进入预览

    var $Dom = document.querySelector(".preview");

    $Dom.onclick = function() {

        var temp = this.src;

        var objE = document.createElement("div");

      

        objE.innerHTML = '<div class="bgM">' +

                '<img src="'+temp+'" id="img_scan" class="img-custom-img2" />' +

            '</div>';

        document.body.appendChild(objE.children[0]);

        //退出图片预览事件

        var $bg = document.querySelector(".bgM");

        $bg.onclick = function() {

            var dm = document.querySelector(".bgM");

            document.body.removeChild(dm);

        }

        var $img = document.querySelector(".img-custom-img2");

        $img.onclick = function(event) {

           event.stopPropagation();

        }

        createEvent();//自定义事件

        previewImg();//图片预览事件监听

    }

};

/*

*  自定义移动端手势事件  

*  事件:

*  - gesturestart      手势事件开始

*  - gesturechange     手势缩放

*  - gestureend        手势事件结束

*  - swipeMove         单指滑动

*  - doubleTouch       双击

*  - oneTouch          单击

*/

var createEvent = function(){

    var $bm = document.querySelector(".bgM");

    //

    var isTouch = false;

    var isDoubleTouch = false; //是否为多触点   

    var start = []; //存放触点坐标

    var now, delta; //当前时间,两次触发事件时间差

    var timer = null;

    var startPosition, movePosition, endPosition; //滑动起点,移动,结束点坐标

    //事件声明

    var gesturestart = new CustomEvent('gesturestart');

    var gesturechange = new CustomEvent('gesturechange');

    var gestureend = new CustomEvent('gestureend');

    var swipeMove = new CustomEvent('swipeMove');

    var doubleTouch = new CustomEvent("doubleTouch");

    var oneTouch = new CustomEvent("oneTouch");

    //监听touchstart事件

    $bm.addEventListener('touchstart', function(e) {

        //e.preventDefault();

        if (e.touches.length >= 2) { //判断是否有两个点在屏幕上

            isDoubleTouch = true;

            start = e.touches; //得到第一组两个点

            var screenMinPoint = getMidpoint(start[0], start[1]); //获取两个触点中心坐标

            gesturestart.midPoint = [screenMinPoint[0] - e.target.offsetLeft, screenMinPoint[1] - e.target.offsetTop]; //获取中心点坐标相对目标元素坐标

            e.target.dispatchEvent(gesturestart);

        } else {

            delta = Date.now() - now; //计算两次点击时间差

            now = Date.now();

            startPosition = [e.touches[0].pageX, e.touches[0].pageY];

            if (delta > 0 && delta <= 250) { //双击事件

                clearTimeout(timer);

                doubleTouch.position = [e.touches[0].pageX - e.target.offsetLeft, e.touches[0].pageY - e.target.offsetTop];

                e.target.dispatchEvent(doubleTouch);

            } else { //滑动事件

                timer = setTimeout(function(){

                    e.target.dispatchEvent(oneTouch);//单击事件

                },450)

            }

            isTouch = true;

        }

    }, false);

    //监听touchmove事件

    $bm.addEventListener('touchmove', function(e) {

        //e.preventDefault();

        clearTimeout(timer);

        if (e.touches.length >= 2 && isDoubleTouch) { //手势事件

            var now = e.touches; //得到第二组两个点

            var scale = getDistance(now[0], now[1]) / getDistance(start[0], start[1]); //得到缩放比例

            var rotation = getAngle(now[0], now[1]) - getAngle(start[0], start[1]); //得到旋转角度差

            gesturechange.scale = scale.toFixed(2);

            gesturechange.rotation = rotation.toFixed(2);

            e.target.dispatchEvent(gesturechange);

        } else if (isTouch) {

            movePosition = [e.touches[0].pageX, e.touches[0].pageY];

            endPosition = movePosition;

            movePosition = [movePosition[0] - startPosition[0], movePosition[1] - startPosition[1]];

            startPosition = [e.touches[0].pageX, e.touches[0].pageY];

            swipeMove.distance =[movePosition[0].toFixed(2) , movePosition[1].toFixed(2)];

            e.target.dispatchEvent(swipeMove);

        }

    }, false);

    //监听touchend事件

    $bm.addEventListener('touchend', function(e) {

        if (isDoubleTouch) {

            isDoubleTouch = false;

            gestureend.position = endPosition;

            e.target.dispatchEvent(gestureend);

        };

    }, false);

    /*

     * 两点的距离

     */

    function getDistance(p1, p2) {

        var x = p2.pageX - p1.pageX,

            y = p2.pageY - p1.pageY;

        return Math.sqrt((x * x) + (y * y));

    };

    /*

     * 两点的夹角

     */

    function getAngle(p1, p2) {

        var x = p1.pageX - p2.pageX,

            y = p1.pageY - p2.pageY;

        return Math.atan2(y, x) * 180 / Math.PI;

    };

    /*

     * 获取中点

     */

    function getMidpoint(p1, p2) {

        var x = (p1.pageX + p2.pageX) / 2,

            y = (p1.pageY + p2.pageY) / 2;

        return [x, y];

    }

}

/*

* 事件处理

*/

var previewImg = function() {

    var $imgs = document.querySelector("#img_scan");

    var clientWidth = document.body.clientWidth; //窗口宽

    var clientHeight = document.body.clientHeight; //窗口高

    var imgWidth = parseInt(window.getComputedStyle($imgs).width); //图片宽

    var imgHeight = parseInt(window.getComputedStyle($imgs).height); //图片高

    $imgs.addEventListener('gesturestart', gesturef, false);

    $imgs.addEventListener('gesturechange', gesturef, false);

    $imgs.addEventListener('gestureend', gesturef, false);

    $imgs.addEventListener('swipeMove', gesturef, false);

    $imgs.addEventListener('doubleTouch', gesturef, false);

    $imgs.addEventListener('oneTouch', gesturef, false);

    var tMatrix = [1, 0, 0, 1, 0, 0]; //x缩放,无,无,y缩放,x平移,y平移

    var originLast, maxSwipeLeft, maxSwipeRight, maxSwipeTop, maxSwipeBottom; //上下左右可拖动距离

    function maxMove(){

        //最大可拖动范围

        var sca = tMatrix[0];

        maxSwipeLeft = Math.abs(sca - 1) * originLast[0];

        maxSwipeRight = Math.abs(sca - 1) * (imgWidth - originLast[0]);

        maxSwipeTop = Math.abs(sca - 1) * originLast[1];

        maxSwipeBottom = Math.abs(sca - 1) * (imgHeight - originLast[1]);

    }

    function gesturef(event) {

        switch (event.type) {

            case "gesturestart":

                var x = event.midPoint[0];

                var y = event.midPoint[1];

                originLast = event.midPoint;

                $imgs.style.transformOrigin = x + "px " + y + "px";

                break;

            case "gesturechange":

                var sc = parseFloat(event.scale);

                tMatrix[0] = tMatrix[0] + sc - 1 > 0.5 && tMatrix[0] + sc - 1 < 3 ? tMatrix[0] + sc - 1 : tMatrix[0];

                tMatrix[3] = tMatrix[3] + sc - 1 > 0.5 && tMatrix[3] + sc - 1 < 3 ? tMatrix[3] + sc - 1 : tMatrix[3];

                var temp = tMatrix.join(",");

                $imgs.style.transform = "matrix(" + temp + ")";

                break;

            case "gestureend":

                maxMove();

                break;

            case "swipeMove":

                if (!maxSwipeLeft || !maxSwipeRight || !maxSwipeTop || !maxSwipeBottom) return;

                if (event.distance[0] > 0 && maxSwipeLeft < tMatrix[4]) return;

                if (event.distance[0] < 0 && maxSwipeRight < -tMatrix[4]) return;

                if (event.distance[1] > 0 && maxSwipeTop < tMatrix[5]) return;

                if (event.distance[1] < 0 && maxSwipeBottom < -tMatrix[5]) return;

                tMatrix[4] = tMatrix[4] + parseInt(event.distance[0]);

                tMatrix[5] = tMatrix[5] + parseInt(event.distance[1]);

                var temp = tMatrix.join(",");

                $imgs.style.transform = "matrix(" + temp + ")";

                break;

            case "doubleTouch":

                originLast = event.position;

                $imgs.style.transformOrigin = event.position[0] + "px " + event.position[1] + "px";

                tMatrix[0] = 2;//缩放倍数为2

                tMatrix[3] = 2;

                var temp = tMatrix.join(",");

                $imgs.style.transform = "matrix(" + temp + ")";

                maxMove();

                break;

            case "oneTouch":

                var $bg = document.querySelector(".bgM");

                document.body.removeChild($bg);

                break;

        }

    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移动端+PC端图片预览+手势缩放等功能合集 的相关文章

随机推荐

  • LangChain 是一个强大的框架,可以简化构建高级语言模型应用程序的过程。

    LangChain 是一个强大的框架 可以简化构建高级语言模型应用程序的过程 What is LangChain LangChain是一个强大的框架 旨在帮助开发人员使用语言模型构建端到端的应用程序 它提供了一套工具 组件和接口 可简化创建
  • 禁用触摸板

    sudo rmmod psmouse 这个是禁用的 sudo modprobe psmouse 这个是启用的
  • Failed to load response data:No data found for resource with given identifier

    一 遇到问题 最近项目中表单提交需求遇到了这个问题 Failed to load response data No data found for resource with given identifier 翻译 加载响应数据失败 找不到具
  • 《疯狂Java讲义》读书笔记(一)

    面向对象具有三个基本特征 封装 Encapsulation 继承 Inheritance 和多态 Polymorphism 继承是面向对象实现软件复用的重要手段 当子类继承父类 子类作为一个特殊的父类 将获得父类所有的属性和方法 封装是指将
  • 使用curl或wget连接网站的怎样忽略SSL证书错误

    导读 在默认情况下 cURL 使用 SSL 证书进行连接 如果指定的网站配置错误或证书过期 则会引发错误 下面我们看一下如何忽略其中的 SSL 证书错误 当我们使用 curl 命令访问网站的时候 有时候可能会得到一个 SSL 证书错误 这是
  • 大数据面试-05-大数据工程师面试题

    2 HashMap和HashTable ArrayList和Vector ArrayList和LinkedList的区别 1 HashMap不是线程安全的 hashmap是一个接口 是map接口的子接口 是将键映射到值的对象 其中键和值都是
  • 基于rt2860v2的wifi探针

    实验室有块7620a的板子 之前做过探针方面的试验 rt2860v2的驱动源码来自网络 探针是基于这份源码做的试验 最初在驱动中采集的数据是通过proc节点送到应用层 但是发现数据的实时性啥的不够好 改用了netlink方式 有感兴趣的同学
  • Cocos Creator 如何处理物理和碰撞检测?

    Cocos Creator 如何处理物理和碰撞检测 cocos creator 版本 v3 6 1 Cocos Creator 3 x 实现碰撞检测 Cocos Creator 通过使用物理引擎来处理物理和碰撞检测 Cocos Creato
  • 线特征的LSD提取算法

    线特征的LSD提取算法 线段检测器算法 算法流程 大多数图像中都存在直线特征 是视觉感知 描述外部环境的重要特征信息 直线是一种大尺度的特征 在水面环境中具有更为理想的适用性 线特征具有光照和视角不变性特点 表现更为稳定 有效 因此将点 线
  • redis--11.2--操作--管道

    redis 11 2 操作 管道 1 介绍 将多个命令一起通过网络发送 返回多个值
  • Knowledge Distillation & Student-Teacher Learning for Visual Intelligence: A Review & New Outlooks

    论文地址 http arxiv org abs 2004 05937 github地址 无 这是篇关于知识蒸馏的综述文章 知识蒸馏被认为是用于模型压缩的非常有效的一种方式 本文作者从模型压缩和知识迁移两个应用场景概述了近年来对知识蒸馏的研究
  • kaggle数据集_图像分类:来自 13 个 Kaggle 项目的经验总结

    点击上方公众号 可快速关注 转自 机器学习实验室 任何领域的成功都可以归结为一套小规则和基本原则 当它们结合在一起时会产生伟大的结果 机器学习和图像分类也不例外 工程师们可以通过参加像Kaggle这样的竞赛来展示最佳实践 在这篇文章中 我将
  • VMware虚拟机崩溃的解决方法(.vmx损坏,其他文件完好)

    使用虚拟机的朋友想必都或多或少遇到过虚拟机崩溃 无法开启的问题吧 这确实是虚拟机存在的一个严重问题 例如突然断电 或者虚拟机非正常关机等等 很多因素都能造成虚拟机的异常损坏 本文就针对其中的一种常见问题提供相关解决办法 如有不当之处 望不吝
  • c++直角坐标系与极坐标系的转换_平面向量的奇技淫巧——斜坐标系的一系列低级研究...

    事先说明 笔者初三 如在叙述中有不严谨的地方 还请诸位指出 自当感激不尽 一 什么是斜坐标系 众所周知 我们目前平面中使用相当广的坐标系是笛卡尔发明的平面直角坐标系 然而 笛卡尔真的只使用了这一种坐标系吗 显然不是的 事实上 笛卡尔最先使用
  • Odoo免费开源ERP订单锁货的应用实施技巧分享

    Odoo是世界排名第一的免费开源ERP 其应用市场上有3万多个功能插件可供下载使用 几乎涵盖各行各业的企业业务管理流程 包括库存管理 销售管理 采购管理 制造管理 维修保养 网站电商 市场营销 项目管理 HR 财务 PLM等等 并且源码交付
  • 服务器备案的网站名称怎么填写,公安备案网站名称怎么写?

    最近很多新老用户接到西安网警打来电话让进行公安网安备案 要求通过全国互联网安全管理服务平台进行公安联网备案 客户俗称 公安备案网站名称怎么写 依据 计算机信息网络国际联网安全保护管理办法 相关规定 各网站在工信部备案成功后 需在网站开通之日
  • 迪杰斯特拉算法(Dijkstra)-Java实现

    迪杰斯特拉算法也是求两点之间最短路径的算法 它的思想和普利姆算法有点相似 不断通过已找到点集合和未找到点之间的集合之间的最短路径 这个算法需要用到三个数组 一个是存储结点是否已经访问 一个是结点到起始点的最短距离 还有一个是结点到起始点第一
  • Java实现简单版SVM

    Java实现简单版SVM 最近的图像分类工作要用到latent svm 为了更加深入了解svm 自己动手实现一个简单版的 之所以说是简单版 因为没有用到拉格朗日 对偶 核函数等等 而是用最简单的梯度下降法求解 其中的数学原理我参考了http
  • 解决Adobe Flash Player已不再受支持的问题

    1 问题展示 我们在访问某些网站时 可能会出现Adobe Flash Player已不再受支持的问题 具体如下图所示 这会对我们的日常生活需求产生极大的不便 因此迫切需要一个能够解决此问题的方法 其实很简单 具体操作请看下面的步骤 2 下载
  • 移动端+PC端图片预览+手势缩放等功能合集

    话不多说 直接上代码 大家可按需求功能复制使用 window onload function 点击图片进入预览 var Dom document querySelector preview Dom onclick function var