如何让你的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 相关文章推荐
IE6弹出“已终止操作”的解决办法
Nov 27 Javascript
js判断登陆用户名及密码是否为空的简单实例
May 16 Javascript
javascript jquery对form元素的常见操作详解
Jun 12 Javascript
最细致的vue.js基础语法 值得收藏!
Nov 03 Javascript
Node.js中文件操作模块File System的详细介绍
Jan 05 Javascript
jquery表单插件form使用方法详解
Jan 20 Javascript
JS中的数组转变成JSON格式字符串的方法
May 09 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
Aug 15 jQuery
基于JS实现简单滑块拼图游戏
Oct 12 Javascript
vue 弹出遮罩层样式实例
Jul 22 Javascript
antd Select下拉菜单动态添加option里的内容操作
Nov 02 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
Nov 02 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实现文件上传二法
2006/10/09 PHP
一次编写,随处运行
2006/10/09 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
php动态绑定变量的用法
2015/06/16 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
Python实现的批量下载RFC文档
2015/03/10 Python
详解Django中的form库的使用
2015/07/18 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
Python短信轰炸的代码
2020/03/25 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
linux面试题参考答案(5)
2014/09/01 面试题
四年大学生活的个人自我评价
2013/12/11 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python