jQuery图片查看插件Magnify开发详解


Posted in jQuery onDecember 25, 2017

前言

因为一些特殊的业务需求,经过一个多月的蛰伏及思考,我开发了这款 jQuery 图片查看器插件 Magnify,它实现了 Windows 照片查看器的所有功能,比如模态窗的拖拽、调整大小、最大化,图片的缩放、旋转,平移、键盘控制等。插件的样式都是最基础的 CSS,定制非常容易,可以轻松修改成自己喜欢的样式。随后会陆续发布 React 及 Vue 相关版本的插件。本文主要介绍插件的特点及使用方法,而关于插件开发的细节将会在之后的具体文章中说明。

Github: https://github.com/nzbin/magnify

Website:  https://nzbin.github.io/magnify

开发小记

由于最近工作繁忙,几乎每天都是晚上十点到家,然后开始编写插件,睡觉时已过凌晨,如今身心俱疲。因为没有找到相关的插件,所以很多问题都是绞尽脑汁独立思考,比如以鼠标为中心缩放图片、改变弹窗大小时对图片移动的限制、图片旋转之后的缩放、平移等问题,而开发插件最让人头疼的就是细节,甚至大部分时间是在修复单一功能的 bug 。

另外,开发插件的最大难度不是功能实现,而是如何设计插件,如何让插件的使用更简单、更方便。关于如何设计插件并不是本篇文章的重点,我会在之后专门写一篇介绍插件设计思想的文章。

插件所有的代码几乎都是在调整弹窗或者图片的 width、height、left、top ,所以兼容性问题不大,主要是 2D 旋转问题,IE 9 以下需要使用滤镜实现。为了方便调整样式,其中有很多相对位置的计算。

Magnify 采用了文件分离的方式编写,使用 npm 插件打包,并没有使用新语法,也没有使用现在流行的打包工具。使用 npm 工具已经是项目开发打包发布的一个趋势。

演示

如果你不想点开网址查看示例的话,可以通过下面的 CodePen 查看插件效果,除了视窗的大小之外,两种方式没有任何区别:

如果你的网速和其他原因不能打开 CodePen 的话,可以查看下面的图片演示。

主要功能

Magnify 的功能可以参考 Windows 照片查看器,基本完成了可以实现的所有功能。

1.模态窗拖拽

如果图片尺寸不大于展示区域,通过图片展示区域也可以拖拽弹窗。这和 QQ 图片查看器的操作方式是相同的。

jQuery图片查看插件Magnify开发详解

2.模态窗调整大小

目前的调整大小存在一点 bug,但不影响整体的使用。

jQuery图片查看插件Magnify开发详解

3.模态窗最大化

除了弹窗最大化,开发初期也设计了最小化的功能,但感觉有些鸡肋,所以暂时没有添加。

jQuery图片查看插件Magnify开发详解

4.图片缩放

可以通过鼠标滚轮、按钮、键盘等操作

jQuery图片查看插件Magnify开发详解

5.图片旋转

目前的图片旋转功能还没有添加支持 IE9 以下版本的代码。

jQuery图片查看插件Magnify开发详解

6.键盘控制

Magnify 和 Windows 照片查看器的按键是一样的

上一张 下一张 + 放大 - 缩小 ctrl + alt + 0 实际尺寸 ctrl + , 向左旋转 ctrl + . 向右旋转 7.全屏显示

Magnify 的全屏显示只实现了基本的展示功能,还没有实现幻灯片自动轮播的功能。全屏环境下使用键盘控制图片。

使用方法

Magnify 的使用和其他大多数 lightbox 插件的用法并没有两样,如果你习惯了其它插件的使用,使用 Magnify 也不会有任何障碍。

1.需要引用的文件

<link href="/path/to/magnify.css" rel="external nofollow" rel="stylesheet">
<script src="/path/to/jquery.js"></script>
<script src="/path/to/jquery.magnify.js"></script>

Magnify 默认使用 font-awesome 的图标,所以需要引用 font-awesome 的 css 文件。如果你想使用其它图标,可以修改 options 的 icons 参数。在之后的版本中,我可能会添加定制的字体图标文件或者使用 svg 图标。

<link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="external nofollow" rel="stylesheet">

2.HTML 结构

Magnify 默认使用以下结构,这样的结构可以做兼容处理,也是大多数 lightbox 使用的结构。

<a data-magnify="gallery" href="big-1.jpg" rel="external nofollow" >
 <img src="small-1.jpg">
</a>
<a data-magnify="gallery" href="big-2.jpg" rel="external nofollow" >
 <img src="small-2.jpg">
</a>
<a data-magnify="gallery" href="big-3.jpg" rel="external nofollow" >
 <img src="small-3.jpg">
</a>

也可以使用下面更简洁的结构

