JavaScript 仿LightBox内容显示效果

近来要做一个LightBox的效果(也有的叫Windows关机效果),不过不用那么复杂,能显示一个内容框就行了。
这个效果很久以前就做过,无非就是一个覆盖全屏的层,加一个内容显示的层。不过showbo教了我position:fixed这个新特性,决定重写一遍。

先看效果:





ps:“定位效果”的意思是屏幕滚动也能固定位置。

程序说明:

要实现一个简单的LightBox效果,主要有两个部分:覆盖层和高亮层。


【跨浏览器的固定定位】

首先要先说说这个东西position:fixed,它的作用是跨浏览器的固定定位。

摘自详解定位与定位应用
“如让一个元素可能随着网页的滚动而不断改变自己在浏览器的位置。而现在我可以通过CSS中的一个定位属性来实现这样的一个效果,这个元素属性就是曾经不被支持的position:fixed; 他的含义就是:固定定位。这个固定与绝对定位很像,唯一不同的是绝对定位是被固定在网页中的某一个位置,而固定定位则是固定在浏览器的视框位置。”

程序中很多地方利用了这个css,ie7、ff都支持这个css,但ie6不支持,程序中只能是在ie6模拟这个效果。

【覆盖层】

覆盖层的作用是把焦点限制在高亮层上,原理是通过一个绝对定位的层(通常使用div),设置它的宽度和高度以致能覆盖整个屏幕(包括缩放和滚动浏览器的情况下),再给它设置一个比较高的zIndex来层叠在原有内容之上(但要比高亮层小),这样用户就只能点到这个层之上的内容了。

如果初始化时没有提供覆盖层对象,程序中会自动创建:

this.Lay = $(this.options.Lay) || document.body.insertBefore(document.createElement("div"), document.body.childNodes[0]);


其中由于document.body.appendChild()导致IE已终止操作bug,所以用了insertBefore。。

【覆盖屏幕】

覆盖层的关键就是如何做到覆盖整个屏幕(锁定整个页面),支持position:fixed的话很简单:

with(this.Lay.style){ display = "none"; zIndex = this.zIndex; left = top = 0; position = "fixed"; width = height = "100%"; }


这样能把浏览器的视框覆盖了,其中使用了fixed样式,这里的意思是定位在浏览器的视框,并100%覆盖。
注意不要理解错为这个层覆盖了整个页面,它只是把浏览器可视的部分覆盖了来达到效果。

ie6不支持怎么办?有几个方法:
1,做一个覆盖视框的层,并在onscroll时相应移动,在onresize时重新设大小;
2,做一个覆盖视框的层,在样式上模拟fixed效果;
3,做一个层覆盖了整个页面的层,并在onresize时重新设大小;
方法1的缺点是滚动时很容易露出马脚,而且不好看;方法2的缺点是需要页面结构的改动和body样式的修改,绝对不是好的架构;而我用的是方法3,有更好的方法欢迎提出。

用这个方法只要把position设为absolute,并使用一个_resize方法来设置width和height即可:

Code


要注意的是scrollHeight和clientHeight的区别(用Height容易测试),顺带还有offsetHeight,手册上的说明:
scrollHeight:Retrieves the scrolling height of the object.
clientHeight:Retrieves the height of the object including padding, but not including margin, border, or scroll bar.
offsetHeight:Retrieves the height of the object relative to the layout or coordinate parent, as specified by the offsetParent property.

我的理解是:
scrollHeight是对象的内容的高度;
clientHeight是对象的可视部分高度;
offsetHeight是clientHeight加上border和滚动条本身高度。

举个例子吧,先说说clientHeight和offsetHeight的区别(在ie7中测试):

测的是外面的div,offsetHeight和clientHeight相差17(分别是83和100),这个相差的就是那个滚动条本身的高度。

再看看clientHeight和scrollHeight的区别(下面是模拟在ie中的情况):


可以看到clientHeight不受内容影响,都是83,即内容有没有超过对象高度都不受影响,但scrollHeight会受内容高度影响,而且从测试可以意识到:
当有滚动条时,覆盖层的高度应该取scrollHeight(内容高度);当没有滚动条时,覆盖层的高度应该取clientHeight(视框高度)。
而恰好两个情况都是取两者中比较大的值,所以就有了以下程序:

Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight) + "px";


设宽度时是不包括滚动条部分的而documentElement一般也没有border,所以不需要offsetWidth。

上面可以看到我用的是documentElement而不是body,手册上是这样说的:
Retrieves a reference to the root node of the document.
意思是整个文档的根节点,其实就是html节点(body的上一级),注意这是在XHTML的标准下。上面可以看到我们取值的对象是整个文档而不只是body,所以这里用documentElement。

要注意的是在window的onresize事件中scrollWidth和clientWidth的值会产生变化,程序中在onresize中使用_resize方法重新设置宽度高度:

if(isIE6){ this._resize(); window.attachEvent("onresize"this._resize); }


【覆盖select】

