JavaScript 仿LightBox内容显示效果

相关推荐:AlertBox 弹出层(信息提示框)效果

 

近来要做一个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/

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

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

程序中包含的js工具库CJL.0.1.min.js,原文在这里

posted @ 2008-09-15 02:57 cloudgamer 阅读(115522) 评论(252) 编辑 收藏

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

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

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

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

 回复 引用   
#159楼 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事件,我晕死!

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

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

 回复 引用   
#161楼 2009-11-25 10:17 FeeLiN[未注册用户]
好吧,我找找看
 回复 引用 查看   
#162楼 2010-01-09 17:34 小皇帝      
好,学习!
 回复 引用 查看   
#163楼 2010-03-01 09:39 长河落日      
学习!
 回复 引用 查看   
#164楼[楼主] 2010-03-06 13:40 cloudgamer      
@长河落日
@小皇帝
一起学习!

 回复 引用   
#165楼 2010-03-16 17:59 denisdeng[未注册用户]
博主的文章写得不错,学习了。
 回复 引用 查看   
#166楼 2010-04-18 19:30 Love_JavaScript      
Extend(this.options, options || {});
这句前面加句
if (!options) return;
会不会好点呢

 回复 引用 查看   
#167楼[楼主] 2010-04-18 21:29 cloudgamer      
@denisdeng
谢谢支持

 回复 引用 查看   
#168楼[楼主] 2010-04-18 21:30 cloudgamer      
@Love_JavaScript
也可以啊
不过我已经习惯了这样的

 回复 引用   
#169楼 2010-04-21 12:53 碧海金沙[未注册用户]
IE6中,第一次弹出的位置中不对,第二次就正常了,不知是什么原因:
//兼容ie6的居中定位程序
SetCenter: function(){
this.Box.style.marginTop = document.documentElement.scrollTop - this.Box.offsetHeight / 2 + "px";
this.Box.style.marginLeft = document.documentElement.scrollLeft - this.Box.offsetWidth / 2 + "px";
//加上这两句第一次弹出的位置就对了
//alert(this.Box.style.marginTop);
//alert(this.Box.style.marginLeft);
},

