原生js 图片查看器

article/2025/9/23 5:33:36

将以前用angular 写的 自定义指令 封装成 插件,无需引用jquery、angular。

下载下来即可查看效果。

github网址: GitHub - wzhGitH/imgView: js 图片查看器,H5图片预览(imgView)

百度云下载链接: 百度网盘 请输入提取码 密码: gidq

可实现放大、缩小、拖拽、旋转、上一张、下一张.

 样子是这样的

用原生js写的图片查看器, 可旋转、放大、上一张、下一张和拖拽.无需引用jquery.

参数值需要传入 图片数组、跟当前点击的图片即可

代码使用

var options = {dataList: dataList,   // 图片数组currentSrc: src       // 当前要显示的图片
}// 使用
ImgView("imgView", options);

最主要的ImgView.js

(function(window, document) {var ImgView = function(targetDom, options) {// 判断是用函数创建的还是用new创建的。这样我们就可以通过MaskShare("dom") 或 new MaskShare("dom")来使用这个插件了  if (!(this instanceof ImgView)) return new ImgView(targetDom, options);// 参数this.options = this.extend({dataList: [],currentSrc: ""}, options);// 获取domthis.targetDom = document.getElementById(targetDom);var html = "<div id='imgViewDiv' class='img-view-dialog'>" +"<div id='imgViewContent' class='img-view-content' draggable>" +"<img id='dialogImg' class='dialog-img' src=''></div>" +"<div class='dialog-tool'><i id='closeDialog' class='close-dialog'></i>" +"<i id='rotateDialog' class='rotate-dialog'></i><i id='prevDialog' class='previous-dialog'></i>" +"<i id='nextDialog' class='next-dialog'></i></div></div>";this.targetDom.innerHTML = html;this.btnClose = document.getElementById("closeDialog");this.btnRotate = document.getElementById("rotateDialog");this.btnPrev = document.getElementById("prevDialog");this.btnNext = document.getElementById("nextDialog");this.imgViewDiv = document.getElementById("imgViewDiv");this.imgViewContent = document.getElementById("imgViewContent");this.dialogImg = document.getElementById("dialogImg");this.num = 0;this.winWidth = 0;this.winHeight = 0;this.startX = 0, this.startY = 0, this.x = 0, this.y = 0;this.index = 1;this.event();}ImgView.prototype = {init: function() {this.event();},extend: function(obj, obj2) {for (var k in obj2) {obj[k] = obj2[k];}return obj;},event: function() {var _this = this;_this.thisSrc = _this.options.currentSrc;var dataList = _this.options.dataList;var index = dataList.indexOf(_this.thisSrc);_this.checkImg(_this.options.currentSrc, index);// 关闭_this.btnClose.addEventListener("click", function() {_this.close(_this);});// 旋转_this.btnRotate.addEventListener("click", function() {_this.rotate(_this);});// 上一张_this.btnPrev.addEventListener("click", function() {_this.prev(_this);});// 下一张_this.btnNext.addEventListener("click", function() {_this.next(_this);});// 鼠标按下_this.imgViewContent.addEventListener("mousedown", function(event) {_this.mousedown(_this, event);});// 滚轮事件 chrome & ie_this.imgViewContent.addEventListener("mousewheel", function(event) {_this.mousewheel(_this, event);});// 滚轮事件 firefox_this.imgViewContent.addEventListener("DOMMouseScroll", function(event) {_this.mousewheel(_this, event);});},// 滚轮事件mousewheel: function(_this, event) {event.preventDefault();var delta = (event.wheelDelta && (event.wheelDelta > 0 ? 1 : -1)) || // chrome & ie(event.detail != 0 && (event.detail > 0 ? -1 : 1));if (delta > 0) {// 向上滚_this.index = _this.index + 0.1;if (_this.index > 4) {_this.index = 4;}} else if (delta < 0) {// 向下滚_this.index = _this.index - 0.1;if (_this.index < 0.1) {_this.index = 0.1;}}_this.imgViewContent.style.marginLeft = _this.imgMarginLeft - ((_this.index - 1) * _this.imgWidth) / 2 + "px";_this.imgViewContent.style.marginTop = _this.imgMarginTop - ((_this.index - 1) * _this.imgHeight) / 2 + "px";event.target.style.width = _this.imgWidth * _this.index + "px";event.target.style.height = _this.imgHeight * _this.index + "px";},// 鼠标按下事件(拖拽用)mousedown: function(_this, event) {event.preventDefault();var imgWidth = _this.imgWidth * _this.index;var imgHeight = _this.imgHeight * _this.index;var rotateNum = _this.num * 90;// 根据旋转的角度不同,坐标也不一样if (rotateNum % 90 == 0 && rotateNum % 180 != 0 && rotateNum % 270 != 0 && rotateNum % 360 != 0) {_this.startX = (imgWidth - imgHeight) / 2 + imgHeight - event.offsetY;_this.startY = event.offsetX - (imgWidth - imgHeight) / 2;} else if (rotateNum % 180 == 0 && rotateNum % 360 != 0) {_this.startX = imgWidth - event.offsetX;_this.startY = imgHeight - event.offsetY;} else if (rotateNum % 270 == 0 && rotateNum % 360 != 0) {_this.startX = (imgWidth - imgHeight) / 2 + event.offsetY;_this.startY = imgWidth - event.offsetX - (imgWidth - imgHeight) / 2;} else {_this.startX = event.offsetX;_this.startY = event.offsetY;}document.addEventListener('mousemove', mousemove);document.addEventListener('mouseup', mouseup);// 拖拽function mousemove(event) {_this.y = event.clientY - _this.startY - 10;_this.x = event.clientX - _this.startX - 10;_this.imgViewContent.style.marginTop = "" + _this.y + "px";_this.imgViewContent.style.marginLeft = "" + _this.x + "px";_this.imgViewContent.style.transition = "margin 0s";};// 鼠标放开function mouseup() {document.removeEventListener('mousemove', mousemove);document.removeEventListener('mouseup', mouseup);_this.imgViewContent.style.transition = "all 0.6s";}},// 关闭close: function(_this) {var imgViewDiv = document.getElementById("imgViewDiv");imgViewDiv.setAttribute("class", "img-view-dialog closing");setTimeout(function() {imgViewDiv.setAttribute("class", "img-view-dialog");imgViewDiv.style.display = "none";_this.num = 0;}, 400);},// 旋转rotate: function(_this) {_this.num++;_this.imgViewContent.style.transform = "rotate(" + _this.num * 90 + "deg) scale(1, 1)";},// 上一张prev: function(_this) {var dialogImg = document.getElementById("dialogImg");var thisSrc = dialogImg.attributes[2].value;if (thisSrc.indexOf("width:") != -1 || thisSrc.indexOf("height:") != -1) {thisSrc = dialogImg.attributes[3].value;}var dataList = _this.options.dataList;var index = dataList.indexOf(thisSrc);if (index > 0 && index <= (dataList.length - 1)) {index = index - 1;_this.checkImg(dataList[index], index);}},// 下一张next: function(_this) {var dialogImg = document.getElementById("dialogImg");var thisSrc = dialogImg.attributes[2].value;if (thisSrc.indexOf("width:") != -1 || thisSrc.indexOf("height:") != -1) {thisSrc = dialogImg.attributes[3].value;}var dataList = _this.options.dataList;var index = dataList.indexOf(thisSrc);if (index >= 0 && index < (dataList.length - 1)) {index = index + 1;_this.checkImg(dataList[index], index);}},// 点击图片checkImg: function(thisSrc, index) {var _this = this;_this.index = 1;_this.num = 0;_this.dialogImg.style.transform = "";_this.imgViewContent.setAttribute("class", "img-view-content");_this.getWindowWH();if (index == 0) {_this.btnPrev.style.display = "none";} else if (index == (dataList.length - 1)) {_this.btnNext.style.display = "none";} else {_this.btnPrev.style.display = "block";_this.btnNext.style.display = "block";}var image = new Image();image.src = thisSrc;var width = image.width;var height = image.height;var ww = 860;var wh = _this.winHeight - 20;if (width < ww && height < wh) {width = width;height = height;} else {var scale_x = width / ww;var scale_y = height / wh;if (scale_x > scale_y) {var width = ww;var height = parseInt(height / scale_x);} else {var width = parseInt(width / scale_y);var height = wh;}}_this.imgWidth = width;_this.imgHeight = height;var left = (_this.winWidth - width) / 2;var top = (_this.winHeight - height) / 2;_this.imgMarginLeft = left;_this.imgMarginTop = top;_this.imgViewContent.style.cssText = "margin-top:" + top + "px; margin-left:" + left + "px";_this.dialogImg.style.cssText = "width:" + width + "px; height:" + height + "px;";setTimeout(function() {_this.dialogImg.setAttribute("src", thisSrc);_this.imgViewContent.setAttribute("class", "img-view-content loadingImg");}, 600);},// 获取浏览器宽高getWindowWH: function() {var _this = this;if (window.innerWidth)_this.winWidth = window.innerWidth;else if ((document.body) && (document.body.clientWidth))_this.winWidth = document.body.clientWidth;// 获取窗口高度if (window.innerHeight)_this.winHeight = window.innerHeight;else if ((document.body) && (document.body.clientHeight))_this.winHeight = document.body.clientHeight;// 通过深入 Document 内部对 body 进行检测,获取窗口大小if (document.documentElement && document.documentElement.clientHeight && document.documentElement.clientWidth) {_this.winHeight = document.documentElement.clientHeight;_this.winWidth = document.documentElement.clientWidth;}}}window.ImgView = ImgView;
}(window, document));

下载点击HTML即可查看.


http://chatgpt.dhexx.cn/article/HVDpqb1s.shtml

相关文章

vue-quill-editor拖拽或粘贴的图片上传到服务器回显插入图片后删除生成的Base64图片

问题描述&#xff1a;拖拽或粘贴图片上传到服务器后返回url插入富文本编辑器后&#xff0c;quill默认生成的base64图片链接也同时出现在富文本编辑器中&#xff0c;等于是有两张相同的图片&#xff0c;一张是我们服务器图片&#xff0c;一张是base64格式图片&#xff01;&#…

Unity3D在UI中加入Image图片

在将图片拖入到Assets后发现根本不能将图片拖入到UI中&#xff1a; 新建Image后在Source Image中也不能找到图片&#xff1a; 那是因为你没把图片设置为Sprite&#xff0c;图片只是Texture而已&#xff0c;只能作为贴图使用。 可以将图片设置为Sprite: 这样一切就正常了&#…

纯JS图片查看器

目前支持&#xff1a;放大、缩小&#xff08;含滚轮&#xff09;、旋转、还原 /*** 说明信息* date 2022/10/13 19:46:44* 初始化图片查看器* date 2022/09/21 14:40:06* id 唯一标识&#xff0c;指定id区域内的图片* params 扩展参数&#xff0c;设置图片大小&#xff0c;目前…

vue-quill-editor上传图片

问题&#xff1a; vue-quill-editor富文本编辑器上传图片默认为base64&#xff0c;存入数据库过于过于庞大&#xff0c;使用quill-image-extend-modulevue-quill-editor实现图片地址上传。 解决完之后效果图&#xff1a; 解决思路&#xff1a; 哈哈&#xff0c;第一步当然去…

unity UI 加入image图片

1.新建画布&#xff0c;新建image. 2.我们发现这个时候把Assets里的图片直接拖到Image上是行不通的。原因就是此时的图片没有设为sprite. 处理方法&#xff1a;点击图片&#xff0c;修改Texture Type为Sprite. 下图左边图片为调整后&#xff0c;右边图片为没有调整. 3.调整后就…

js预览本地图片

本地图片在上传服务器前&#xff0c;如何预览效果&#xff1f; 一个方法就可以了&#xff0c;主要是如何从事件中读取文件数据&#xff0c;放到<img>展示 幸运的是&#xff0c;事件中的图片数据已经被转换成<img>可直接识别的内容&#xff0c;直接赋值给<img&g…

python QT 图片缩放,移动

python QT graphicsView控件实现图片的缩放与移动 1、效果图2、界面搭建3、实现方法3.1、构建处理图元的类3.1、绘制图像3.2、拖拽方法实现3.3、缩放方法实现 4、调用方法 1、效果图 选择图片后可在graphicsView窗口中显示选择的图片&#xff0c;可以用鼠标拖拽图片。当鼠标停…

Unity UI修改Image中的图片资源

Unity UI修改Image中的图片资源 一、取资源文件 把资质文件放到Assets文件夹下Resources文件中。 二、在属性面板下修改图片类型 三、在脚本中修改需要修改的资源 Sprite sprite Resources.Load(“Images/2”); //Images文件夹下名为2的图片 Image2.sprite sprite; //修改…

Linux命令scp用法

本文主要讲的是scp用法如果哪里不对欢迎指出&#xff0c;主页https://blog.csdn.net/qq_57785602?typeblog scp 可以在win系统使用&#xff0c;本文百分之八十写的是win系统怎么使用&#xff0c;在本地上到服务器文件,从服务器下载文件到本地 用工具连接到公司服务器时&#x…

linux远程cp命令,Linux cp scp命令使用

cp 拷贝命令&#xff0c;用来对文件或者子目录进行拷贝操作的。 scp 是secure copy的简写&#xff0c;用于在Linux下进行远程拷贝文件的命令&#xff0c;和它类似的命令有cp&#xff0c;不过cp只是在本机进行拷贝不能跨服务器&#xff0c;而且scp传输是加密的。可能会稍微影…

linux 使用scp命令,Linux scp命令使用实例汇总

Linux下要实现两台服务器之间的文件传送&#xff0c;使用scp命令就可以了&#xff0c;在Linux系统中&#xff0c;scp命令的用法简单而又实用&#xff0c;系统之家就给大家介绍下如何使用scp命令进行Linux服务器之间的文件传送。 scp是secure copy的简写&#xff0c;用于在Linux…

linux中scp命令用法

问题&#xff1a;经常用到文件分发到另一个机器&#xff0c;怎么做&#xff1f; 每次连接一个机器&#xff0c;把压缩包上传上去&#xff0c;然后解压修改&#xff0c;这样在太麻烦。linux的cp命令可以复制文件&#xff0c;能不能吧修改好的文件复制过去呢&#xff1f; 一、cp…

scp命令的使用

Linux scp 命令用于 Linux 之间复制文件和目录&#xff1b;scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令&#xff1b;scp 是加密的&#xff0c;rcp 是不加密的&#xff0c;scp 是 rcp 的加强版。 用法&#xff1a; scp [可选参数]…

scp命令使用方法

scp 命令是用于通过 SSH 协议安全地将文件复制到远程系统和从远程系统复制文件到本地的命令。使用 SSH 意味着它享有与 SSH 相同级别的数据加密&#xff0c;因此被认为是跨两个远程主机传输文件的安全方式。 基本语法 下面提供了 SCP 命令的基本语法&#xff1a; $ scp [opt…

unity仓库管理简易模型(一)

1. 环境 unity2018 2. 运行截图 3. 功能 1. 场景漫游 提供第一视角模式和自由模式。第一视角使用unity自带的角色控制器包实现角色移动视角移动&#xff0c;自由模式实现鼠标拖拽&#xff0c;场景缩放。 2. 商品定位 通过输入商品信息&#xff0c;在三维场景中定位到商品…

计算机网络基础(类别 | 性能指标 | OSI模型初识)

目录 计算机网络类别 根据作用的范围分类 局域网&#xff08;LAN&#xff09; 广域网&#xff08;WAN&#xff09; 根据使用者分类 按照拓扑结构来分类 按照交换方式分类 按照工作方式分类 性能指标 什么是带宽 速率 吞吐量 时延 传播时延和带宽的乘积 往返时间…

(附源码)springboot学生宿舍管理系统 毕业设计 211955

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

数据蛙9套SQL面试题笔记

数据分析SQL面试题目9套汇总 题目来源&#xff1a; https://www.jianshu.com/p/0f165dcf9525 关于这套题的笔记 一、 解题思路&#xff1a; 1、用concat实现连接 2、还需要按照“用户号”分组&#xff0c;将每组中的前两个“场景”号间接&#xff0c;这时需要用到 GROUP_C…

tp6中无限极分类里面的获取多级分类数据

作者&#xff1a;陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 文章目录 前言一、什么是多级分类数据&#xff1f;二、使用步骤sql代码2.效果图 总结 前言 和大家共同完成获取多级分类数据 一、什么是多级分类数据&#xff1f; 就是很多很多的数据&#xff0c;按照…

基于Gazebo的无人机管道检测

管道检测正式版本 1.需求分析 面对管道沿线地势起势大、道路崎岖难走&#xff0c;沿途穿越河流、沟谷、沼泽地纵多&#xff0c; 杂草植被茂密&#xff0c;无巡检通道等现状&#xff0c;人工巡检暴露出明显缺陷&#xff0c;车辆无法到达,需要跋山涉水徒步进行&#xff0c;巡护时…