sina的lightbox效果。


Posted in Javascript onJanuary 09, 2007

使用时,只需要在A标签处加上rel="lightbox"即可。e.g:
<A href=http://image2.sina.com.cn/dy/other/74/U1571P1T74D1184F1625DT20060618123137.jpg rel=lightbox><IMG src=http://image2.sina.com.cn/dy/other/74/U1571P1T74D1184F1625DT20060618123137.jpg height="100" width="100"></A>

我自己也写了一个,不过涉及两个模块,(func.js公用库,和imagesLoader.js图片载入类)过阵子一并发上来。
<STYLE type=text/css>
 HTML #overlay {
 FILTER: Alpha(opacity=50); BACKGROUND-IMAGE: url(images/blank.gif); BACKGROUND-COLOR: #000
}
</STYLE>
<SCRIPT language=javascript type=text/javascript>
<!--//
function addEvent(object, type, handler)
{
 if (object.addEventListener) {
 object.addEventListener(type, handler, false);
 } else if (object.attachEvent) {
 object.attachEvent(['on',type].join(''),handler);
 } else {
 object[['on',type].join('')] = handler;
 }
}
function WindowSize()
{ // window size object
 this.w = 0;
 this.h = 0;
 return this.update();
}
WindowSize.prototype.update = function()
{
 var d = document;
 this.w = 
 (window.innerWidth) ? window.innerWidth
 : (d.documentElement && d.documentElement.clientWidth) ? d.documentElement.clientWidth
 : d.body.clientWidth;
 this.h = 
 (window.innerHeight) ? window.innerHeight
 : (d.documentElement && d.documentElement.clientHeight) ? d.documentElement.clientHeight
 : d.body.clientHeight;
 return this;
};
function PageSize()
{ // page size object
 this.win = new WindowSize();
 this.w = 0;
 this.h = 0;
 return this.update();
}
PageSize.prototype.update = function()
{
 var d = document;
 this.w = 
 (window.innerWidth && window.scrollMaxX) ? window.innerWidth + window.scrollMaxX
 : (d.body.scrollWidth > d.body.offsetWidth) ? d.body.scrollWidth
 : d.body.offsetWidt;
 this.h = 
 (window.innerHeight && window.scrollMaxY) ? window.innerHeight + window.scrollMaxY
 : (d.body.scrollHeight > d.body.offsetHeight) ? d.body.scrollHeight
 : d.body.offsetHeight;
 this.win.update();
 if (this.w < this.win.w) this.w = this.win.w;
 if (this.h < this.win.h) this.h = this.win.h;
 return this;
};
function PagePos()
{ // page position object
 this.x = 0;
 this.y = 0;
 return this.update();
}
PagePos.prototype.update = function()
{
 var d = document;
 this.x =
 (window.pageXOffset) ? window.pageXOffset
 : (d.documentElement && d.documentElement.scrollLeft) ? d.documentElement.scrollLeft
 : (d.body) ? d.body.scrollLeft
 : 0;
 this.y =
 (window.pageYOffset) ? window.pageYOffset
 : (d.documentElement && d.documentElement.scrollTop) ? d.documentElement.scrollTop
 : (d.body) ? d.body.scrollTop
 : 0;
 return this;
};
function UserAgent()
{ // user agent information
 var ua = navigator.userAgent;
 this.isWinIE = this.isMacIE = false;
 this.isGecko = ua.match(/Gecko\//);
 this.isSafari = ua.match(/AppleWebKit/);
 this.isOpera = window.opera;
 if (document.all && !this.isGecko && !this.isSafari && !this.isOpera) {
 this.isWinIE = ua.match(/Win/);
 this.isMacIE = ua.match(/Mac/);
 this.isNewIE = (ua.match(/MSIE 5\.5/) || ua.match(/MSIE 6\.0/));
 }
 return this;
}
// === lightbox ===
function LightBox(option)
{
 var self = this;
 self._imgs = new Array();
 self._wrap = null;
 self._box = null;
 self._open = -1;
 self._page = new PageSize();
 self._pos = new PagePos();
 self._ua = new UserAgent();
 self._expandable = false;
 self._expanded = false;
 self._expand = option.expandimg;
 self._shrink = option.shrinkimg;
 return self._init(option);
}
LightBox.prototype = {
 _init : function(option)
 {
 var self = this;
 var d = document;
 if (!d.getElementsByTagName) return;
 var links = d.getElementsByTagName("a");
 for (var i=0;i<links.length;i++) {
 var anchor = links[i];
 var num = self._imgs.length;
 if (!anchor.getAttribute("href")
 || anchor.getAttribute("rel") != "lightbox") continue;
 // initialize item
 self._imgs[num] = {src:anchor.getAttribute("href"),w:-1,h:-1,title:'',cls:anchor.className};
 if (anchor.getAttribute("title"))
 self._imgs[num].title = anchor.getAttribute("title");
 else if (anchor.firstChild && anchor.firstChild.getAttribute && anchor.firstChild.getAttribute("title"))
 self._imgs[num].title = anchor.firstChild.getAttribute("title");
 anchor.onclick = self._genOpener(num); // set closure to onclick event
 }
 var body = d.getElementsByTagName("body")[0];
 self._wrap = self._createWrapOn(body,option.loadingimg);
 self._box = self._createBoxOn(body,option);
 return self;
 },
 _genOpener : function(num)
 {
 var self = this;
 return function() { self._show(num); return false; }
 },
 _createWrapOn : function(obj,imagePath)
 {
 var self = this;
 if (!obj) return null;
 // create wrapper object, translucent background
 var wrap = document.createElement('div');
 wrap.id = 'overlay';
 with (wrap.style) {
 display = 'none';
 position = 'fixed';
 top = '0px';
 left = '0px';
 zIndex = '50';
 width = '100%';
 height = '100%';
 }
 if (self._ua.isWinIE) wrap.style.position = 'absolute';
 addEvent(wrap,"click",function() { self._close(); });
 obj.appendChild(wrap);
 // create loading image, animated image
 var imag = new Image;
 imag.onload = function() {
 var spin = document.createElement('img');
 spin.id = 'loadingImage';
 spin.src = imag.src;
 spin.style.position = 'relative';
 self._set_cursor(spin);
 addEvent(spin,'click',function() { self._close(); });
 wrap.appendChild(spin);
 imag.onload = function(){};
 };
 if (imagePath != '') imag.src = imagePath;
 return wrap;
 },
 _createBoxOn : function(obj,option)
 {
 var self = this;
 if (!obj) return null;
 // create lightbox object, frame rectangle
 var box = document.createElement('div');
 box.id = 'lightbox';
 with (box.style) {
 display = 'none';
 position = 'absolute';
 zIndex = '60';
 }
 obj.appendChild(box);
 // create image object to display a target image
 var img = document.createElement('img');
 img.id = 'lightboxImage';
 self._set_cursor(img);
 addEvent(img,'click',function(){ self._close(); });
 addEvent(img,'mouseover',function(){ self._show_action(); });
 addEvent(img,'mouseout',function(){ self._hide_action(); });
 box.appendChild(img);
 var zoom = document.createElement('img');
 zoom.id = 'actionImage';
 with (zoom.style) {
 display = 'none';
 position = 'absolute';
 top = '15px';
 left = '15px';
 zIndex = '70';
 }
 self._set_cursor(zoom);
 zoom.src = self._expand;
 addEvent(zoom,'mouseover',function(){ self._show_action(); });
 addEvent(zoom,'click', function() { self._zoom(); });
 box.appendChild(zoom);
 addEvent(window,'resize',function(){ self._set_size(true); });
 // close button
 if (option.closeimg) {
 var btn = document.createElement('img');
 btn.id = 'closeButton';
 with (btn.style) {
 display = 'inline';
 position = 'absolute';
 right = '10px';
 top = '10px';
 width = '15px';
 height = '15px';
 zIndex = '80';
 }
 btn.src = option.closeimg;
 self._set_cursor(btn);
 addEvent(btn,'click',function(){ self._close(); });
 box.appendChild(btn);
 }
 // caption text
 var caption = document.createElement('span');
 caption.id = 'lightboxCaption';
 with (caption.style) {
 display = 'none';
 position = 'absolute';
 zIndex = '80';
 }
 box.appendChild(caption);
 // create effect image
 if (!option.effectpos) option.effectpos = {x:0,y:0};
 else {
 if (option.effectpos.x == '') option.effectpos.x = 0;
 if (option.effectpos.y == '') option.effectpos.y = 0;
 }
 var effect = new Image;
 effect.onload = function() {
 var effectImg = document.createElement('img');
 effectImg.id = 'effectImage';
 effectImg.src = effect.src;
 if (option.effectclass) effectImg.className = option.effectclass;
 with (effectImg.style) {
 position = 'absolute';
 display = 'none';
 left = [option.effectpos.x,'px'].join('');;
 top = [option.effectpos.y,'px'].join('');
 zIndex = '90';
 }
 self._set_cursor(effectImg);
 addEvent(effectImg,'click',function() { effectImg.style.display = 'none'; });
 box.appendChild(effectImg);
 };
 if (option.effectimg != '') effect.src = option.effectimg;
 return box;
 },
 _set_photo_size : function()
 {
 var self = this;
 if (self._open == -1) return;
 var imag = self._box.firstChild;
 var targ = { w:self._page.win.w - 30, h:self._page.win.h - 30 };
 var orig = { w:self._imgs[self._open].w, h:self._imgs[self._open].h };
 // shrink image with the same aspect
 var ratio = 1.0;
 if ((orig.w >= targ.w || orig.h >= targ.h) && orig.h && orig.w)

 ratio = ((targ.w / orig.w) < (targ.h / orig.h)) ? targ.w / orig.w : targ.h / orig.h;
 imag.width = Math.floor(orig.w * ratio);
 imag.height = Math.floor(orig.h * ratio);
 self._expandable = (ratio < 1.0) ? true : false;
 if (self._ua.isWinIE) self._box.style.display = "block";
 self._box.style.top = [self._pos.y + (self._page.win.h - imag.height - 30) / 2,'px'].join('');
 self._box.style.left = [((self._page.win.w - imag.width - 30) / 2),'px'].join('');
 self._show_caption(true);
 },
 _set_size : function(onResize)
 {
 var self = this;
 if (self._open == -1) return;
 self._page.update();
 self._pos.update();
 var spin = self._wrap.firstChild;
 if (spin) {
 var top = (self._page.win.h - spin.height) / 2;
 if (self._wrap.style.position == 'absolute') top += self._pos.y;
 spin.style.top = [top,'px'].join('');
 spin.style.left = [(self._page.win.w - spin.width - 30) / 2,'px'].join('');
 }
 if (self._ua.isWinIE) {
 self._wrap.style.width = [self._page.win.w,'px'].join('');
 self._wrap.style.height = [self._page.h,'px'].join('');
 }
 if (onResize) self._set_photo_size();
 },
 _show_action : function()
 {
 var self = this;
 if (self._open == -1 || !self._expandable) return;
 var obj = document.getElementById('actionImage');
 if (!obj) return;
 obj.src = (self._expanded) ? self._shrink : self._expand;
 obj.style.display = 'inline';
 },
 _hide_action : function()
 {
 var self = this;
 var obj = document.getElementById('actionImage');
 if (obj) obj.style.display = 'none';
 },
 _zoom : function()
 {
 var self = this;
 if (self._expanded) {
 self._set_photo_size();
 self._expanded = false;
 } else if (self._open > -1) {
 var imag = self._box.firstChild;
 self._box.style.top = [self._pos.y,'px'].join('');
 self._box.style.left = '0px';
 imag.width = self._imgs[self._open].w;
 imag.height = self._imgs[self._open].h;
 self._show_caption(false);
 self._expanded = true;
 }
 self._show_action();
 },
 _show_caption : function(enable)
 {
 var self = this;
 var caption = document.getElementById('lightboxCaption');
 if (!caption) return;
 if (caption.innerHTML.length == 0 || !enable) {
 caption.style.display = 'none';
 } else { // now display caption
 var imag = self._box.firstChild;
 with (caption.style) {
 top = [imag.height + 10,'px'].join(''); // 10 is top margin of lightbox
 left = '0px';
 width = [imag.width + 20,'px'].join(''); // 20 is total side margin of lightbox
 height = '1.2em';
 display = 'block';
 }
 }
 },
 _show : function(num)
 {
 var self = this;
 var imag = new Image;
 if (num < 0 || num >= self._imgs.length) return;
 var loading = document.getElementById('loadingImage');
 var caption = document.getElementById('lightboxCaption');
 var effect = document.getElementById('effectImage');
 self._open = num; // set opened image number
 self._set_size(false); // calc and set wrapper size
 self._wrap.style.display = "block";
 if (loading) loading.style.display = 'inline';
 imag.onload = function() {
 if (self._imgs[self._open].w == -1) {
 // store original image width and height
 self._imgs[self._open].w = imag.width;
 self._imgs[self._open].h = imag.height;
 }
 if (effect) {
 effect.style.display = (!effect.className || self._imgs[self._open].cls == effect.className)
 ? 'block' : 'none';
 }
 if (caption) caption.innerHTML = self._imgs[self._open].title;
 self._set_photo_size(); // calc and set lightbox size
 self._hide_action();
 self._box.style.display = "block";
 self._box.firstChild.src = imag.src;
 self._box.firstChild.setAttribute('title',self._imgs[self._open].title);
 if (loading) loading.style.display = 'none';
 };
 self._expandable = false;
 self._expanded = false;
 imag.src = self._imgs[self._open].src;
 },
 _set_cursor : function(obj)
 {
 var self = this;
 if (self._ua.isWinIE && !self._ua.isNewIE) return;
 obj.style.cursor = 'pointer';
 },
 _close : function()
 {
 var self = this;
 self._open = -1;
 self._hide_action();
 self._wrap.style.display = "none";
 self._box.style.display = "none";
 }
};
// === main ===
addEvent(window,"load",function() {
 var lightbox = new LightBox({
 loadingimg:'http://image2.sina.com.cn/dy/news/2006/0618/images/loading.gif',
 expandimg:'http://image2.sina.com.cn/dy/news/2006/0618/images/expand.gif',
 shrinkimg:'http://image2.sina.com.cn/dy/news/2006/0618/images/shrink.gif',
 effectimg:'images/zzoop.gif',
 effectpos:{x:-40,y:-20},
 effectclass:'images/effectable',
 closeimg:'http://image2.sina.com.cn/dy/news/2006/0618/images/close.gif'
 });
});
//-->
</SCRIPT>

 <A href=http://image2.sina.com.cn/dy/other/74/U1571P1T74D1184F1625DT20060618123137.jpg rel=lightbox><IMG src=http://image2.sina.com.cn/dy/other/74/U1571P1T74D1184F1625DT20060618123137.jpg height="100" width="100"></A>
 <a href="http://blog.never-online.net/article.asp?id=83" target="_blank">click here for back点击返回</a>

Javascript 相关文章推荐
解决AJAX中跨域访问出现'没有权限'的错误
Aug 20 Javascript
jquery 添加节点的几种方法介绍
Sep 04 Javascript
框架页面高度自动刷新的Javascript脚本
Nov 01 Javascript
jquery获取当前点击对象的value方法
Feb 28 Javascript
详解JavaScript的回调函数
Nov 20 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
vue2组件实现懒加载浅析
Mar 29 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
vue实现打印功能的两种方法
Sep 07 Javascript
解决vue无法设置滚动位置的问题
Oct 07 Javascript
一个因@click.stop引发的bug的解决
Jan 08 Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
Sep 22 Javascript
JS中简单的实现像C#中using功能(有源码下载)
Jan 09 #Javascript
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 #Javascript
兼容Mozilla必须知道的知识。
Jan 09 #Javascript
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
Jan 09 #Javascript
添加到收藏夹代码(兼容几乎所有的浏览器)
Jan 09 #Javascript
Web版彷 Visual Studio 2003 颜色选择器
Jan 09 #Javascript
一个对于js this关键字的问题
Jan 09 #Javascript
You might like
解决中英文字符串长度问题函数
2007/01/16 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
python中的sort方法使用详解
2014/07/25 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
python魔法方法-自定义序列详解
2016/07/21 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
Python tkinter常用操作代码实例
2020/01/03 Python
利用python进行文件操作
2020/12/04 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
个人求职信范文分享
2013/12/13 职场文书
个人简历中自我评价
2014/02/11 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL
Hive HQL支持2种查询语句风格
2022/06/25 数据库