jQuery實(shí)現(xiàn)優(yōu)雅的彈窗效果(6)
彈窗是網(wǎng)頁(yè)中經(jīng)常看到的效果,以前的彈窗是用window.open()等方式在瀏覽器窗口新建另一個(gè)新窗口來(lái)完成的,這種彈窗方式現(xiàn)在已經(jīng)被很多瀏覽器所攔截。今天我們來(lái)用更加友好的方式來(lái)實(shí)現(xiàn)彈窗效果。完成的功能效果如圖:

如圖,在瀏覽器的左上方是兩個(gè)button按鈕,按下之后分別彈出左下角的窗口和中間的窗口,右下角的窗口當(dāng)頁(yè)面加載完成之后自動(dòng)慢慢顯示,之后又徐徐的淡出?;赿iv+css的模式,我們的先來(lái)建立html頁(yè)面。
window.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>jQuery實(shí)戰(zhàn):窗口效果</title> <link type="text/css" rel="stylesheet" href="../css/window.css" rel="external nofollow" /> <script type="text/javascript" src="../js/jquery-1.7.2.min.js"></script> <script type="text/javascript" src="../js/window.js"></script> </head> <body> <input type="button" value="左下角顯示窗口" id="leftpop" /> <input type="button" value="屏幕中間顯示窗口" id="centerpop" /> <div class="window" id="left"> <div class="title"> <img alt="關(guān)閉" src="../image/close.gif" /> 我是左邊顯示窗口的標(biāo)題欄 </div> <div class="content"> 我是左邊顯示窗口的內(nèi)容區(qū) </div> </div> <div class="window" id="center"> <div class="title"> <img alt="關(guān)閉" src="../image/close.gif" /> 我是中間顯示窗口的標(biāo)題欄 </div> <div class="content"> <p>我是中間顯示窗口的內(nèi)容區(qū)</p> </div> </div> <div class="window" id="right"> <div class="title"> <img alt="關(guān)閉" src="../image/close.gif" /> 我是右邊顯示窗口的標(biāo)題欄 </div> <div class="content"> 我是右邊顯示窗口的內(nèi)容區(qū) </div> </div> </body> </html>
從html代碼中可以看到,這里的窗口是用div來(lái)實(shí)現(xiàn)的,目前的html代碼只是描繪了頁(yè)面的基本骨架,能夠效果離窗口效果還相差甚遠(yuǎn),不過(guò)別急,添加上css代碼,頁(yè)面相對(duì)就好看多了。
window.css
.window {
background-color: #D0DEF0;
width: 250px;
/*padding: 2px;*/
margin: 5px;
/*控制窗口絕對(duì)定位*/
position: absolute;
display: none;
}
.content {
height: 150px;
background-color: white;
border: 2px solid #D0DEF0;
padding: 2px;
/*控制區(qū)域內(nèi)容超過(guò)指定高度和寬度時(shí)顯示滾動(dòng)條*/
overflow: auto;
}
.title {
padding: 4px;
font-size: 14px;
}
.title img {
width: 14px;
height: 14px;
float: right;
cursor: pointer;
}
為了看到當(dāng)前效果,先將.window的display屬性注釋掉,或者將它的屬性值改為”block”,看到的效果如圖:

