Jquery 實(shí)現(xiàn)彈出層插件
彈出層的應(yīng)用還是比較多的,登陸,一些同頁面的操作,別人的總歸是別人的,自己的才是自己的,所以一直以來想寫個(gè)彈出層插件。不多廢話,直接開始吧!
1:遮罩層
要彈出層,先要用一個(gè)遮罩層擋在下面的頁面,此遮罩層是全屏的,頁面滾動(dòng)也要有,所以設(shè)置 position: fixed;還要有透明效果,下面是我定義的遮罩層css,取名mask
.mask
{
position: fixed;
width: 100%;
height: 100%;
background-color: white;
overflow: scroll;
filter: alpha(opacity=50);
-moz-opacity: 0.5;
opacity: 0.5;
z-index: 20;
overflow: auto;
top: 0px;
right: 0px;
}
2:插件主要參數(shù)
tag:為什么需要tag?用tag可以指定需要彈出的隱藏元素,可以指定tag為選擇器“#*”,這樣可以彈出指定元素。這里我設(shè)置默認(rèn)為this。
mainContent:這個(gè)參數(shù)是否需要?我覺得用處不大,我設(shè)置主要是為了對服務(wù)器控件,如果全部加在body,那就不能提交表單。但是submit點(diǎn)擊后頁面會刷新,彈出層消失,所以我覺得還是無用...
$.fn.xsPop = function (options) {
var defaults = {//默認(rèn)值
title: "彈出窗口", //窗口標(biāo)題
width: 500,
heigth: 400,
tag: this, //彈出需要加載的元素
close: "關(guān)閉",
mainContent: "body"http://容器,為了可以提交表單,不過submit會刷新頁面...
};
var options = $.extend(defaults, options); //以傳參覆蓋
this.each(function () {
xsMain(options.title, options.width, options.heigth, options.tag, options.close, options.mainContent); //插件的主入口
});
};
3:利用xsMain函數(shù)添加元素,并綁定事件
這里有個(gè)處理,就是控制高度和寬度如果設(shè)置超過了屏幕高寬度,就會適應(yīng)屏幕,這樣防止彈出層過大不能操作。其他的就是普通的添加html,本人用的string相加
//根據(jù)傳入數(shù)據(jù),添加遮罩層,彈出提示框
function xsMain(title, width, height, tag, close, mainContent) {
var divmask = "<div class=\"mask\"></div>";
$(mainContent).append(divmask);
var xsPop1 = " <div id=\"xsPop\" class=\"PopUp\"> <div class=\"PopHead\" id=\"xsPopHead\">";
var xsPop2 = " <b>" + title + " </b><span id=\"xsColse\">" + close + "</span>";
var xsPop3 = " </div> <div class=\"PopMain\" id=\"xsPopMain\">";
var xsPop5 = "</div><span id=\"xytest\"></span> </div>";
var allHtml = xsPop1 + xsPop2 + xsPop3 + xsPop5;
$(mainContent).append(allHtml);
$(tag).show();
$(tag).appendTo("#xsPopMain");
//得到瀏覽器的高度和寬度,進(jìn)行后面判斷(高度超過,拖動(dòng)邊框限制)
clientHeight = window.screen.height;
clientWidth = window.screen.width;
if (height > clientHeight) {
height = clientHeight - 100;
}
if (width > clientWidth) {
width = clientWidth - 100;
}
$("#xsPop").css({
"heigth": height + "px",
"width": width + "px",
"margin-top": "-" + (height / 2) + "px",
"margin-left": "-" + (width / 2) + "px"
});
$("#xsPopMain").css("height", height - $("#xsPopHead").height());
xsdrag("#xsPopHead", "#xsPop"); //綁定拖動(dòng)動(dòng)作
$("#xsColse").bind("click", function () { ClosePop(tag, mainContent); }); //綁定關(guān)閉動(dòng)作
}
4:關(guān)閉動(dòng)作
這里要先把tag給容器,不然后面remove時(shí)會一起remove,第二次彈出就找不到tag了。
//關(guān)閉彈出層
function ClosePop(tag, mainContent) {
$(mainContent).append(tag); //保存,不然第四步的 $("#xsPop").remove()會把tag清空掉
$(tag).hide();
$(".mask").remove();
$("#xsPop").remove();
}
5:拖拽效果
方法一:第一次找到的是利用元素的事件,但是很容易出現(xiàn)元素丟失問題,效果不太理想
//彈出層的拖拽(失敗的方法,會出現(xiàn)對象丟失)
//control 為拖拽的元素,tag為動(dòng)作的元素,一般control在tag內(nèi)
// function drag(control, tag) {
// var isMove = false;
// var abs_x = 0, abs_y = 0;
// $(control).mousedown(
// function (event) {
// var top = $(tag).offset().top;
// var left = $(tag).offset().left;
// abs_x = event.pageX - left;
// abs_y = event.pageY - top;
// isMove = true;
// }).mouseleave(function () {
// isMove = false;
// });
// $(control).mouseup(function () {
// isMove = false;
// });
// $(document).mousemove(function (event) {
// if (isMove) {
// $(tag).css({
// 'left': event.pageX - abs_x + $(tag).width() / 2 - 1,
// 'top': event.pageY - abs_y + $(tag).height() / 2 - 1
// });
// }
// return false;
// });
// }
方法二,本人目前采用的方法,利用document的down和up,但是還要有些許問題,移動(dòng)過快的問題,坐標(biāo)有小小的跳動(dòng)現(xiàn)象
我還發(fā)現(xiàn)一個(gè)問題,如果我手殘把彈出層直接拖到了屏幕上方的內(nèi)部,這時(shí)放手,呵呵,你永遠(yuǎn)也不能把它拖回來或點(diǎn)關(guān)閉了。我去看了下百度首頁的彈出層,他們也有這樣的現(xiàn)象,但是把窗口點(diǎn)放大縮小后彈出層會重新回到中心。我也試著這樣做,但是我綁定onresize會出現(xiàn)不能向最下面移動(dòng),他們用的事件肯定不是onresize.所以我就直接判斷鼠標(biāo)位置不能小于0了。
//彈出層的拖拽
//control 為拖拽的元素,tag為動(dòng)作的元素,一般control在tag內(nèi)
function xsdrag(control, tag) {
$(control).mousedown(function (e)//e鼠標(biāo)事件
{
var offset = $(this).offset(); //DIV在頁面的位置
var x = e.pageX - offset.left; //獲得鼠標(biāo)指針離DIV元素左邊界的距離
var y = e.pageY - offset.top; //獲得鼠標(biāo)指針離DIV元素上邊界的距離
$(document).bind("mousemove", function (ev)//綁定鼠標(biāo)的移動(dòng)事件,因?yàn)楣鈽?biāo)在DIV元素外面也要有效果,所以要用doucment的事件,而不用DIV元素的事件
{
if (ev.pageY <= 0) { return; }//防止邊框超過屏幕后無法關(guān)閉和拖動(dòng)
$(tag).css({
'left': ev.pageX - x + $(tag).width() / 2, //本人的布局需要加這個(gè)
'top': ev.pageY - y + $(tag).height() / 2
});
});
});
$(document).mouseup(function () {
$(this).unbind("mousemove");
});
}
6:樣式表
彈出層的布局使用的是top和left+margin-top負(fù)值,所以我的js里面有多加高度和寬度的一半
.mask
{
position: fixed;
width: 100%;
height: 100%;
background-color: white;
overflow: scroll;
filter: alpha(opacity=50);
-moz-opacity: 0.5;
opacity: 0.5;
z-index: 20;
overflow: auto;
top: 0px;
right: 0px;
}
.PopUp
{
padding: 0px;
position: absolute;
z-index: 21 !important;
background-color: White;
border-style: solid solid solid solid;
border-width: 1px;
border-color: #C0C0C0;
left: 50%;
top: 50%;
}
.PopHead
{
background-color: #F0F0F0;
border-bottom-style: solid;
border-bottom-width: 1px;
border-bottom-color: #C0C0C0;
height: 30px;
cursor: move;
clip: rect(0px, auto, auto, 0px);
}
.PopHead b
{
float: left;
display: block;
color: #C0C0C0;
font-family: System;
font-size: medium;
line-height: 30px;
text-indent: 2em;
}
.PopHead span
{
float: right;
display: block;
text-align: right;
line-height: 30px;
cursor: pointer;
text-indent: 5px;
color: #FF0000;
font-size: 12pt;
}
.PopMain
{
padding: 10px;
overflow: auto;
}
7:頁面的使用
測試服務(wù)器控件可以提交表單
$(document).ready(function () {
$("#btnPop").click(function () {
var options = {
title: "my pop",
width: 500,
heigth: 400,
close: "close",
mainContent: "form"
}
$("#pop1").xsPop(options);
});
});
好了差不多就這些了。本來還想做個(gè)邊框拉動(dòng)改變大小的,發(fā)現(xiàn)需要點(diǎn)時(shí)間,就先不做了。其實(shí)說實(shí)話,我覺得拖拽意義不大,邊框控制大小意義也不大,因?yàn)槲以O(shè)置了溢出會出現(xiàn)滾動(dòng)條。
- jquery實(shí)現(xiàn)彈出層效果實(shí)例
- jquery簡單的彈出層浮動(dòng)層代碼
- jQuery彈出層插件Lightbox_me使用指南
- jQuery+html5實(shí)現(xiàn)div彈出層并遮罩背景
- jquery處理頁面彈出層查詢數(shù)據(jù)等待操作實(shí)例
- jQuery點(diǎn)縮略圖彈出層顯示大圖片
- jQuery實(shí)現(xiàn)簡單網(wǎng)頁遮罩層/彈出層效果兼容IE6、IE7
- JQuery彈出層示例可自定義
- Js Jquery創(chuàng)建一個(gè)彈出層可加載一個(gè)頁面
- jquery實(shí)現(xiàn)可自動(dòng)判斷位置的彈出層效果代碼
相關(guān)文章
jQuery實(shí)現(xiàn)數(shù)字加減效果匯總
本文將介紹常見的幾種使用spinner數(shù)字微調(diào)器來實(shí)現(xiàn)數(shù)字加減的功能的方法。非常的簡單實(shí)用,這里推薦給大家2014-12-12查看源碼的工具 學(xué)習(xí)jQuery源碼不錯(cuò)的工具
jQuery是一個(gè)非常好用的javascript框架,我尤其喜歡它強(qiáng)大的選擇器和鏈?zhǔn)奖磉_(dá)式,使得我們能通過簡單的語句實(shí)現(xiàn)復(fù)雜的功能。它還有一個(gè)重要的特點(diǎn)就是它的可擴(kuò)展性,使得很多人都可以開發(fā)他們的插件并且分享出來2011-12-12jQuery EasyUI 中文API Layout(Tabs)
發(fā)布jQuery EasyUI 中文API—Layout(Tabs)總結(jié),需要的朋友可以參考下。2010-04-04基于jQuery實(shí)現(xiàn)復(fù)選框是否選中進(jìn)行答題提示
近期有項(xiàng)目需求是這樣的,需要根據(jù)用戶選擇的選項(xiàng)給出相應(yīng)的提示,本文給大家介紹基于jQuery實(shí)現(xiàn)復(fù)選框是否選中進(jìn)行答題提示,對jquery復(fù)選框是否選中相關(guān)知識感興趣的朋友一起看看吧2015-12-12jQuery操作元素的內(nèi)容和樣式完整實(shí)例分析
這篇文章主要介紹了jQuery操作元素的內(nèi)容和樣式,結(jié)合完整實(shí)例形式分析了jquery針對頁面元素內(nèi)容與樣式相關(guān)操作技巧,需要的朋友可以參考下2020-01-01EASYUI TREEGRID異步加載數(shù)據(jù)實(shí)現(xiàn)方法
找了一下官方文檔,看了EASYUI的異步加載,弄了我兩三個(gè)小時(shí),死活都不出數(shù)據(jù)2012-08-08jquery的總體架構(gòu)分析及實(shí)現(xiàn)示例詳解
學(xué)習(xí)開源框架,童鞋們最想學(xué)到的就是設(shè)計(jì)的思想和實(shí)現(xiàn)的技巧。最近研究jQuery源碼,記錄一下我對jquery的理解和心得,跟大家分享,權(quán)當(dāng)拋磚引玉。2014-11-11