搜索:
首页 >> 下载中心 >> JavaScript源码 >> AlertBox 弹出层(信息提示框)效果 javascript源码

AlertBox 弹出层(信息提示框)效果 javascript源码

2011-3-3 作者:cloudgamer 来源:cloudgamer博客 投递文章

弹出层(弹窗)就是相对文档或窗口定位的一个层,一般用来显示提示信息、广告等内容,还可以配合覆盖层来锁定页面。

仿Lightbox效果中,已经基本实现了这个效果,这次主要改进了ie6在fixed时的抖动问题。
此外,还增加了一个用来兼容ie6的fixed的方法,覆盖层也重新“包装”,程序也改成组件的结构。
兼容:ie6/7/8, firefox 3.6.8, opera 10.6, safari 5.0.1, chrome 5.0

程序说明

【实现原理】

弹出层的基本原理在仿Lightbox效果中已经说的差不多了。
关键的地方就是定位,一般相对文档的定位用absolute就行了。
要随屏移动,即相对窗口定位,就用fixed定位。
这些实现起来都很简单,除了不支持fixed的ie6。


【兼容ie6的fixed】

由于ie6本身不支持fixed定位,只能模拟或取巧来间接实现。
最原始的方法是在window的scroll事件中不断修正弹出层的位置。
后来有人发现还可以通过reflow“离奇”地实现。
但以上方法都有一个缺陷,滚动时弹出层会“发抖”,很不舒服(可以用缓动等来改善)。

想要不发抖,可以通过html和css的巧妙应用来实现,具体参考14px的介绍。 
原理是用一个容器代替body,然后对不会动的body绝对定位。
看来很完美,但有一个致命的问题,这个方法需要修改html结构,会影响到相关的一些东西,例如window的scroll事件等。

程序中用了另一个方法,通过body的背景和expression来实现,下面是一个兼容的fixed效果:

<!DOCTYPE html>
<html>
<head>
<style>
body {
    _background: url(about:blank) fixed;
}
.fixable {
    position:fixed;
    top:100px;
    _position:absolute;
    _top:expression((document).documentElement.scrollTop+100);
}
</style>
</head>
<body style="height:1500px;">
<div class="fixable">fixable</div>
</body>
</html>

 

相比前面的方法,这个是比较完美的了,但也有一些问题,例如body的背景只能用fixed,使用expression资源消耗相对较大。
更大的问题是不能实现用百分比值或right/bottom来定位。
为了解决这个问题,程序使用了一个定位层,这个层用上面的方法实现fixed定位,尺寸跟窗口大小一样,并且位置重合,那么只要用一般的定位方法相对这个层定位,就能达到相对窗口定位的效果了。

兼容程序主要在RepairFixed对象中,首先设置body背景:

if (body.currentStyle.backgroundAttachment !== "fixed") {
    if (body.currentStyle.backgroundImage === "none") {
        body.runtimeStyle.backgroundRepeat = "no-repeat";
        body.runtimeStyle.backgroundImage = "url(about:blank)";
    }
    body.runtimeStyle.backgroundAttachment = "fixed";
}

再创建定位层:

 

layer = document.createElement("<div style='position:absolute;border:0;padding:0;margin:0;overflow:hidden;background:transparent;top:expression((document).documentElement.scrollTop);left:expression((document).documentElement.scrollLeft);width:expression((document).documentElement.clientWidth);height:expression((document).documentElement.clientHeight);display:block;'>");

定位层还要设置"overflow:hidden",好处是不会因弹出层在document原来的范围外而自动扩大document。

ie6测试以下代码,document会随着下滚而不断扩大:

 

<!DOCTYPE html>
<html>
<head>
<style>
body {
    _background: url(about:blank) fixed;
}
.fixable {
    position:absolute;
    top:expression((document).documentElement.scrollTop+(document).documentElement.clientHeight);
}
</style>
</head>
<body>
<div class="fixable">fixable</div>
</body>
</html>

加上"overflow:hidden"就可以防止这种情况。

然后弹出层通过append方法修改为"absolute"定位,并插入到这个定位层,这样就能实现fixed效果了。

由于这个定位层比较耗资源,所以在有元素插入时才会插到body中。
在不需要fixed的时候,要用remove方法从定位层中移除,当定位层内没有需要定位元素就会自动从body移除。
ps:隐藏的话expression还会继续执行,要移出文档才行。

1   2 下一页 尾 页
相关文章
手机版 JavaScript源码 Asp之家 Aspxhome.com
闽ICP备06017341号