如何让你的Lightbox支持滚轮缩放及Base64图片


Posted in Javascript onDecember 04, 2014

在做文章类型的web页时,经常会遇到要点开看大图的需求,LightBox2则是在众多产品中比较优秀的一款Jquery插件。配置就不细说了,今天我主要要分享的是:如何在点开大图后,可以通过鼠标滚轮来缩放图片,

1、修改Lightbox源码使支持滚轮缩放

    支持鼠标滚轮主要就是把弹出后的框整个绑定上mousewheel事件,打开lightbox.js,找到Lightbox.prototype.build = function() {...}这一段,可以在这里(lightbox初始化的时候)把想要的滚轮事件绑定上去,比如在函数的末尾添加如下代码:

       // 图片滚轮缩放

       this.img = this.$container.find('.lb-image');

       this.label = this.$lightbox.find('.lb-dataContainer');

       $([this.$overlay[0],this.$lightbox[0]]).bind("mousewheel", function(e){

           var flag= e.originalEvent.wheelDelta < 0; 

           var imgH = self.img.height();

           var imgW = self.img.width();

           var nw = Math.round(20*imgW/imgH);

           var ctH = self.$outerContainer.height();

           var ctW = self.$outerContainer.width();

           var layH = self.$overlay.height()-20;

           var layW = self.$overlay.width()-20;

           // 向下

           if(flag && imgH>20 && imgW>20) {

               self.img.css('height', imgH - 20);

               self.img.css('width', imgW - nw);

               self.$outerContainer.css('height', ctH - 20);

               self.$outerContainer.css('width', ctW - nw);

               if(ctW-nw > 240){

                   self.label.css('width', ctW - nw);

               }

           } else if(!flag && imgH<layH && imgW<layW) {

               self.img.css('height', imgH + 20);

               self.img.css('width', imgW + nw);

               self.$outerContainer.css('height', ctH + 20);

               self.$outerContainer.css('width', ctW + nw);

               self.label.css('width', ctW + nw);

           }  

           e.stopPropagation();

           return false;

       });

    代码比较好理解,就是给后面背景和前面图片都添加鼠标滚轮监听,然后高、宽成比例地缩放(向上滚放大、向下滚缩小),我是设定每次高度变化为20个像素,然后宽度是成比例变化。需要注意的地方,应该是在图片的最小缩小大小,和图片放大不能超过屏幕范围的限制。同时,为了更好的体验,一定要加上e.stopPropagation(),且返回false,让浏览器不要滚动。

2、修改Lightbox源码使支持Base64图片

    这里说起来可能比较麻烦,先来看一下在使用原生Lightbox时的html代码格式要求:

<a href="img/image.jpg" data-lightbox="test">Image #1</a>

    这是一个最简单的弹出图,当点击Image #1时,就会弹出一个lightbox显示img/image.jpg的内容(弹出一个元素<img src="img/image.jpg" />)。
    现在我们来考虑这种情况,如果图片是以Base64编码在服务器是存放在数据库中的?应该就是这样:

<a href="data:image/png;base64,iVBORw..." data-lightbox="test">Image #1</a>

    问题来了,href长度在IE下是有限制的,一张大的图片,不可能放在href字段中,图片将会被阉割(只显示上半部分)。
    另外还有一种普遍情况,如果我是先显示小图,点击小图看大图,应该就是这样:

<a href="data:image/png;base64,iVBORw..." data-lightbox="test">

    <img src="data:image/png;base64,iVBORw..." />

</a>

    好了,这有两份重复的base64数据,而且都是从服务器端传过来的,耗时耗带宽啊。
    所以我按我的需求进行了改造,代码很简单,修改Lightbox.prototype.start = function($link) {...} 中的子函数addToAlbum:

    function addToAlbum($link) {

        self.album.push({

          // link: $link.attr('href'),

          link: $link.children().attr("src"),

          title: $link.attr('data-title') || $link.attr('title')

        });

    }

    注释掉的部分就是原来的,$link是前面HTML代码中的a标签,改过后addToAlbum函数的作用是:在设置弹出图片的src时,不再从原始的的href中取字符作为弹出img标签的src,而是直接从a标签的子元素中找src属性,由于src属性的长度无限制,所以它不会存在图片截断的问题。 

3、将Lightbox应用到已有的文章

    第2节已经讲到了Lightbox使用时HTML有一定的格式,如果已有的文章中的图片是<img src="img/image.jpg">这样的,则必须对其进行一层封装:

 function initLightbox(){

     var imgs = $(".lightbox-container").find('img');

     $.each(imgs,function(i) {

         var img = $(imgs[i]);

         img.wrap("<a href='' data-lightbox='test' ></a>");        

     });

 }

    其中,“lightbox-container”是文章所在容器的class。initLightbox函数应放置在页面加载ready时,它会把文章中的所有img标签都封装成为lightbox的格式。

本文就写到这了,第2、3点大家可以看自己的使用场景去使用,lightbox改动的重点在于支持滚轮缩放。

附上修改过的lightbox  http://xiazai.3water.com/201412/yuanma/lightbox(3water.com).rar

Javascript 相关文章推荐
IE DOM实现存在的部分问题及解决方法
Jul 25 Javascript
js中匿名函数的N种写法
Sep 08 Javascript
基于jquery自定义图片热区效果
Jul 21 Javascript
jquery二级导航内容均分的原理及实现
Aug 13 Javascript
JS求平均值的小例子
Nov 29 Javascript
node.js中watch机制详解
Nov 17 Javascript
第七章之菜单按钮图标组件
Apr 25 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
May 03 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
Dec 31 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
Apr 18 Javascript
JS中的继承操作实例总结
Jun 06 Javascript
Vue $emit()不能触发父组件方法的原因及解决
Jul 28 Javascript
javascript常用代码段搜集
Dec 04 #Javascript
5种处理js跨域问题方法汇总
Dec 04 #Javascript
用js读、写、删除Cookie代码续篇
Dec 03 #Javascript
js字符串完全替换函数分享
Dec 03 #Javascript
基于jquery实现等比缩放图片
Dec 03 #Javascript
javascript简单实现图片预加载
Dec 03 #Javascript
3种Jquery限制文本框只能输入数字字母的方法
Dec 03 #Javascript
You might like
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
2011/10/22 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
Django 视图层(view)的使用
2018/11/09 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
python中线程和进程有何区别
2020/06/17 Python
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
司机辞职报告范文
2014/01/20 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
财产保全担保书范文
2014/04/01 职场文书
社区娱乐活动方案
2014/08/21 职场文书
演讲稿开场白台词
2014/08/25 职场文书
八年级英语教学计划
2015/01/23 职场文书
公证书格式
2015/01/23 职场文书
实习单位意见
2015/06/04 职场文书
500字作文之关于爸爸
2019/11/14 职场文书
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python