<img data-magnify="gallery" data-src="big-1.jpg" src="small-1.jpg">
<img data-magnify="gallery" data-src="big-2.jpg" src="small-2.jpg">
<img data-magnify="gallery" data-src="big-3.jpg" src="small-3.jpg">

Magnify 的 HTML 结构包含以下几个选项

添加 data-src 属性可以链接到大图。如果在 <a> 标签中使用,它会覆盖 href 属性的值。添加 data-caption 属性可以显示标题。如果你不使用这个属性,插件会显示 URL 中的图片名。添加 data-group 属性可以对图片分组。 3.初始化插件

如果在 HTML 中添加 data-magnify 属性,插件会自动初始化。

手动初始化插件的方法和所有 jQuery 插件一样:

$('[data-magnify=gallery]').magnify(options);

参数配置

options = {
  draggable: true,
  resizable: true,
  movable: true,
  keyboard: true,
  title: true,
  modalWidth: 320,
  modalHeight: 320,
  fixedContent: true,
  fixedModalSize: false,
  initMaximized: false,
  gapThreshold: 0.02,
  ratioThreshold: 0.1,
  minRatio: 0.1,
  maxRatio: 16,
  headToolbar: [
   'maximize',
   'close'
  ],
  footToolbar: [
   'zoomIn',
   'zoomOut',
   'prev',
   'fullscreen',
   'next',
   'actualSize',
   'rotateRight'
  ],
  icons: {
   maximize: 'fa fa-window-maximize',
   close: 'fa fa-close',
   zoomIn: 'fa fa-search-plus',
   zoomOut: 'fa fa-search-minus',
   prev: 'fa fa-arrow-left',
   next: 'fa fa-arrow-right',
   fullscreen: 'fa fa-photo',
   actualSize: 'fa fa-arrows-alt',
   rotateLeft: 'fa fa-rotate-left',
   rotateRight: 'fa fa-rotate-right'
  }
}

关于插件参数的具体含义,我就不在此复制黏贴了,请大家参考 官方文档 的详细说明。如有问题,可以在此留言。

自定义样式

jQuery图片查看插件Magnify开发详解

因为插件的样式比较简单,所以修改起来也非常容易。除了 Windows 照片查看器,QQ 的图片查看器也非常的高大上。我们只要简单修改就可以实现 QQ 图片查看器的效果,但是部分功能比如缩略图还没有实现。以下是实时演示:

面对这样的图片查看器足以令人心旷神怡~

总结

目前插件整体已经趋于完善,但仍然有很多需要修改及添加的细节,尤其对移动端的支持,大家可以 star 一下随时关注项目的更新动态。关于插件的介绍就不再赘述了,如果大家发现了 Bug 或者有更好的建议,可以在GitHub中提问,也可以在此留言,大家的支持是我前进的最大动力!如果这款插件对你有帮助或者你在项目中使用了这款插件,欢迎留言告知!

jQuery 相关文章推荐
jQuery滚动插件scrollable.js用法分析
May 25 jQuery
jQuery事件_动力节点Java学院整理
Jul 05 jQuery
基于jQuery实现图片推拉门动画效果的两种方法
Aug 26 jQuery
jquery+css实现下拉列表功能
Sep 03 jQuery
webpack里使用jquery.mCustomScrollbar插件的方法
May 30 jQuery
jQuery实现的监听导航滚动置顶状态功能示例
Jul 23 jQuery
jQuery实现的页面弹幕效果【测试可用】
Aug 17 jQuery
解决jquery有正确返回值但不执行success函数的问题
Aug 20 jQuery
jQuery扩展方法实现Form表单与Json互相转换的实例代码
Sep 05 jQuery
jQuery表单选择器用法详解
Aug 22 jQuery
jquery弹窗时禁止body滚动条滚动的例子
Sep 21 jQuery
基于JQuery和DWR实现异步数据传递
Oct 16 jQuery
jQuery实现右侧抽屉式在线客服功能
Dec 25 #jQuery
jQuery简单实现向列表动态添加新元素的方法示例
Dec 25 #jQuery
jQuery EasyUI window窗口使用实例代码
Dec 25 #jQuery
利用jQuery+localStorage实现一个简易的计时器示例代码
Dec 25 #jQuery
jQuery EasyUI 选项卡面板tabs的使用实例讲解
Dec 25 #jQuery
jQuery EasyUI 折叠面板accordion的使用实例(分享)
Dec 25 #jQuery
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
Dec 24 #jQuery
You might like
PHP与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
php实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
jquery时间下拉框小例子
2013/04/15 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
python实现360皮肤按钮控件示例
2014/02/21 Python
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
python正则表达式match和search用法实例
2015/03/26 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
NumPy排序的实现
2020/01/21 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
工程地质勘察专业大学生求职信
2013/10/13 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
岗位聘任协议书
2015/09/21 职场文书
丧事答谢词大全
2015/09/30 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技