自定义的层给select遮挡住是一个老问题了,不过可喜的是ie7和ff都已经支持select的zIndex,只要给层设定高的zIndex就能覆盖select了,可惜对于ie6这个问题还是需要解决。

覆盖select据我所知有两个比较好的方法:
1,显示层时,先隐藏select,关闭层时再重新显示;
2,用一个iframe作为层的底,来遮住select。

方法1应该都明白,方法2就是利用iframe可以覆盖select的特性,只要把一个iframe作为层的底部就可以覆盖下面的select了,程序中是这样使用的:

this.Lay.innerHTML = '<iframe style="position:absolute;top:0;left:0;width:100%;height:100%;filter:alpha(opacity=0);"></iframe>'


可以看出这个透明的iframe也以同样覆盖整个页面,如果是有内容显示的页面最好设置z-index:-1;确保iframe在层的底部。

个人觉得使用方法2比较好,但始终是改变了页面结构,有时会比较难控制,至于方法1就比较容易方便。

【高亮层】

高亮层就是用来显示内容的层,没什么看头,所以特意加了些效果在上面,吸引一下眼球。
有兴趣的话可以结合拖放效果渐变效果,做出更好的效果。

【固定定位】

这里“固定定位”的意思是当滚动滚动条时,高亮层依然保持在浏览器对应的位置上,把Fixed设为true就会开启这个效果。

同样对于支持fixed的浏览器很简单,只要把position设为fixed就行了,这个样式本来就是这样使用的,但可怜的ie6只能模拟了。

ie6模拟的原理是在onscroll事件中,不断根据滚动的距离修正top和left。
首先设置position为absolute,要注意的是position要在覆盖层显示之前显示,否则计算覆盖层宽高时会计算偏差(例如把页面撑大)。
再给onscroll事件添加定位函数_fixed来修正滚屏参数:

this.Fixed && window.attachEvent("onscroll"this._fixed);

定位函数_fixed是这样的:

this._fixed = Bind(thisfunction(){ this.Center ? this.SetCenter() : this.SetFixed(); });


可以看出在_fixed中,当设置了居中显示时会执行SetCenter程序(后面会说明),否则就执行SetFixed程序。
先说说SetFixed程序的原理,就是把当前scrollTop减去_top值(上一个scrollTop值)再加上当前的offsetTop,就得到要设置的top值了:

Code


【居中显示】

“居中显示”的意思是高亮层位于视框左右上下居中的位置。
实现这个有两个方法:
1,视框宽度减去高亮层宽度的一半就是居中需要的left值;
2,先设置left值为50%,然后marginLeft设为负的高亮层宽度的一半。

方法1相对方法2需要多一个视框宽度,而且方法2在缩放浏览器时也能保持居中,明显方法2是更好,不过用margin会影响到left和top的计算,必须注意(例如SetFix修正的地方)。这里我选择了方法2,还要注意offsetWidth和offsetHeight需要在高亮层显示之后才能获取,所以定位程序需要放到高亮层显示之后:

Code


其中如果不是固定定位,需要用SetCenter程序来修正滚屏参数,SetCenter程序是这样的:

Code


【比较文档位置】

在ie6当不显示覆盖层时需要另外隐藏select,这里使用了“覆盖select”的方法1,值得留意的是这里加了个select是否在高亮层的判断:

Code


其中Contains程序是这样的:

var Contains = function(a, b){
    
return a.contains ? a != b && a.contains(b) : !!(a.compareDocumentPosition(b) & 16);
}


作用是返回a里面是否包含b,里面用到了两个函数,分别是ie的contains和ff(dom)的compareDocumentPosition。
其中contains手册里是这样写的:
Checks whether the given element is contained within the object.
意思是检测所给对象是否包含在指定对象里面。注意如果所给对象就是指定对象本身也会返回true,虽然这样不太合理。
而ff的compareDocumentPosition功能更强大。

参考Comparing Document Position看下表:
从NodeA.compareDocumentPosition(NodeB)返回的结果:

Bits Number Meaning
000000 0 Elements are identical.
000001 1 The nodes are in different documents (or one is outside of a document).
000010 2 Node B precedes Node A.
000100 4 Node A precedes Node B.
001000 8 Node B contains Node A.
010000 16 Node A contains Node B.
100000 32 For private use by the browser.

从这里可以看出NodeA.compareDocumentPosition(NodeB) & 16的意思是当第5位数是“1”时才返回16,也就是只有NodeA包含NodeB时返回16(&是位与运算)。
ps:为什么不直接a.compareDocumentPosition(b) == 16,我也不清楚。


程序代码:

Code



使用说明:

首先要有一个高亮层:

Code

至于覆盖层一般不需要另外设了,接着就可以实例化一个LightBox:

var box = new LightBox("idBox");


打开和关闭LightBox分别是Show()和Close()方法,

其中LightBox有下面几个属性:
属性:默认值//说明
Over:true,//是否显示覆盖层
Fixed:false,//是否固定定位
Center:false,//是否居中
onShow:function(){}//显示时执行