我调用的代码:
<style>
.lightbox{width:600px;background:#FFFFFF;border:1px solid #ccc;line-height:25px; top:20%; left:20%;}
.lightbox dt{background:#f4f4f4; padding:5px;}
</style>
<dl id="idBox" class="lightbox">
<dt id="idBoxHead" style='font-weight:bold;font-size:10.5pt'></dt>
<dd>
<table width=500 cellpadding=2 cellspacing=0 border=0>
<tr><td id=showzjcontent></td></tr>
<tr><td align=center><input name="" type="button" value=" 关闭 " id="idBoxCancel"></td></tr>
</table>
</dd>
</dl>

var box = new LightBox("idBox");
box.OverLay.Color = "#000";
box.Center = true;
$("idBoxCancel").onclick = function(){ box.Close(); }
function showcompany(userid)
{
$('idBoxHead').innerText='企业资料';
ajax.get("...",
function(obj) {
$('showzjcontent').innerHTML=obj.responseText;
}
);
box.Show();
}

 回复 引用 查看   
#170楼[楼主] 2010-04-21 13:47 cloudgamer      
@碧海金沙
ajax.get("...",
function(obj) {
$('showzjcontent').innerHTML=obj.responseText;
box.Show();
}
);
这样试试

 回复 引用   
#171楼 2010-04-21 14:17 碧海金沙[未注册用户]
真为你敬业的精神感动,问题果然解决!
但是,为什么呢?

 回复 引用 查看   
#172楼[楼主] 2010-04-21 14:55 cloudgamer      
@碧海金沙
因为你用ajax获取数据会有一个延迟
innerHTML就会在box.Show之后执行定位就不准确了

 回复 引用   
#173楼 2010-04-26 22:47 ayin[未注册用户]
希望能进行无污染封装。。。。

现在的封装程序还不够啊。比如在类的外部定义像这样的代码:
var isIE = (document.all) ? true : false;
希望能封装到类的内部去,这样方便使用,也不会与其他封装类的变量名相冲突了。。

唉。。我水平有限,只能在这里说说了。。。希望楼主能采纳。。。

 回复 引用 查看   
#174楼[楼主] 2010-04-26 23:08 cloudgamer      
@ayin
那时候还没有自己的工具库
以后更新会使用的

 回复 引用   
#175楼 2010-05-23 17:12 哟哟西[未注册用户]
讲得好,很全面,谢谢啊
 回复 引用   
#176楼 2010-06-29 09:55 tzfox[未注册用户]
LZ,将代码移植后修改$符号,在firefox状态下可以正确执行,但是在ie7下仍然要跟jQuery冲突。。。
 回复 引用 查看   
#177楼[楼主] 2010-06-30 10:03 cloudgamer      
@哟哟西
谢谢支持

 回复 引用 查看   
#178楼[楼主] 2010-06-30 10:04 cloudgamer      
@tzfox
应该不会吧
博客中也有jq你可以参考一下博客中的代码

 回复 引用 查看   
#179楼 2010-07-01 19:26 卡内基      
你好,我有个问题想请教您,如果我用的是框架怎么办?
<div>
<div id="leftdiv"></div>
<div id="splitdiv"></div>
<div id="rightdiv" style="border-left:1px #9f9d9f solid; ">
<iframe src="2.html" name="modulePanel" scrolling="no" id="modulePanel" width="100%" height="100%" frameborder="0" onload="javascript:changewin()" >
</iframe>
</div>
</div>

在这个里面,iframe里要弹出遮罩层,并且遮罩父页面,我自己写了个方法在父页面也用一个div来做遮罩层,就是在iframe弹出层的时候,随便调用父页面的js,来模拟全部遮罩,这里就有一个问题就是颜色不一样,父页面会的z-index,会遮罩住iframe弹出的层,如果你把父页面遮罩层的z-index调为-1,好像有些又遮不住。。
所以我想问问博主有没有什么好办法,解决这个问题。。

麻烦博主了。谢谢。。

 回复 引用 查看   
#180楼[楼主] 2010-07-01 21:10 cloudgamer      
@卡内基
看的不太明白
或者你email代码给我看看吧

 回复 引用 查看   
#181楼 2010-07-02 15:12 卡内基      
博主,我已经将代码发到您的邮箱里了,请查收,
我的e-mail:wangao2006@126.com
麻烦了。。

 回复 引用 查看   
#182楼[楼主] 2010-07-03 14:08 cloudgamer      
@卡内基
回复了

 回复 引用 查看   
#183楼 2010-07-05 16:03 卡内基      
非常感谢博主,对我提的问题给予回答,可能是我没有表达清楚问题,博主不好意思啊!!
我的需求是 弹出遮罩效果可以遮罩全屏,并把需要的结果填充到文本框中,
博主给的解决方法是把遮罩层放在主页里,那这样可以遮罩全屏,但在遮罩层中选择的数据,怎么填充到iframe的页面里呢?
使用说明:
通过点击按钮显示,弹出遮罩层,之后再遮罩层中选择需要的数据,之后填充到文本框中..


博主,我把代码重新写了,补充完整了。已经发到您的邮箱里。。。请博主再次查看。。麻烦您了博主。。谢谢啊!!

 回复 引用 查看   
#184楼[楼主] 2010-07-05 16:50 cloudgamer      
@卡内基
这样
document.getElementById("modulePanel").contentWindow.document.getElementById("txt_city")
就能在主页面获取iframe里面的对象
其他自己想想吧

 回复 引用   
#185楼 2010-07-06 15:26 tzfox[未注册用户]
@cloudgamer
已经解决了,原来添加的jquery的路径出了问题,使用相对路径添加就可以了。
博主的JS修改之后确实可以在jquery下正确使用,多谢了。

 回复 引用 查看   
#186楼 2010-07-11 19:49 卡内基      
博主,您好!
我有件事想请教你,我将你的LightBox这个效果的js,弄成一个.js文件,这样在用的时候就可以导入这个.js文件就可以了。
在ie6里面就会出现一个很奇怪的问题。“<script src="js/LightBox.js" type="text/javascript"></script>”,在ie6里用导入.js文件的这个方法,就会报语法错误!不用导入这个方法,直接把代码复制到html文件就没事。。
我跟了很长时间也没找出是什么问题,挺奇怪的。。想问下博主,知道是什么问题吗!!

谢谢。。west

 回复 引用 查看   
#187楼[楼主] 2010-07-11 21:21 cloudgamer      
@卡内基
估计是编码问题
检查一下吧

 回复 引用   
#188楼 2010-09-19 23:28 zhouxian[未注册用户]
能把整个代码发到我邮箱里吗,我的邮箱是102595750@qq.com,非常感谢
 回复 引用 查看   
#189楼[楼主] 2010-09-20 00:54 cloudgamer      
@zhouxian
这里就有实例下载

 回复 引用   
#190楼 2010-09-20 14:11 loushuangpu[未注册用户]
楼主请问当鼠标经过QQ头像时出现一个小卡片其中包括用户信息是怎样实现的,谢谢
 回复 引用 查看   
#191楼[楼主] 2010-09-20 14:20 cloudgamer      
 回复 引用 查看   
#192楼 2010-09-20 16:04 zhouxian      
当鼠标经过QQ头像时显示一个卡片其中包括并且卡片可以随着QQ头像移动这几天一直在思考可是一直得不到解决,苦恼死了

 回复 引用 查看   
#193楼[楼主] 2010-09-20 16:08 cloudgamer      
@zhouxian
可以相对qq头像定位

 回复 引用 查看   
#194楼 2010-09-20 16:12 zhouxian      
那个小卡片式是用用覆盖层设计的吗
 回复 引用 查看   
#195楼[楼主] 2010-09-20 16:23 cloudgamer      
@zhouxian
什么小卡片

 回复 引用   
#196楼 2010-09-20 16:39 周贤[未注册用户]
图片发送不了难啊,请问有QQ号吗
 回复 引用 查看   
#197楼[楼主] 2010-09-24 16:53 cloudgamer      
@周贤
发邮箱吧

 回复 引用 查看   
#198楼 2010-09-25 11:09 consatan      
自己也写了个类似的,用在自己的项目,但遮罩层没解决,目前是在弹出前,把页面的滚动条都设置为隐藏,关闭后再显示回来,但这样如果显示层的大小比当前浏览器窗口大的话,bug就出来了...昨天看了下Discuz 7.0的弹出图片效果,发现也是有bug,它里面的遮罩层高度是用
div.style.height = document.body.scrollHeight + 'px';
这样当全屏时是没问题,但之后再把浏览器窗口缩小的话,底下就会出现无法遮挡的部分了
先来试试position fixed...

P.S.我是还有在弹出前、弹出后、关闭前、关闭后各添加了自定义函数功能,这样要拓展就比较方便,而且显示层的内容可以用innerHTML的方式,或者用自定义函数的方式来添加显示内容
不过JS功底还没博主那么强,还是等以后功底强些,修改封装完再帖出来...

 回复 引用 查看   
#199楼[楼主] 2010-09-25 13:53 cloudgamer      
@consatan
遮罩用fixed就行
不过ie6不支持
近来发现一个新方法正在研究

 回复 引用 查看   
#200楼 2010-09-25 14:24 consatan      
@cloudgamer
早上回复完,测试fixed时,死活测试不了
最后才发现...
DOCTYPE既然一定要这么写才行...
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Strict//EN">
我测试的HTML文档是没写DOCTYPE的,后来看到某楼的回复说一定要加DOCTYPE才行
我一般是加
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
结果死活不行...
不知道你的新方法是什么,能否说一下思路??

 回复 引用 查看   
#201楼 2010-09-25 14:47 Tear Y      
楼主的代码写的真好!大家真的也很厚道...
 回复 引用 查看   
#202楼[楼主] 2010-09-25 15:07 cloudgamer      
@Tear Y
谢谢支持

 回复 引用 查看   
#203楼[楼主] 2010-09-25 15:08 cloudgamer      
@consatan
还没完善
可以用在ie6
至于能不能没有DOCTYPE还没测试

 回复 引用 查看   
#204楼 2010-09-25 17:23 consatan      
@cloudgamer
把新方法的思路说一下嘛...
实在不方便的话,那就只能等你研究完了...

 回复 引用 查看   
#205楼[楼主] 2010-09-25 17:43 cloudgamer      
@consatan
等研究完会发一篇的

 回复 引用   
#206楼 2010-09-26 15:58 steven g[未注册用户]
一个问题?设置窗口显示居中,如果浏览器的高度小于需要弹出窗口的高度的话,窗口的一部分内容就看不见了。
 回复 引用 查看   
#207楼[楼主] 2010-09-26 16:52 cloudgamer      
@steven g
那你觉得还能怎么样呢

 回复 引用   
#208楼 2010-09-26 19:17 steven g[未注册用户]
@cloudgamer
看了一下,如果浏览器原始宽度小于弹窗宽度的话也会有一部分隐藏在左边了。不太懂,是不是可以在这种情况下出滚动条,让弹窗自动向下或者向右移动一部分

 回复 引用   
#209楼 2010-09-26 20:09 steven g[未注册用户]
改代码为
SetCenter: function(){
this.Box.style.marginTop = (this.Box.offsetTop+(document.documentElement.scrollTop - this.Box.offsetHeight / 2))>=0?(document.documentElement.scrollTop - this.Box.offsetHeight / 2 + "px"):(-this.Box.offsetTop + "px");
this.Box.style.marginLeft = (this.Box.offsetLeft+(document.documentElement.scrollLeft - this.Box.offsetWidth / 2))>=0?(document.documentElement.scrollLeft - this.Box.offsetWidth / 2 + "px"):(-this.Box.offsetLeft + "px");
虽然不会超出窗口了,可是还是有问题。this.Box.offsetTop 的值不断变化导致窗口弹出位置变动

 回复 引用 查看   
#210楼[楼主] 2010-09-26 21:57 cloudgamer      
@steven g
如果居中也超过就没办法了

 回复 引用 查看   
#211楼 2010-10-02 10:17 笨蛋的座右铭      
无爱的新号:笨蛋的座右铭
ps:为什么不直接a.compareDocumentPosition(b) == 16,我也不清楚。
我来解释一下:
000000 & 0 Elements are identical.
000001 & 1 The nodes are in different documents (....
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.
111111
得出结论:在1,2,4,8,16,32只,16只有&16才为1,其它都为0,所以
用!!a.compareDocumentPosition(b) & 16

 回复 引用 查看   
#212楼[楼主] 2010-10-02 13:31 cloudgamer      
@笨蛋的座右铭
010000十进制就是16

 回复 引用 查看   
#213楼 2010-10-02 14:24 笨蛋的座右铭      
引用cloudgamer:
@笨蛋的座右铭
010000十进制就是16

给你看一段代码,你就会明白为什么不能用===16,而必须用&16了:
 window.onload = function(){
    var A = document.getElementById('parent'),
    B = document.getElementById('child');
    alert(A.compareDocumentPosition(B));//B与A不相连,B在A的后面,B被A包含 4+16 = 20
  }
</script>
<h2 style="text-align:center">compareDocumentPosition方法</h2>

<div id="parent">
  <p>
    <strong id="child" >本例子请在标准浏览器中运行。</strong>
  </p>
</div>


说明一下:这是我从徒正美的blog的找到的一案例,也是一篇关于contains的。
这时候===16是错误的,而&16是正确的。

结论:其实上这是一种设计,一种位运算算法的典型应用,以当前compareDocumentPosition这个案例来说,他含概了从000000到111111的所有可能,唯有用&运算符,才能得出最严谨的答案

 回复 引用 查看   
#214楼[楼主] 2010-10-02 15:25 cloudgamer      
@笨蛋的座右铭

谢谢

 回复 引用 查看   
#215楼 2010-10-09 14:41 hows      
真的很厉害,我佩服博主!!!能逐个逐个恢复,实在少见啊,
我想请教你的这段代码怎么在页面加载的时候,就打开窗口!!我只要你的几个功能,都修改好了,就是不知道该怎么在
<body onload="(这里该怎么写)">------------打开窗口

不知道多久才能恢复我,在线等啊!!太感谢了,

 回复 引用 查看   
#216楼[楼主] 2010-10-09 14:52 cloudgamer      
@hows
在window.onload=function(){xxxxx}
写就行了吧

 回复 引用 查看   
#217楼 2010-10-09 15:12 hows      
仔细看了所有的评论,和博主的回复,都没有提到我上面的问题。直接用<body onload="box.show()";肯定是不行的;box是定义的局部变量,再直接根据层的id;(id="idBox")显示,又好像是不行的。我想做的就是在打开首页时,弹出公告层并把其他页面内容屏蔽掉,关闭后,才能操作页面。
 回复 引用 查看   
#218楼 2010-10-09 15:18 hows      
可以了!!应该可以打开多个同样的层吧,我想一条公告显示一个层,也许有很多层都需要显示!!逐个关闭后,才可以操作页面!!我先试一试!!谢谢博主!!
你真帅,,技术帅,心也帅!!羡慕你!!

 回复 引用 查看   
#219楼[楼主] 2010-10-09 15:38 cloudgamer      
@hows
可以new多几个实例就行

 回复 引用 查看   
#220楼 2010-10-10 15:43 newEggRock      
楼主,请教个很棘手的问题,我想用一个黑色透明DIV遮住页面,再弹个DIV让用户操作,就像你例子里那种,遇到个问题就是,office web components 组件 遮不住,比如说在html里加句 <object id="Spreadsheet1" classid=CLSID:0002E559-0000-0000-C000-000000000046 style="width:100%;height:550px"></object> 页面就显示一个excel 出来 这个excel 怎么都遮不住,尝试用 iframe 能遮住,但不能让遮罩看起来透明的,直接把excel 挡住看不到了。让iframe透明 好像又遮不住。。。请楼主援手。。谢谢
 回复 引用 查看   
#221楼[楼主] 2010-10-10 21:26 cloudgamer      
@newEggRock
程序的遮罩就是用透明的iframe的啊

 回复 引用 查看   
#222楼 2010-10-11 11:41 hows      
请教一下,为什么直接把代码放到jsp,就没有反应啊?放到jsp运行后,就直接看到层,也没有屏蔽的功能,事件也没有反应!想了一个早上了啊!!!犯困了!!
 回复 引用 查看   
#223楼[楼主] 2010-10-11 11:47 cloudgamer      
@hows
用调试器检查一下什么问题就行了吧

 回复 引用 查看   
#224楼 2010-10-11 14:07 hows      
终于可以运行了,谢谢!!!!我的技术还真烂!!
 回复 引用 查看   
#225楼[楼主] 2010-10-11 14:08 cloudgamer      
@hows
解决就好

 回复 引用 查看   
#226楼 2010-10-11 16:47 hows      
晕!!!在火狐下运行,flash 动画屏蔽不了啊!鼠标放在flash上,可以点击flash进行跳转哦!!博主,要怎么解决啊!!??我现在用360和IE可以正确屏蔽页面的内容,就火狐不行了!!
 回复 引用 查看   
#227楼[楼主] 2010-10-11 16:57 cloudgamer      
@hows
要设置flash透明吧

 回复 引用 查看   
#228楼 2010-10-11 17:01 hows      
是啊,不设置的话,在火狐里就那段flash 就一点屏蔽都没有,包括颜色和动作。那怎么在360和IE 就不用屏蔽,那就是要在代码中判断浏览器,再进行屏蔽咯!该怎么写啊,求救
!!!!谢谢

 回复 引用 查看   
#229楼[楼主] 2010-10-11 17:07 cloudgamer      
@hows
一般都是设置透明解决
具体flash我也不懂

 回复 引用 查看   
#230楼 2010-10-12 08:39 张波sun      
不错
 回复 引用 查看   
#231楼 2010-10-12 09:00 newEggRock      
楼主,继续我220楼的问题,我在你的示例代码里,在select 后面加了句 代码<object id="Spreadsheet1" classid=CLSID:0002E559-0000-0000-C000-000000000046 style="width:100%;height:550px"></object>
页面显示出EXCEL 再点打开遮罩,遮不住。excel 始终在最顶层,求帮忙~~

 回复 引用 查看   
#232楼[楼主] 2010-10-12 09:17 cloudgamer      
@张波sun
谢谢支持

 回复 引用 查看   
#233楼[楼主] 2010-10-12 09:22 cloudgamer      
@newEggRock
用iframe就能遮住
最好是隐藏

 回复 引用 查看   
#234楼 2010-10-12 10:10 newEggRock      
@cloudgamer
恩,用iframe 是能遮住了,不过遮住之后 excel 就不见了,就像隐藏掉了一样,像select这种 html 标签 就不会消失。 我不想excel 消失,只想用个半透明的遮罩蒙在它上面,让它不可用,但还能看见。楼主,这种情况有办法解决吗,估计挺难的,或者直接可以说无解。。

 回复 引用 查看   
#235楼[楼主] 2010-10-12 10:18 cloudgamer      
@newEggRock
这就不知道了

 回复 引用 查看   
#236楼 2010-10-13 10:16 hows      
找到可以遮住Flash的方法,自己还没有开始看呢!先把他分享给大家!!!
<a href="http://talentnba.javaeye.com/blog/372350">不同浏览器中Div层覆盖Flash层的几种方法</a>

 回复 引用 查看   
#237楼[楼主] 2010-10-13 10:58 cloudgamer      
@hows

研究研究

 回复 引用 查看   
#238楼 2010-10-13 11:10 hows      
可以用DIV覆盖Flash了,说说我的做法;
我直接在我的Flash代码中的关键部分(document.write('<embed wmode="transparent" src="flash/focus.swf" FlashVars="pics='+pics+'&links='+links+'&texts='+texts+'&pic_width='+pic_width+'&pic_height='+pic_height+'&show_text='+show_text+'&txtcolor='+txtcolor+'&bgcolor='+bgcolor+'&button_pos='+button_pos+'&stop_time='+stop_time+'" quality="high" width="'+ pic_width +'" height="'+ swf_height +'" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />');
) 加上 ;wmode="transparent"。其他的都没有修改,在IE ,360,火狐,谷歌 测试了都可以。关闭覆盖层之后,可以正常操作。希望这种做法不会有错。如果有知道这方面的高手,请指点一下!!谢谢!!

 回复 引用 查看   
#239楼[楼主] 2010-10-13 11:14 cloudgamer      
@hows

我上面也已经说了设置透明

 回复 引用 查看   
#240楼 2010-11-08 13:58 haonos      
newEggRock
用iframe就能遮住
最好是隐藏

 回复 引用 查看   
#241楼 2010-12-10 15:19 路过春秋      
很强悍,我彻底拜服了.
 回复 引用 查看   
#242楼 2011-03-22 16:02 沙琪玛      
很棒 谢谢 转载了
 回复 引用 查看   
#243楼[楼主] 2011-03-23 11:26 cloudgamer      
@haonos
@路过春秋
@沙琪玛
谢谢支持

 回复 引用 查看   
#244楼 2011-03-24 10:34 gonganruyi      
您好,我想问下 如果我在iframe里面使用当前js如何让他全屏弹出?
 回复 引用 查看   
#245楼[楼主] 2011-03-24 11:19 cloudgamer      
@gonganruyi
目前没其他办法 只能在最顶层做

 回复 引用   
#246楼 2011-04-13 09:54 前端小子[未注册用户]
楼主,你很强了,是否你写过跨frame的弹出,能否给点思路,或者给个demo,,不胜感激,学习中!
 回复 引用 查看   
#247楼[楼主] 2011-04-14 09:58 cloudgamer      
@前端小子
问题同上

 回复 引用   
#248楼 2011-05-11 09:27 Doliet[未注册用户]
学习了
 回复 引用   
#249楼 2011-09-06 15:38 hiuiuf[未注册用户]
请问,如果我是想页面打开的时候判断来源,比如如果是通过百度搜索打开网站页面的,就会显示这样一个遮罩,如果是直接输入网址打开页面的,那就不显示遮罩,要怎么实现呢?
 回复 引用   
#250楼 2011-11-25 11:21 llllboy[未注册用户]
楼主 我在层里面加了下拉列表
设置了自动回发 选择下拉列表后 页面刷新
这个层就关闭了
我想问 怎么才能让他不关闭呢?
层的现实 能不能在页面加载的时候控制到呢?

 回复 引用   
#251楼 2011-11-28 17:19 llllboy[未注册用户]
LZ 我用了你的这个弹出框

但是在IE6下 报JS错误啊

说LightBox找不到

怎么回事啊?

求助啊 !

如果LZ看到了 就发邮件到我邮箱 我们沟通行么?

 回复 引用   
#252楼 2012-01-13 14:22 16fly[未注册用户]
如果能加上一个当弹出框显示就隐藏右边的滚动条就好了!我做的不兼容IE...
评论共3页: 上一页 1 2 3 
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1290954 QmimGBsrkI8=