纯JavaScript实现的完美渐变弹出层效果代码


Posted in Javascript onApril 02, 2010

如题,本文将使用纯粹的脚本JavaScript实现渐变的弹出层,其想法也非常简单:利用IFrame实现遮盖,再借助一个DIV用于展现弹出层的内容,最后再使用其内置函数setInterval()和clearInterval()实现渐变,原理非常简单,只不过要注意对DOM对象/元素的精确控制。由于代码比较简单,在此就不再赘述。以下代码在IE6+,FF3.5+测试通过。
脚本Flyout.js:

// JScript File 
if (navigator.userAgent.toLowerCase().indexOf('msie') > -1) { 
window.isIE = true; 
window.isIE6 = navigator.appVersion.indexOf("MSIE 6.0;") > -1; 
window.isIE7 = navigator.appVersion.indexOf("MSIE 7.0;") > -1; 
window.isIE8 = navigator.appVersion.indexOf("MSIE 8.0;") > -1; 
} 
var $ = function(objID) { return document.getElementById(objID) }; 
var _flyout; 
var _fadeTimer; 
function showflyout(divWidth, divHeight, paddingWidth) { 
var flyout = function() { 
} 
flyout.prototype = { 
clientWidth: document.documentElement.clientWidth, 
clientHeight: document.documentElement.clientHeight, 
scrollWidth: document.documentElement.scrollWidth, 
scrollHeight: document.documentElement.scrollHeight, 
iframeID: "envelopIframe", 
divID: "popupcontent", 
iframebgColor: "#888888", 
show: function(divContent) { 
//Create envelop iframe 
cssText = "position:absolute; z-index:100; background-color:#888888; border-width:0px; filter:alpha(opacity=0); opacity:0.0;"; 
cssText += "left:0px;"; 
cssText += "top:0px;"; 
cssText += "width:" + this.scrollWidth + "px;"; 
cssText += "height:" + this.scrollHeight + "px;"; 
this.create("iframe", this.iframeID, cssText, "Cppl_IFrameSrc.htm", ""); 
_fadeTimer = setInterval(function() { fadeIframe("envelopIframe", 0.05, 0, 0.5, true) }, 5); 
//Create flyout 
var cssText = ""; 
cssText += "display:block; _position:absolute; position:fixed; z-index:101; border:solid 1px Gray; background-color:white;"; 
cssText += "left:" + (this.clientWidth - divWidth - paddingWidth) / 2 + "px;"; 
cssText += "top:" + (this.clientHeight - divHeight - paddingWidth) / 2 + "px;"; 
cssText += "width:" + (divWidth + paddingWidth) + "px;"; 
cssText += "height: " + (divHeight + paddingWidth) + "px;"; 
this.create("div", this.divID, cssText, "", divContent); 
}, 
create: function(type, id, csstext, iframesrc, innerhtml) { 
var obj = document.createElement(type); 
if (iframesrc.length > 0) { 
obj.src = iframesrc; 
} 
obj.setAttribute("id", id); 
obj.style.cssText = csstext; 
if (innerhtml.length > 0) { 
obj.innerHTML = innerhtml; 
} 
document.body.appendChild(obj); 
if (iframesrc.length > 0) { 
if (window.isIE) { 
window.envelopIframe.document.bgColor = this.iframebgColor; 
} 
} 
}, 
close: function() { 
var objIframe = document.getElementById(this.iframeID); 
var objDiv = document.getElementById(this.divID); 
if (objIframe && objDiv) { 
document.body.removeChild(objIframe); 
document.body.removeChild(objDiv); 
} 
}, 
onresize: function() { 
var objIframe = document.getElementById(this.iframeID); 
var objDiv = document.getElementById(this.divID); 
if (objIframe && objDiv) { 
objIframe.style.width = document.documentElement.scrollWidth + "px"; 
objIframe.style.height = document.documentElement.scrollHeight + "px"; 
objDiv.style.left = (document.documentElement.clientWidth - divWidth) / 2 + "px"; 
objDiv.style.top = (document.documentElement.clientHeight - divHeight) / 2 + "px"; 
} 
}, 
onscroll: function() { 
var objDiv = document.getElementById(this.divID); 
if (objDiv) { 
objDiv.style.left = (document.documentElement.clientWidth - divWidth) / 2 + document.documentElement.scrollLeft + "px"; 
objDiv.style.top = (document.documentElement.clientHeight - divHeight) / 2 + document.documentElement.scrollTop + "px"; 
} 
} 
}; 
_flyout = new flyout(); 
_flyout.show("This is a flyout.<div onclick=\"javascript:closeflyout()\">Close Flyout</div>"); 
} 
function closeflyout() { 
clearInterval(_fadeTimer); 
_fadeTimer = setInterval(function() { fadeIframe("envelopIframe", 0.05, 0, 0.5, false) }, 5); 
} 
window.onresize = function() { 
if (_flyout) { 
_flyout.onresize(); 
} 
}; 
window.onscroll = function() { 
if (_flyout && isIE6) { 
_flyout.onscroll(); 
} 
}; 
function fadeIframe(objId, speed, minOpacity, maxOpacity, flag) { 
var dialog = $(objId); 
if (dialog) { 
var value; 
if (flag) { 
if (parseFloat(dialog.style.opacity) <= maxOpacity) { 
value = parseFloat(dialog.style.opacity) + speed; 
dialog.style.filter = 'alpha(opacity=' + value * 100 + ')'; 
dialog.style.opacity = '' + value + ''; 
} 
else { 
clearInterval(_fadeTimer); 
} 
} 
else { 
if (parseFloat(dialog.style.opacity) >= minOpacity) { 
value = parseFloat(dialog.style.opacity) - speed; 
dialog.style.filter = 'alpha(opacity=' + value * 100 + ')'; 
dialog.style.opacity = '' + value + ''; 
} 
else { 
clearInterval(_fadeTimer); 
if (_flyout) { 
_flyout.close(); 
} 
} 
} 
} 
}