还有OverLay属性是覆盖层对象,它也有几个属性:
属性:默认值//说明
Lay:null,//覆盖层对象
Color:"#fff",//背景色
Opacity:50,//透明度(0-100)
zIndex:1000//层叠顺序


完整实例下载

转载请注明出处:http://www.cnblogs.com/cloudgamer/

如有任何建议或疑问,欢迎留言讨论。

如果觉得文章不错的话,欢迎点一下右下角的推荐。

对广告有兴趣的也欢迎点一下^_^。

3
0
(请您对文章做出评价)
« 上一篇:JavaScript 渐变效果
» 下一篇:图片切割系统
posted @ 2008-09-15 02:57 cloudgamer 阅读(50550) 评论(163)  编辑 收藏 网摘 所属分类: Javascript

评论共2页: 上一页 1 2 
  回复  引用    
#64楼2008-10-30 14:35 | iamhoo[未注册用户]
太牛了,感觉和你差的不是一个档次!
  回复  引用    
#65楼2008-10-30 14:43 | iamhoo[未注册用户]
太强了,爱你一万年!
  回复  引用  查看    
#66楼[楼主]2008-10-30 20:09 | cloudgamer      
@iamhoo
过奖
谢谢支持

  回复  引用    
#67楼2008-11-04 14:50 | 痕[未注册用户]
好文章。研读
  回复  引用    
#68楼2008-11-12 08:46 | fengdesudu007[未注册用户]
very good 非常感谢分享。你了报答你,我帮你点阿里妈妈的广告。
  回复  引用  查看    
#69楼[楼主]2008-11-12 09:31 | cloudgamer      
@痕
@fengdesudu007
谢谢支持
不过那个广告不是我的是博客园的
呵呵

  回复  引用    
#70楼2008-11-15 23:02 | leahb[未注册用户]
不直接a.compareDocumentPosition(b) == 16 是因为这个是枚举,除了16外还可能同时是 1、4.....都是 2 的平方,& 是 And 运算
  回复  引用    
#71楼2008-11-15 23:05 | leahb[未注册用户]
准确说 offsetHeight 是元素自身高,包括边框。对于 document.documentElement.offsetHeight==document.documentElement.scrollHeight
  回复  引用  查看    
#72楼[楼主]2008-11-16 00:20 | cloudgamer      
@leahb
我想你误会了
x可能0 1 2 4 8 16 32 其中一个
不管x是哪个值在!!(x & 16) 和 x==16运算结果都是相同的
所以我说为什么不用x==16这样更直观的方法

document.documentElement.offsetHeight==document.documentElement.scrollHeight
这个貌似不是吧
你新建一个文档alert看看就知道了
offsetHeight 是元素自身高
scrollHeight是内容高度
要弄清楚哦

  回复  引用    
#73楼2008-11-17 01:29 | leahb[未注册用户]
@cloudgamer
你不是学过 ASP.NET 那应该知道枚举,通常的枚举是 0 1 2 3 4...这样的枚举变量只能有一个值,要嘛是 1 要嘛是 2。
其中有一种叫做标志枚举,或组合枚举。也就是枚举变量可能是多个枚举值的组合。例如 var e=4 & 16=20

十进制 二进制
4 0000 0100
& 16 0001 0000
---------------
20 0001 0100

这种情况下,通过 if(e==16) 是无法判定是否含枚举值16
只能使用 if((e & 16)==16)

一般 <HTML> 不会有边框,我都是通用的

对付 select 还可以禁用

  回复  引用    
#74楼2008-11-17 01:40 | leahb[未注册用户]
从你这学到 onlosecapture 还没搞清楚
  回复  引用  查看    
#75楼[楼主]2008-11-17 08:39 | cloudgamer      
@leahb
4&16是0哦
compareDocumentPosition返回的是一个整数并不是组合哦
这些你先弄清楚吧

至于offsetHeight和scrollHeight 不是边框问题
而是两个根本不同的哦
你可以运行这个看看
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<body>
<script>
alert(document.documentElement.offsetHeight+"_"+document.documentElement.scrollHeight)
</script>
</body>
</html>

我想还是你自己先测试一下再讨论吧

  回复  引用    
#76楼2008-11-17 19:11 | Livetime[未注册用户]
代码很漂亮,佩服
  回复  引用  查看    
#77楼2008-11-17 19:16 | slive      

  回复  引用    
#78楼2008-11-21 03:49 | cqtank[未注册用户]
非常谢谢楼主的分享,写的这么详细,非常感谢
  回复  引用    
#79楼2008-11-24 12:06 | li套[未注册用户]
楼主什么时候把 拖动 功能给去掉了? 以前的那那版本忘了 哪里去了 现在在来下载 却 没了那版本了哦
  回复  引用    
#80楼2008-11-24 13:26 | 黄先生[未注册用户]
晕,原来是去掉了拖动功能,我在网上找到的拖动功能的,刚开始我还以为是别人加强了的版本呢,原来官方的是去掉了,拖动很实用,希望楼主尽快补上,关注中。
  回复  引用  查看    