其實(shí)三個(gè)窗口是由三個(gè)div組成,每個(gè)div分為title和content兩部分,title是標(biāo)題欄區(qū)域,content是內(nèi)容區(qū)域。為了達(dá)到窗口的視覺(jué)效果,給我們的title標(biāo)題欄區(qū)域加背景顏色background-color,然后給我們的content內(nèi)容區(qū)域加邊框border: 2px solid #D0DEF0;,邊框的顏色與標(biāo)題欄一致。此時(shí)的效果如上圖,目前只能看到一個(gè)窗口的原因是三個(gè)div占據(jù)了相同的位置,第三個(gè)窗口遮蓋住了前兩個(gè)窗口。不過(guò)沒(méi)關(guān)系,我們可以用JavaScript代碼來(lái)控制三個(gè)div的位置。
jQuery庫(kù)函數(shù)提供了豐富多彩的插件功能,今天我們來(lái)編寫(xiě)自己的插件,簡(jiǎn)單的案例如下:
$.fn.hello = function() {
alert("hello:" + this.val());
return this;
}
只需要在需要的地方注冊(cè)上本插件就行了。相應(yīng)的,這里我們編寫(xiě)的插件mywin來(lái)專(zhuān)門(mén)處理我們的窗口功能效果。
window.js
/**
* 窗口位置的插件
*/
$.fn.mywin = function() {
var windowobj = $(window);
var browserWidth = $(window).width();
var browserHeight = $(window).height();
var scrollLeft = $(window).scrollLeft();
var scrollTop = $(window).scrollTop();
var cwinwidth = this.width();
var cwinheight = this.height();
var left = scrollLeft + (browserWidth - cwinwidth)/2;
var top = cwinheight + (browserHeight - cwinheight)/2;
this.css("left", left).css("top", top);
$(this.children(".title").children("img")).click(function() {
$(this).parent().parent().hide("slow");
});
return this;
}
上訴代碼編寫(xiě)了本應(yīng)用中中間窗口案例的插件,調(diào)用代碼如下:
window.js
$(document).ready(function() {
$("#centerpop").click(function() {
$("#center").mywin().show("slow");
});
});
插件中的代碼思路是:為了計(jì)算窗口div的left和top屬性值,我們需要拿到瀏覽器窗口的長(zhǎng)browserWidth和寬browserHeight,以及窗口是否因?yàn)閮?nèi)容過(guò)多而又滾動(dòng)條的位置scrollLeft和scrollTop。窗口div的left值=滾動(dòng)條橫坐標(biāo)+(瀏覽器窗口的橫向長(zhǎng)度-窗口div橫向長(zhǎng)度)/2,top值=滾動(dòng)條縱坐標(biāo)+(瀏覽器窗口的縱向長(zhǎng)度-窗口div縱向長(zhǎng)度)/2。
最終完成完整的jQuery代碼如下:
$(document).ready(function(){
var centerwin = $("#center");
var leftwin = $("#left");
var rightwin = $("#right");
$("#centerpop").click(function(){
//鼠標(biāo)點(diǎn)擊按鈕之后,把id為center的窗口顯示在頁(yè)面中間
//計(jì)算位于屏幕中間的窗口的左邊界和上邊界的值
//瀏覽器可視區(qū)域的寬和高,當(dāng)前窗口的寬和高
//需要考慮到橫向滾動(dòng)條的當(dāng)前左邊界值以及縱向滾動(dòng)條的當(dāng)前上邊界值
centerwin.show("slow");
});
$("#leftpop").click(function() {
leftwin.slideDown("slow");
});
setTimeout(function () {
centerwin.mywin({left: "center", top: "center"});
leftwin.mywin({left: "left", top: "bottom"}, function(){
leftwin.slideUp("slow");
});
var windowobj = $(window);
var cwinwidth = rightwin.outerWidth(true);
var cwinheight = rightwin.outerHeight(true);
var browserwidth = windowobj.width();
var browserheight = windowobj.height();
var scrollLeft = windowobj.scrollLeft();
var scrollTop = windowobj.scrollTop();
var rleft = scrollLeft + browserwidth - cwinwidth;
if ($.browser.safari) {
rleft = rleft - 15;
}
if ($.browser.opera) {
rleft = rleft + 15;
}
if ($.browser.msie && $.browser.version.indexOf("8") >= 0) {
rleft = rleft - 20;
}
rightwin.mywin({left: "right", top: "bottom"}, function() {
rightwin.hide();
},{left: rleft, top: scrollTop + browserheight}).fadeOut(15000).dequeue();
},500);
});
/**
*@param position表示窗口的最終位置,包含兩個(gè)屬性,一個(gè)是left,一個(gè)是top
*@param hidefunc表示執(zhí)行窗口隱藏的方法
*@param initPos表示窗口初始位置,包含兩個(gè)屬性,一個(gè)是left,一個(gè)是top
*/
$.fn.mywin = function(position, hidefunc, initPos) {
if (position && position instanceof Object) {
var positionleft = position.left;
var positiontop = position.top;
var left;
var top;
var windowobj = $(window);
var currentwin = this;
var cwinwidth;
var cwinheight;
var browserwidth;
var browserheight;
var scrollLeft;
var scrollTop;
//計(jì)算瀏覽器當(dāng)前可視區(qū)域的寬和高,以及滾動(dòng)條左邊界,上邊界的值
function getBrowserDim() {
browserwidth = windowobj.width();
browserheight = windowobj.height();
scrollLeft = windowobj.scrollLeft();
scrollTop = windowobj.scrollTop();
}
//計(jì)算窗口真實(shí)的左邊界值
function calLeft(positionleft, scrollLeft, browserwidth, cwinwidth) {
if (positionleft && typeof positionleft == "string") {
if (positionleft == "center") {
left = scrollLeft + (browserwidth - cwinwidth) / 2;
} else if (positionleft == "left") {
left = scrollLeft;
} else if (positionleft == "right") {
left = scrollLeft + browserwidth - cwinwidth;
if ($.browser.safari) {
left = left - 15;
}
if ($.browser.opera) {
left = left + 15;
}
if ($.browser.msie && $.browser.version.indexOf("8") >= 0) {
left = left - 20;
}
} else {
left = scrollLeft + (browserwidth - cwinwidth) / 2;
}
} else if (positionleft && typeof positionleft == "number") {
left = positionleft;
} else {
left = 0;
}
}
//計(jì)算窗口真實(shí)的上邊界值
function calTop(positiontop, scrollTop, browserheight, cwinheight) {
if (positiontop && typeof positiontop == "string") {
if (positiontop == "center") {
top = scrollTop + (browserheight - cwinheight) / 2;
} else if (positiontop == "top") {
top = scrollTop;
} else if (positiontop == "bottom") {
top = scrollTop + browserheight - cwinheight;
if ($.browser.opera) {
top = top - 25;
}
} else {
top = scrollTop + (browserheight - cwinheight) / 2;
}
} else if (positiontop && typeof positiontop == "number") {
top = positiontop;
} else {
top = 0;
}
}
//移動(dòng)窗口的位置
function moveWin() {
calLeft(currentwin.data("positionleft"), scrollLeft, browserwidth, cwinwidth);
calTop(currentwin.data("positiontop"), scrollTop, browserheight, cwinheight);
currentwin.animate({
left: left,
top: top
},600);
}
//定義關(guān)閉按鈕的動(dòng)作
currentwin.children(".title").children("img").click(function() {
if (!hidefunc) {
currentwin.hide("slow") ;
} else {
hidefunc();
}
});
if (initPos && initPos instanceof Object) {
var initLeft = initPos.left;
var initTop = initPos.top;
if (initLeft && typeof initLeft == "number") {
currentwin.css("left", initLeft);
} else {
currentwin.css("left", 0);
}
if (initTop && typeof initTop == "number") {
currentwin.css("top", initTop);
} else {
currentwin.css("top", 0);
}
currentwin.show();
}
cwinwidth = currentwin.outerWidth(true);
cwinheight = currentwin.outerHeight(true);
currentwin.data("positionleft", positionleft);
currentwin.data("positiontop", positiontop);
getBrowserDim();
moveWin();
var scrollTimeout;
//瀏覽器滾動(dòng)條滾動(dòng)時(shí),移動(dòng)窗口的位置
$(window).scroll(function(){
//判斷一下當(dāng)前窗口是否可見(jiàn)
if (!currentwin.is(":visible")) {
return;
}
clearTimeout(scrollTimeout);
scrollTimeout = setTimeout(function(){
getBrowserDim();
moveWin();
},300);
});
//瀏覽器大小改變時(shí),移動(dòng)窗口的位置
$(window).resize(function(){
//判斷一下當(dāng)前窗口是否可見(jiàn)
if (!currentwin.is(":visible")) {
return;
}
getBrowserDim();
moveWin();
});
//返回當(dāng)前對(duì)象,以便可以級(jí)聯(lián)的執(zhí)行其他方法
return currentwin;
}
}
左下角和中間窗口的div是靠觸發(fā)click事件來(lái)顯示窗口,在滾動(dòng)條滾動(dòng)時(shí)觸發(fā)scroll事件來(lái)重新調(diào)用計(jì)算div的top和left的函數(shù)。右下角的窗口是徐徐升起的窗口,所以在文檔加載完成的時(shí)候就顯示窗口,處理的代碼是放在setTimeout()事件里面,setTimeout函數(shù)里面的fadeOut讓窗口達(dá)到漸變透明的效果。
案例代碼托管地址:https://github.com/shizongger/JqueryInAction
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- jquery ui dialog實(shí)現(xiàn)彈窗特效的思路及代碼
- Jquery實(shí)現(xiàn)自定義彈窗示例
- jquery制作彈窗提示窗口代碼分享
- 小巧強(qiáng)大的jquery layer彈窗彈層插件
- 運(yùn)用JQuery的toggle實(shí)現(xiàn)網(wǎng)頁(yè)加載完成自動(dòng)彈窗
- 一款基于jQuery的圖片場(chǎng)景標(biāo)注提示彈窗特效
- jquery彈窗插件colorbox綁定動(dòng)態(tài)生成元素的方法
- jQuery探測(cè)位置的提示彈窗(toolTip box)詳細(xì)解析
- jquery模擬alert的彈窗插件
- jQuery彈簧插件編寫(xiě)基礎(chǔ)之“又見(jiàn)彈窗”
相關(guān)文章
JQuery 實(shí)現(xiàn)文件下載的常用方法分析
這篇文章主要介紹了JQuery 實(shí)現(xiàn)文件下載的常用方法,結(jié)合實(shí)例形式分析了jQuery的GET方式、POST方式及HTML5 Blob對(duì)象等常見(jiàn)的文件下載機(jī)制、原理與實(shí)現(xiàn)方法,需要的朋友可以參考下2019-10-10
jQuery+AJAX實(shí)現(xiàn)遮罩層登錄驗(yàn)證界面(附源碼)
這篇文章主要介紹了jQuery+AJAX實(shí)現(xiàn)遮罩層登錄驗(yàn)證界面,并分享了源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-10-10
增強(qiáng)用戶體驗(yàn)友好性之jquery easyui window 窗口關(guān)閉時(shí)的提示
在項(xiàng)目中,客戶提出這么個(gè)要求,就是在關(guān)閉彈出的窗口的時(shí)候,如果點(diǎn)擊 紅X 或 取消按鈕 則提示 ”確認(rèn)保存了當(dāng)前的操作“ 這么個(gè)信息,否則就不提示啦2012-06-06
jQuery實(shí)現(xiàn)的隔行變色功能【案例】
這篇文章主要介紹了jQuery實(shí)現(xiàn)的隔行變色功能,結(jié)合具體實(shí)例形式分析了jQuery事件響應(yīng)、元素遍歷及屬性動(dòng)態(tài)操作相關(guān)使用技巧,需要的朋友可以參考下2019-02-02
jQuery實(shí)現(xiàn)checkbox全選功能完整實(shí)例
這篇文章主要介紹了jQuery實(shí)現(xiàn)checkbox全選功能,結(jié)合完整實(shí)例形式分析了jQuery事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-07-07
在一個(gè)頁(yè)面實(shí)現(xiàn)兩個(gè)zTree聯(lián)動(dòng)的方法
最近發(fā)現(xiàn)項(xiàng)目中很多地方都是樹(shù)形菜單,而這些樹(shù)形菜單都是使用樹(shù)形插件zTree來(lái)制作的,下面這篇文章主要給大家介紹了關(guān)于在一個(gè)頁(yè)面實(shí)現(xiàn)兩個(gè)zTree聯(lián)動(dòng)的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
jQuery實(shí)現(xiàn)的簡(jiǎn)單日歷組件定義與用法示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)的簡(jiǎn)單日歷組件定義與用法,結(jié)合實(shí)例形式詳細(xì)分析了基于jQuery擴(kuò)展實(shí)現(xiàn)日歷功能的相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
jQuery實(shí)現(xiàn)提交按鈕點(diǎn)擊后變成正在處理字樣并禁止點(diǎn)擊的方法
這篇文章主要介紹了jQuery實(shí)現(xiàn)提交按鈕點(diǎn)擊后變成正在處理字樣并禁止點(diǎn)擊的方法,涉及jQuery中val與attr方法的使用技巧,需要的朋友可以參考下2015-03-03
JQuery動(dòng)態(tài)添加和刪除表格行的方法
這篇文章主要介紹了JQuery動(dòng)態(tài)添加和刪除表格行的方法,實(shí)例分析了jQuery中動(dòng)態(tài)操作表格行的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03

