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中的deferred使用方法
Mar 27 jQuery
详谈jQuery中使用attr(), prop(), val()获取value的异同
Apr 25 jQuery
jQuery实现选中行变色效果(实例讲解)
Jul 06 jQuery
jQuery接受后台传递的List的实例详解
Aug 02 jQuery
jQuery实现用户信息表格的添加和删除功能
Sep 12 jQuery
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
Nov 10 jQuery
HTML5+JS+JQuery+ECharts实现异步加载问题
Dec 16 jQuery
jQuery第一次运行页面默认触发点击事件的实例
Jan 10 jQuery
关于jquery layui弹出层的使用方法
Apr 21 jQuery
jQuery 导航自动跟随滚动的实现代码
May 30 jQuery
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
php disk_free_space 返回目录可用空间
2010/05/10 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
javascript实现的listview效果
2007/04/28 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
python3.x实现发送邮件功能
2018/05/22 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
大学生毕业自我鉴定范文
2014/02/03 职场文书
八一建军节感言
2014/02/28 职场文书
《识字五》教学反思
2014/03/01 职场文书
干部考核评语
2014/04/29 职场文书
本科生就业推荐信
2014/05/19 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python