#81楼[楼主]2008-11-24 13:51 | cloudgamer      
@Livetime
@slive
@cqtank
谢谢支持

@li套
@黄先生

那好我加上吧

  回复  引用    
#82楼2008-11-25 10:42 | @li套 [未注册用户]
是啊 楼主还是 加上吧, 虽然你把它玻璃单独写了个 关于drag的 , 那篇文章也写得不错, 但是这个作品把它剥离出去了就显得有点缺憾了, 你这个作品对我是影响很大的, 哈哈。从你这个作品我学会了 protoytpe 方式的 oop编程, 呵呵, 谢谢先,一直都关注你
  回复  引用  查看    
#83楼[楼主]2008-11-25 10:52 | cloudgamer      
@@li套
呵呵
谢谢支持
一起加油!

  回复  引用    
#84楼2008-11-25 10:53 | @li套 [未注册用户]
另外 , 楼主 可以做下 关于 drop 的 效果么。拖div过去,放到另外个div上面的是 触发个事件,松开鼠标的时候又触发个事件,比如 两个div a 和b
都背景为红色,拖动a 接触到b 的时候, 两个div背景都变为蓝色,在a和b有接触的时候松开鼠标,两个div都变为绿色, 这样的效果 很实用的, 呵呵 期待楼主的 这一大作

  回复  引用  查看    
#85楼[楼主]2008-11-25 11:35 | cloudgamer      
@@li套
我想你说的这个主要还是在接触判断上
这个用坐标计算比较一下就可以了
你也可以做做看哦
其实效果的话jQuery等都能做出比我好的多的了
我这里主要还是介绍一些原理和技巧吧

  回复  引用    
#86楼2008-11-25 19:57 | li套[未注册用户]
Function.prototype.bind = function(object) {
var __method = this, args = Array.apply(null, arguments); args.shift();
return function() {
return __method.apply(object, args);
}
}
楼主,你这个存在个很大的bug 比如 当你的页面有2000px 高, 而你的按钮是在最下面, 你打开页面, 吧滚动条拉下来,然后点击弹出 框, 你会发现问题 你的框不知道哪里去了。 我跟踪了下。 你代码里面的 _fixed: function(){}是问题所在, 还望解答!

  回复  引用    
#87楼2008-11-26 10:02 | li套[未注册用户]
2008-09-16 08:50 | Taox
对了,设置拖放时候,在ie6中有bug, 页面会变得很长,而box在页面最底...

这个问题我有解决

下面这一块 修改为主要就ok了
//如果设置了容器,因为容器大小可能会变化所以每次都要设
if(!!this.mxContainer){
this.mxLeft = 0;
this.mxTop=this.mxContainer.scrollTop; //modify by brian
this.mxRight = this.mxContainer.clientWidth;
this.mxBottom = this.mxContainer.clientHeight+this.mxContainer.scrollTop;
}

  回复  引用  查看    
#88楼[楼主]2008-11-26 17:47 | cloudgamer      
@li套
谢谢你的发现
等会我就修正它

  回复  引用    
#89楼2008-11-26 19:03 | li套[未注册用户]
回复 引用 查看 2008-11-26 17:47 | cloudgamer
@li套
谢谢你的发现
等会我就修正它

呵呵 ,期待啊, 这个 我 是 搞了一天没搞好,,,

关键的问题是你滚动一下 滚轮,,,,
var iTop = document.documentElement.scrollTop - this._top + this.Box.offsetTop
这个里面的 this.Box.offsetTop 出现了 很变态的问题。无法理解的成倍的增加,你debugger 这里调试下。 想不通是为什么?

  回复  引用    
