基于Javascript實(shí)現(xiàn)彈出頁面效果
彈出層效果是一個(gè)很實(shí)用的功能,很多網(wǎng)站都采用了這種方式實(shí)現(xiàn)登錄和注冊(cè),比如百度:

彈出層的特點(diǎn):點(diǎn)擊登錄或注冊(cè)的時(shí)候在頁面的中間部分彈出一個(gè)登錄或注冊(cè)區(qū)域并且頁面有一個(gè)遮罩層,而且登錄框在遮罩層之上,也就是登陸框的z-index值要大于遮罩層的z-index值。當(dāng)點(diǎn)擊關(guān)閉或者遮罩層時(shí)關(guān)閉登錄或者注冊(cè)框(有的網(wǎng)頁沒有實(shí)現(xiàn)點(diǎn)擊遮罩層關(guān)閉登錄或注冊(cè)區(qū)域的功能。)。
最近也做了一個(gè)類似的彈出層的效果,先展示一下最終效果:

簡(jiǎn)單的說一下實(shí)現(xiàn)的過程。
首先是遮罩層。遮罩層是在頁面動(dòng)態(tài)加載的過程中創(chuàng)建的,因?yàn)檎谡謱有枰谧≌麄€(gè)頁面,所以遮罩層的高度是通過在JavaScript計(jì)算得到,而它的寬度是整個(gè)頁面的寬度,這個(gè)也很容易得到。還需要給它設(shè)一個(gè)z-index值,盡可能很大,因?yàn)樾枰谧≌麄€(gè)頁面。當(dāng)然透明度也是必須的。
#mask{
background: #000;
opacity: .6;
filter:alpha(opacity=60);
position:absolute;
left:0;
top:0;
width:100%;
height:1000px;/*動(dòng)態(tài)獲取,這里設(shè)置高度是為了測(cè)試*/
z-index:1000;
}
通過JavaScript動(dòng)態(tài)創(chuàng)建遮罩層,然后添加到頁面中:
//創(chuàng)建遮罩層節(jié)點(diǎn)
var oMask = document.createElement('div');
oMask.id = 'mask';
oMask.style.width = pageWidth + 'px';
oMask.style.height = pageHeight + 'px';
document.body.appendChild(oMask);
上面代碼中的pageWidth和pageHeight就會(huì)頁面的寬度和高度值,通過
//獲取頁面的高度和寬度 var pageHeight = document.documentElement.scrollHeight; var pageWidth = document.documentElement.scrollWidth;
獲取。這樣遮罩層就完成了。
再來說說彈出層的效果。
彈出層在頁面的中間部分顯示(這也是關(guān)鍵的步驟),也就是彈出層距離頁面左邊和右邊的距離相等,距離頁面上邊的距離和距離下邊的距離相等。注意是在可是區(qū)域中。
用公式表示就是:
left=right=(頁面可是區(qū)域?qū)挾?- 彈出層寬度)/2;top=bottom=(頁面可是區(qū)域的高度-彈出層高度)/2
而這里可是區(qū)域的寬度等于頁面的寬度,因?yàn)轫撁娴撞棵子袧L動(dòng)條。底部有滾動(dòng)條的網(wǎng)頁也是奇葩啊。設(shè)置它的left和top值之前必須已經(jīng)將它添加到頁面當(dāng)中去了,否則無法設(shè)置。
oLogin.style.left = (pageWidth - loginWidth) / 2 + 'px'; oLogin.style.top = ( clientHeight- loginHeight) / 2 + 'px';
腳本之家提醒大家需要注意,這里彈出層的定位方式是固定定位的,而且它的z-index值要大于遮罩層的。
#login{position:fixed;width:400px;height:400px;background:#fff;z-index: 1001;}
最后就是給關(guān)閉按鈕添加事件響應(yīng)函數(shù)了。
EventUtil.addHandler(oClose, 'click', function(){
document.body.removeChild(oMask);
document.body.removeChild(oLogin);
});
EventUtil是一個(gè)為了兼容瀏覽器事件處理函數(shù)而寫的一個(gè)對(duì)象,具體的實(shí)現(xiàn)在這里:
var EventUtil = {
//添加事件處理函數(shù)
addHandler: function(element, type, handler){
if(element.addEventListener){
element.addEventListener(type, handler, false);
}else if(element.attachEvent){
element.attachEvent('on' + type, handler);
}else{
element['on' + type] = handler;
}
},
//刪除事件處理函數(shù)
removeHandler: function(element, type, handler){
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
}else if(element.detachEvent){
element.detachEvent('on' + type, handler);
}else{
element['on' + type] = null;
}
}
};
到這里大部分的內(nèi)容就完成了,其實(shí)現(xiàn)實(shí)起來很簡(jiǎn)單。只要知道了原理,剩下的就是實(shí)現(xiàn)方式了。
點(diǎn)擊登錄按鈕那個(gè)功能就不介紹了,加個(gè)事件處理函數(shù)就行了?! ?/p>
源碼(寫的不規(guī)范):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>遮罩層效果</title>
<style type="text/css">
*{margin:0;padding:0;}
body{background: #ccc;font-family: "微軟雅黑";height:2000px;/*用于測(cè)試*/}
.clearfix:after,
.clearfix:before{content: "";display: block;}
.clearfix{clear: both;visibility: hidden;}
img{border: 0;}
#header{width:100%;height:60px;line-height:60px;background: #000;}
#header a{display: block;width:60px;height:60px;color:#fff;text-decoration: none;font-size:15px;background:#c9394a;text-align: center;float: right;margin-right:138px;}
#login{position:fixed;width:400px;height:400px;background:#fff;z-index: 1001;}
.title{height:50px;background: #c9394a;line-height: 50px;}
.title span{display:inline-block;color:#fff;padding-left:20px;}
.title a{display: block;float:right;background: url(close.png) no-repeat center;width: 30px;height:30px;padding:20px 20px 0 0;}
.login_content form{padding-top:40px;width:340px;margin: 0 auto;}
.inp_group{margin-bottom:30px;}
#username{
background: url(sprite.png) no-repeat 0 0;
}
#passwd{
background: url(sprite.png) no-repeat 0 -46px;
}
input[type=password],input[type="text"]{
width:272px;height:40px;
outline: none;
padding-left:48px;
border: 1px solid #000;
font-size:15px;
}
input[type=button]{
width:318px;
height:38px;
margin:0 auto;
border:1px solid #f00000;
background-color:#f00000;
color:#fff;
font-size:15px;
outline:none;
cursor:pointer;
transition:all 1s;
}
input[type=button]:hover{
background:#ff0000;
border:1px solid #ff0000;
}
#mask{
background: #000;
opacity: .6;
filter:alpha(opacity=60);
position:absolute;
left:0;
top:0;
width:100%;
height:1000px;/*動(dòng)態(tài)獲取,這里設(shè)置高度是為了測(cè)試*/
z-index:1000;
}
</style>
<script type="text/javascript" src="base.js"></script>
<script type="text/javascript">
function popLogin(){
//獲取頁面的高度和寬度
var pageHeight = document.documentElement.scrollHeight;
var pageWidth = document.documentElement.scrollWidth;
//可視區(qū)域的高度和寬度
var clientHeight = document.documentElement.clientHeight;
//創(chuàng)建遮罩層節(jié)點(diǎn)
var oMask = document.createElement('div');
oMask.id = 'mask';
oMask.style.width = pageWidth + 'px';
oMask.style.height = pageHeight + 'px';
document.body.appendChild(oMask);
//創(chuàng)建登錄節(jié)點(diǎn)
var oLogin = document.createElement('div');
oLogin.id = 'login';
oLogin.innerHTML = '<div class="title"><span>登錄</span><a href="javascript:;" id="close"></a></div><div class="login_content"><form method="post" action="?"><div class="inp_group"><input type="text" name="username" id="username" placeholder="請(qǐng)輸入登錄郵箱"></div><div class="inp_group"><input type="password" name="password" id="passwd" placeholder="請(qǐng)輸入密碼"></div><input type="button" value="登錄"></form></div>';
document.body.appendChild(oLogin);
var loginWidth = oLogin.offsetWidth;
var loginHeight = oLogin.offsetHeight;
console.log(clientHeight);
oLogin.style.left = (pageWidth - loginWidth) / 2 + 'px';
oLogin.style.top = ( clientHeight- loginHeight) / 2 + 'px';
var oClose = document.getElementById('close');
EventUtil.addHandler(oClose, 'click', function(){
document.body.removeChild(oMask);
document.body.removeChild(oLogin);
});
EventUtil.addHandler(oMask, 'click', function(){
document.body.removeChild(oMask);
document.body.removeChild(oLogin);
});
}
window.onload = function(){
var oLoginBtn = document.getElementById('login_btn');
EventUtil.addHandler(oLoginBtn, "click", popLogin);
};
</script>
</head>
<body>
<div id="header">
<a href="javascript:;" id="login_btn">登錄</a>
</div>
<!--<div id="mask"></div>-->
<!--<div id="login">
<div class="title">
<span>登錄</span>
<a href="javascript:;"></a>
</div>
<div class="login_content">
<form method="post" action="?">
<div class="inp_group">
<input type="text" name="username" id="username" placeholder="請(qǐng)輸入登錄郵箱">
</div>
<div class="inp_group">
<input type="password" name="password" id="passwd" placeholder="請(qǐng)輸入密碼">
</div>
<input type="button" value="登錄">
</form>
</div>
</div>-->
</body>
</html>
代碼到此結(jié)束,本文寫的不好,還請(qǐng)各位大俠提出寶貴意見。同時(shí)感謝大家一直以來對(duì)腳本之間網(wǎng)站的支持,在此,腳本之家小編祝大家元旦快樂。
- js實(shí)現(xiàn)在頁面上彈出蒙板技巧簡(jiǎn)單實(shí)用
- Js制作簡(jiǎn)單彈出層DIV在頁面居中 中間顯示遮罩的具體方法
- JS實(shí)現(xiàn)定時(shí)頁面彈出類似QQ新聞的提示框
- js 點(diǎn)擊頁面其他地方關(guān)閉彈出層(示例代碼)
- js 彈出新頁面避免被瀏覽器、ad攔截的一種新方法
- Js Jquery創(chuàng)建一個(gè)彈出層可加載一個(gè)頁面
- js實(shí)現(xiàn)彈出窗口、頁面變成灰色并不可操作的例子分享
- 禁止iframe頁面的所有js腳本如alert及彈出窗口等
- js與css實(shí)現(xiàn)彈出層覆蓋整個(gè)頁面的方法
相關(guān)文章
原生JavaScript實(shí)現(xiàn)remove()和recover()功能示例
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)remove()和recover()功能,結(jié)合實(shí)例形式分析了javascript實(shí)現(xiàn)類似jQueryremove()和recover()功能的自定義函數(shù),需要的朋友可以參考下2018-07-07
javascript 窗口加載蒙板 內(nèi)嵌網(wǎng)頁內(nèi)容
用于在現(xiàn)有窗口上加載蒙板,在蒙板內(nèi)在嵌入其他頁面內(nèi)容2010-11-11
通用javascript代碼判斷版本號(hào)是否在版本范圍之間
通用判斷版本號(hào)是否在兩者之間,也可以搭配判斷是否大于某版本號(hào),小于取反即可,本文給大家介紹通用javascript代碼判斷版本號(hào)是否在版本范圍之間,需要的朋友參考下2015-11-11
javascript實(shí)現(xiàn)簡(jiǎn)單的ajax封裝示例
這篇文章主要介紹了javascript實(shí)現(xiàn)簡(jiǎn)單的ajax封裝功能,結(jié)合實(shí)例形式分析了ajax基本功能與操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-12-12
通過V8源碼看一個(gè)關(guān)于JS數(shù)組排序的詭異問題
一直在學(xué)習(xí)C++,也想閱讀點(diǎn)開源的C++項(xiàng)目,發(fā)現(xiàn)網(wǎng)上對(duì)Google V8評(píng)價(jià)不錯(cuò),于是上Github上找到了源代碼,但在學(xué)習(xí)中遇到一個(gè)js數(shù)組排序的問題,下面這篇文章主要給大家介紹了通過V8源碼說說一個(gè)關(guān)于JS數(shù)組排序的詭異問題的相關(guān)資料,需要的朋友可以參考下。2017-08-08