调用ASPX代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
<title>Flyout Sample</title> 
<script type="text/javascript" src="Flyout.js"></script> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div> 
<div onclick="javascript:showflyout(700, 300, 10);"> 
Click me to test 
</div> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
<br /> 
</div> 
</form> 
</body> 
</html>

最终效果图:
纯JavaScript实现的完美渐变弹出层效果代码
Javascript 相关文章推荐
完整显示当前日期和时间的JS代码
Sep 17 Javascript
非常漂亮的JS代码经典广告
Oct 21 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
Aug 29 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
Jan 06 Javascript
jquery选择器之基本过滤选择器详解
Jan 27 Javascript
js格式化时间的方法
Dec 18 Javascript
jQuery中get方法用法分析
Dec 07 Javascript
微信小程序 引用其他js文件实现代码
Feb 22 Javascript
浅谈原型对象的常用开发模式
Jul 22 Javascript
node.js 模块和其下载资源的镜像设置的方法
Sep 06 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
Sep 25 Javascript
vue微信分享到朋友圈 vue微信发送给好友
Nov 28 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 #Javascript
获取焦点时,利用js定时器设定时间执行动作
Apr 02 #Javascript
Javascript 类与静态类的实现(续)
Apr 02 #Javascript
用js实现计算加载页面所用的时间
Apr 02 #Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
Apr 02 #Javascript
ExtJS Ext.MessageBox.alert()弹出对话框详解
Apr 02 #Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
Apr 02 #Javascript
You might like
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
使用typeof方法判断undefined类型
2014/09/09 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python re模块的高级用法详解
2018/06/06 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
关于python中remove的一些坑小结
2021/01/04 Python
职业生涯规划书的格式
2013/12/29 职场文书
二年级数学教学反思
2014/01/21 职场文书
教师节商场活动方案
2014/02/13 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
团队经理竞聘书
2014/03/31 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
天气温馨提示语
2015/07/14 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
宣传委员竞选稿
2015/11/19 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
求职自我评价参考范文
2019/05/16 职场文书
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android
Python基础教程,Python入门教程(超详细)
2021/06/24 Python
python数字图像处理实现图像的形变与缩放
2022/06/28 Python