#90楼2008-11-26 19:04 | li套[未注册用户]
上面的代码是在 _fixed: function(){ 这个方法中
  回复  引用  查看    
#91楼[楼主]2008-11-26 22:35 | cloudgamer      
@li套
我已经把修正的程序放在测试实例中
你下载测试一下吧
谢谢

  回复  引用    
#92楼2008-11-27 11:12 | li套[未注册用户]
好了,问题解决,, 可以说下之前的那是么滴原因么, 望讲解一下。 最后还是希望阁下能 把之前的 有带拖动的功能补上。 就完美了。
  回复  引用  查看    
#93楼[楼主]2008-11-27 11:43 | cloudgamer      
@li套
修正后的程序已经上传
欢迎测试
原因我也没详细看,大概是定位计算滚屏时margin的计算错误
至于拖动的部分我考虑了一下,还是留给大家自己研究吧
动手才是我想给大家的

  回复  引用    
#94楼2008-11-27 13:01 | li套[未注册用户]
哈哈,也有道理,,,,
好像没什么问题了, 很好很强大

  回复  引用  查看    
#95楼[楼主]2008-11-27 14:27 | cloudgamer      
@li套
呵呵
欢迎测试
一起加油

  回复  引用    
#96楼2008-11-30 02:43 | tvrcgo[未注册用户]
看到一个说得最详细的了 谢了 终于解决
  回复  引用    
#97楼2008-12-04 17:06 | faks[未注册用户]
好像很占内存啊 ,点击“打开”按钮后将近吃掉200M的内存了!
  回复  引用  查看    
#98楼[楼主]2008-12-04 17:50 | cloudgamer      
@tvrcgo
谢谢支持

@faks
你可以下载实例试试
不会那么多的

  回复  引用    
#99楼2008-12-19 16:48 | zc_0101[未注册用户]
楼主场面,赞一个!
  回复  引用    
#100楼2008-12-25 14:31 | 慢慢慢[未注册用户]
在遨游下提示框居中,并且存在滚屏的时候,如果提示框里面有a标签,则第一次打开的时候没问题,关闭后随便用鼠标中键上下滚一下,然后再打开的时候就会出错,楼主能帮忙看一下是什么问题吗?谢谢
  回复  引用  查看    
#101楼[楼主]2008-12-25 16:05 | cloudgamer      
@zc_0101
谢谢

@慢慢慢
是定位居中的时候吗?ie6?
能把你的程序发给我吗

  回复  引用    
#102楼2008-12-25 16:21 | 慢慢慢[未注册用户]
@cloudgamer
this.Box.offsetHeight
this.Box.offsetWidth
在遨游1.6.2下 第一次打开浮层时没问题,然后随便上下滚动鼠标中键,然后关闭浮层,之后再打开时这两个值就取不到了,所以就出错了
我加你qq了 你没理我

  回复  引用    
#103楼2008-12-25 16:30 | 慢慢慢[未注册用户]
@cloudgamer
满足下面的情况的时候会出现问题
1,不是定位,只是居中
2,浮层里有a标签
3,遨游1.6.2版本,(遨游2没问题,2以下其他版本没测)
4,第一次打开浮层,然后随便上下滚动鼠标中键,然后关闭浮层,之后再打开(有时需多重复几次)时
this.Box.offsetHeight
this.Box.offsetWidth
这两个值就取不到了

程序代码这里发不了

  回复  引用    
#104楼2008-12-25 16:40 | 慢慢慢[未注册用户]
部分代码:
<BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR><a href="javascript:aaa();">1111111111111</a><BR><BR>
<div id="floatdiv">
<h3><span onclick="fl_box.Close();">关闭</span></h3>
ddddd<a href="http://ddd.ddd">ddd</a>ddddddd
</div>
var fl_box = new LightBox("floatdiv",{Center:true});
function aaa(){
fl_box.Show();
}

  回复  引用    
#105楼2008-12-25 16:42 | 慢慢慢[未注册用户]
当然,非常感谢楼主的程序,昨天从你发的第一篇看,楼主的代码非常不错
  回复  引用  查看    
#106楼[楼主]2008-12-25 16:50 | cloudgamer      
@慢慢慢
谢谢支持
你可以发邮件嘛
如果仅仅是浮层里有a标签 遨游1.6.2版本这样的条件的话
我想还是算了,opera我都没测不要说遨游1.6.2版了

  回复  引用  查看    
#107楼2009-01-15 11:03 | peace      
支持下
  回复  引用    
#108楼2009-01-27 01:28 | b[未注册用户]
请问能否添加两个关闭按钮,怎么添加不冲突
  回复  引用  查看    
#109楼[楼主]2009-01-27 22:52 | cloudgamer      
@peace
谢谢支持

@b
把box.Close();写到onclick里面就行

  回复  引用    
#110楼2009-02-04 02:52 | b[未注册用户]
博主添加多个按钮,打开不同的层怎么修改?能否做个实例谢谢
  回复  引用  查看    
#111楼[楼主]2009-02-04 08:18 | cloudgamer      
@b
你new多个实例
调用各个实例的Close()就行了

  回复  引用    
#112楼2009-02-04 09:41 | b[未注册用户]

我这样写还是有一个不能调用
<dl id="idBox" class="lightbox">
<dt id="idBoxHead"><b>custom request Message</b></dt>
<input name="" type="button" value=" 关闭 " id="idBoxCancel" />
</dl>


<div id="idOverlay"></div>
<input name="" type="button" value=" mail to us " id="idBoxOpen" />
</div>



<dl id="idBox1" class="lightbox">
<dt id="idBoxHead1"><b>herehere</b></dt>
<input name="new" type="button" value=" 关闭 " id="idBoxCancel1" />
</dl>


<div id="idOverlay1"></div>
<input name="new" type="button" value=" mail to us " id="idBoxOpen1" />
</div>



<script>

var box = new LightBox("idBox", "idOverlay", { Center: true });
box.OverLay.Color = "#000";
box.OverLay.Opacity = 50;
box.Center = false;
var drag = new Drag("idBox", "idBoxHead", { mxContainer: document.documentElement, Lock: true });
$("idBoxCancel").onclick = function(){ box.Close(); }
$("idBoxOpen").onclick = function(){ box.Show(); }
$("idEffect").onchange = function(){
box.Close();
switch (parseInt(this.value)) {
case 4 :
box.Fixed = true;
drag.Lock = true;
drag.Limit = false;
break;
case 2 :
box.Fixed = false;
drag.Lock = false;
drag.Limit = false;
break;
case 6 :
box.Fixed = true;;
drag.Lock = false;
drag.Limit = true;
break;
case 0 :
default :
box.Fixed = false;
drag.Lock = true;
drag.Limit = false;
}
}




var box1 = new LightBox("idBox1", "idOverlay1", { Center: true });
box1.OverLay.Color = "#000";
box1.OverLay.Opacity = 50;
box1.Center = false;
var drag = new Drag("idBox1", "idBoxHead1", { mxContainer: document.documentElement, Lock: true });
$("idBoxCancel1").onclick = function(){ box1.Close(); }
$("idBoxOpen1").onclick = function(){ box1.Show(); }
$("idEffect1").onchange = function(){
box1.Close();
switch (parseInt(this.value)) {
case 4 :
box1.Fixed = true;
drag.Lock = true;
drag.Limit = false;
break;
case 2 :
box1.Fixed = false;
drag.Lock = false;
drag.Limit = false;
break;
case 6 :
box1.Fixed = true;;
drag.Lock = false;
drag.Limit = true;
break;
case 0 :
default :
box1.Fixed = false;
drag.Lock = true;
drag.Limit = false;
}
}
</script>

  回复  引用  查看    
#113楼[楼主]2009-02-04 11:09 | cloudgamer      
@b
你下面的drag没有改名
你再仔细看一下吧

  回复  引用    
#114楼2009-03-03 22:50 | bestfc[未注册用户]
不知道博主在不在
我比较菜,刚花了一个小时左右的时间研究你的代码
有点成果,把.lightbox的CSS封装进了你的代码

不过问题是如果有多个地方要弹出这样的窗体的话,除了每一个DIV都绑定外,有没有其它的办法

还有就是最好把关闭事件也封装一下,像那个lightbox一样,可以自由选择自己关闭还是用自带的关闭事件

  回复  引用  查看    
#115楼[楼主]2009-03-03 23:37 | cloudgamer      
@bestfc
你可以按自己的要求写一个出来,这样会有更多成果

  回复  引用  查看    
#116楼2009-03-05 08:08 | 笨笨真笨      
JQuery就可以实现的,而且效果很好,也没有跨浏览器问题!
  回复  引用  查看    
#117楼[楼主]2009-03-05 08:21 | cloudgamer      
@笨笨真笨
如果是直接拿来用的话,那当然有更多更好的

  回复  引用    
#118楼2009-03-06 11:36 | 不错[未注册用户]
不错
  回复  引用    
#119楼2009-03-17 22:56 | zhouxunyou[未注册用户]
想请教楼主。这段代码是不是与JQuery不兼容,我将这段代码加入到我的工程中后。JQuery就失效了
  回复  引用  查看    
#120楼[楼主]2009-03-18 08:23 | cloudgamer      
@不错
@zhouxunyou
谢谢支持
不兼容是因为有同名函数$
你替换一下就可以了

  回复  引用    
#121楼2009-04-02 11:09 | Leeo[未注册用户]
DISCUZ!中是用iframe来解决的,而且可以跟Ajax结合,监听iframe的onload事件,我觉得很完美。详细可以看DISCUZ! 7.0 JS代码中的floatWin。我觉得一个功能就应该只完成自己分内的事情,如果一个漂浮层(还是LightBox)的显示还要去控制其他select的显示我觉得不合理,一个功能写的好不好除了浏览器的兼容,还要每个页面通用,如果漂浮层(或者LightBox)本身里面还有select呢?如果其他页面不想去掉所有的select呢?如果还有其他如果?
  回复  引用  查看    
#122楼[楼主]2009-04-02 11:29 | cloudgamer      
@Leeo
你说的是覆盖select?
不知你有没有看到我是分别用了两个方法的
iframe和隐藏select我这里都演示了应用方法
主要还是想告诉大家这两个方法具体是怎么应用的然后根据自己的情况再灵活应用
而且你说的去掉select的问题我在比较文档位置中也有提及
我不是想大家用死这个程序而是要大家灵活运用

  回复  引用    
#123楼2009-04-16 14:55 | sosoyou[未注册用户]
楼主您好,您说“当没有滚动条时,覆盖层的高度应该取clientHeight(视框高度)。”,可是我测试的结果是当没有滚动条时,clientHeight和scrollHeight一样大,所以我认为不管有没有滚动条,都取scrollHeight即可,不知道我的理解对不对,希望您解答一下
  回复  引用  查看    
#124楼[楼主]2009-04-16 15:09 | cloudgamer      
@sosoyou
你没看到我那里的例子吧
“再看看clientHeight和scrollHeight的区别(下面是模拟在ie中的情况):”
你可以试试这里后面那个没有滚动条的例子
看看是不是一样

  回复  引用  查看    
#125楼2009-04-17 16:47 | 一叶工作室      
楼主,你的代码和JQUERY 1.3 会产生冲突!
  回复  引用  查看    
#126楼[楼主]2009-04-17 16:53 | cloudgamer      
@一叶工作室
那是因为我用了$
你替换成其他东西就行了

  回复  引用    
#127楼2009-04-27 00:28 | tttokk[未注册用户]
如果能把弹出内容能在JS里面自义定,那就很完美了。
  回复  引用  查看    
#128楼[楼主]2009-04-27 08:23 | cloudgamer      
@tttokk
那也很简单
你把html用document.write输出就行了

  回复  引用    
#129楼2009-04-27 17:14 | dovery[未注册用户]
请问能不能弄成QQ空间登录那样的效果呢,登录成功后能刷新页面!显示我的登录信息!
  回复  引用  查看    
#130楼[楼主]2009-04-27 17:16 | cloudgamer      
@dovery
登录成功这个要用无刷新实现
跟这个效果关系不大了

  回复  引用    
#131楼2009-05-19 17:42 | haiyang
我找了好多代码 这个是我认为最好的 虽然我很菜
我不愿意用JQ等现成的代码主要的原因就是学不到东西!

首先得说这个做的很棒,楼主辛苦!
其次我想提提我个人的意见,比如:
1、当我把 DIV 设置成 width:1500px; height:1500px; 拖动一下滚动条就会发现不自动跟着走!
2、在IE7 下 当我缩小屏幕宽度的时候 (背景颜色我设置成#000)会出现一闪一闪的效果 看了雅虎的 没这样

希望多加改进 再次感谢!

  回复  引用  查看    
#132楼[楼主]2009-05-19 19:35 | cloudgamer      
@haiyang
你提的问题有时间我会好好测试的
谢谢关注

  回复  引用    
#133楼2009-05-30 10:59 | aaa123[未注册用户]
博客园搜一下 仿Lightbox 怎么这么多谁是原创?
  回复  引用  查看    
#134楼[楼主]2009-05-30 11:11 | cloudgamer      
@aaa123
其他不清楚
这篇确实是原创

  回复  引用  查看    
#135楼2009-06-08 09:31 | wtcsy      
如果有一个dialog类 一个LightBox类
如果做一个alert框 一个confirm框
似乎在删除的时候 不大知到底该删除哪个东西!!~ 请指教下 嘿嘿!!

  回复  引用  查看    
#136楼[楼主]2009-06-08 11:21 | cloudgamer      
@wtcsy
删除?什么意思

  回复  引用  查看    
#137楼2009-06-08 12:21 | wtcsy      
这个不好描述
不如看代码吧 嘿嘿 发送到你的邮箱

  回复  引用    
#138楼2009-07-01 15:23 | qw2009[未注册用户]
紧急!!

被覆盖的背景层里仍然可以响应tab键,

  回复  引用  查看    
#139楼[楼主]2009-07-01 15:26 | cloudgamer      
@qw2009
这个我是没考虑
那就onkeydown的时候判断一下试试

  回复  引用    
#140楼2009-07-01 16:04 | qw2009[未注册用户]
onkeydown是可以的,但是会onfocus到第一个元素上
  回复  引用  查看    
#141楼[楼主]2009-07-01 16:14 | cloudgamer      
@qw2009
那就想一个办法取消focus
或者focus到其他元素上例如高亮层上

  回复  引用    
#142楼2009-07-02 10:01 | qw2009[未注册用户]
谢谢 cloudgamer

可以请教你一个问题吗,是关于JQuery兼容IE6.0的
像类似下面的代码
$(function() {
$('#exec')
.hover(
function(){
$(this).addClass("ui-state-active");
},
function(){
$(this).removeClass("ui-state-active");
}
).mousedown(function(){
$(this).addClass("ui-state-active");
})
.mouseup(function(){
$(this).removeClass("ui-state-active");
});
$('#logout')
.hover(
function(){
$(this).addClass("ui-state-active");
},
function(){
$(this).removeClass("ui-state-active");
}
).mousedown(function(){
$(this).addClass("ui-state-active");
})
.mouseup(function(){
$(this).removeClass("ui-state-active");
});
});

在IE6.0中总是javascript出错

  回复  引用  查看    
#143楼[楼主]2009-07-02 10:10 | cloudgamer      
@qw2009
这个你自己调试吧
或者去论坛问问

  回复  引用  查看    
#144楼2009-07-07 17:44 | Funly      
绝对绝对是个好东西!
  回复  引用    
#145楼2009-07-19 00:30 | sajhsa[未注册用户]
但能不能屏蔽f5,和后退键,除非点击到关闭按钮才行呢?
  回复  引用  查看    
#146楼[楼主]2009-07-19 01:34 | cloudgamer      
@sajhsa
这些你可以自己扩展

@Funly
谢谢支持


  回复  引用    
#147楼2009-08-02 17:31 | 白羽霓[未注册用户]
楼主厉害!谢谢!
  回复  引用    
#148楼2009-08-07 13:24 | 9[未注册用户]
东西做的不错,尤其讲解很赞

最近正好要用到OverLay,就用了你这个封装的
一用问题就来了,OverLay显示出来并没有覆盖内容,
而是在全部内容前面加了一个很大overLay
内容并没有覆盖进去( IE7下 )

查了一下发现如果改
with(this.Lay.style) {
display = "none"; zIndex = this.zIndex; left = top = 0; position = "fixed"; width = height = "100%";
}
里面的 fixed改成 absolute就ok

后来又发现还有不同是你这里用了DOCTYPE,如果不用的话显示的效果ie7下就完全两回事,而我原来的页面如果加了这个DOCTYPE,css也要改很多

希望博主能考虑一下这个问题,毕竟很多懒人一开始也不一定都会加DOCTYPE

  回复  引用  查看    
#149楼[楼主]2009-08-07 14:03 | cloudgamer      
@9
如果dtd也考虑的话那就太大工程了

@白羽霓
谢谢支持


  回复  引用  查看    
#150楼2009-09-18 12:00 | 嫼、妞      
正需要呢,谢谢楼主提供。
只是还有些不大明白。。

  回复  引用    
#151楼2009-09-19 11:20 | studyer[未注册用户]
楼主,看了你的其余讲解都懂了,很清晰...
但现在有一处讲的比较粗..理解不了.就是box居中
//居中
if(this.Center){
this.Box.style.top = this.Box.style.left = "50%";
//设置margin
if(this.Fixed){
this.Box.style.marginTop = - this.Box.offsetHeight / 2 + "px";
this.Box.style.marginLeft = - this.Box.offsetWidth / 2 + "px";
}else{
this.SetCenter();
}
}

这个为什么this.Fixed 还要判断下 然后还要修正SetCenter?
不能用一个SetCenter?

  回复  引用  查看    
#152楼[楼主]2009-09-19 14:07 | cloudgamer      
@嫼、妞
有什么问题可以留言讨论

  回复  引用  查看    
#153楼[楼主]2009-09-19 14:08 | cloudgamer      
@studyer
因为还要分定位居中和不是定位的居中

  回复  引用    
#154楼2009-11-03 11:56 | bond[未注册用户]
请问我的页面由多个frame组成,怎么用覆盖层将其他frame也覆盖掉?
  回复  引用  查看    
#155楼[楼主]2009-11-03 11:57 | cloudgamer      
@bond
如果是iframe可以覆盖
frame的话是不能夸框架的除非是在top页面

  回复  引用    
#156楼2009-11-10 16:20 | 厦门Glint[未注册用户]
怎么这么历害啊//我什么也看不懂啊//给我一个详细的讲解好吗?/最后想说的是.真历害
  回复  引用  查看    
#157楼[楼主]2009-11-10 17:17 | cloudgamer      
@厦门Glint
我觉得够详细了
呵呵

  回复  引用    
#158楼2009-11-24 16:49 | FeeLiN[未注册用户]
看了一下,代码非常不错(貌似来晚了)
但是ie6下window.onresize的bug还是存在
就是放大浏览器窗口时,onresize里的事件能正常执行,缩小浏览器窗口时onresize里的事件就不执行了(也有可能偶尔执行),这样你的遮罩大小就不能正常计算了。
不知道博主发现这个问题没?
我一般用setTimeout(fn,0)来解决,但是我有几个程序都包含了onresize事件,如果都用setTimeout(fn,0),结果还是一样,无法正常延时执行。
有什么好办法能解决吗?

  回复  引用  查看    
#159楼[楼主]2009-11-24 19:11 | cloudgamer      
@FeeLiN
可能是 缩小时窗口已经 有遮罩那么大了所以没缩回去
你研究到的话告诉我吧
暂时没时间研究呢

  回复  引用    
#160楼2009-11-25 09:56 | FeeLiN[未注册用户]
现在发现用以下方法可以解决
计算遮罩大小时先隐藏遮罩,this.Lay.style.display="none";
大小调整完毕再 this.Lay.style.display="block";
然后setTimeout(fn,0),如果onresize事件里绑定了多个函数,就setTimeout(fn,x),x是大于0的值,具体多大就得看情况了,我这里设成1就可以了,没再出现遮罩大小无法正常计算的问题。

但是新的问题又来了,还是IE下可恶的onresize
我发现IE下的onresize不仅仅代表改变浏览器大小
比如页面上有个可以伸缩的div(一般是伸缩的广告),展开div的时候整个页面会下移(反之上移),此时在IE下竟然执行了onresize事件,我晕死!

显然造成的结果就是遮罩在不停的闪,并且奇卡无比,实在没辙了~~~~~~~~

  回复  引用  查看    
#161楼[楼主]2009-11-25 10:01 | cloudgamer      
@FeeLiN
那是body的resize引起的
以前遇到过能解决的不过忘记了
你找找吧

  回复  引用    
#162楼2009-11-25 10:17 | FeeLiN[未注册用户]
好吧,我找找看
  回复  引用  查看    
#163楼2010-01-09 17:34 | 小皇帝      
好,学习!
评论共2页: 上一页 1 2