Jquery学习之路(三) 实现弹出层插件
弹出层的应用还是比较多的,登陆,一些同页面的操作,别人的总归是别人的,自己的才是自己的,所以一直以来想写个弹出层插件。不多废话,直接开始吧!
不想看可以在这里直接下载源码xsPop.zip
1:遮罩层
要弹出层,先要用一个遮罩层挡在下面的页面,此遮罩层是全屏的,页面滚动也要有,所以设置 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:;
overflow: auto;
top: 0px;
right: 0px;
}
2:插件主要参数
tag:为什么需要tag?用tag可以指定需要弹出的隐藏元素,可以指定tag为选择器“#*”,这样可以弹出指定元素。这里我设置默认为this。
mainContent:这个参数是否需要?我觉得用处不大,我设置主要是为了对服务器控件,如果全部加在body,那就不能提交表单。但是submit点击后页面会刷新,弹出层消失,所以我觉得还是无用...
$.fn.xsPop = function (options) {
var defaults = {//默认值
title: "弹出窗口", //窗口标题
width: 500,
heigth: 400,
tag: this, //弹出需要加载的元素
close: "关闭",
mainContent: "body"//容器,为了可以提交表单,不过submit会刷新页面... };
var options = $.extend(defaults, options); //以传参覆盖
this.each(function () {
xsMain(options.title, options.width, options.heigth, options.tag, options.close, options.mainContent); //插件的主入口
});
};
3:利用xsMain函数添加元素,并绑定事件
这里有个处理,就是控制高度和宽度如果设置超过了屏幕高宽度,就会适应屏幕,这样防止弹出层过大不能操作。其他的就是普通的添加html,本人用的string相加
//根据传入数据,添加遮罩层,弹出提示框
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"); //得到浏览器的高度和宽度,进行后面判断(高度超过,拖动边框限制)
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"); //绑定拖动动作
$("#xsColse").bind("click", function () { ClosePop(tag, mainContent); }); //绑定关闭动作
}
4:关闭动作
这里要先把tag给容器,不然后面remove时会一起remove,第二次弹出就找不到tag了。
//关闭弹出层
function ClosePop(tag, mainContent) {
$(mainContent).append(tag); //保存,不然第四步的 $("#xsPop").remove()会把tag清空掉
$(tag).hide();
$(".mask").remove();
$("#xsPop").remove();
}
5:拖拽效果
方法一:第一次找到的是利用元素的事件,但是很容易出现元素丢失问题,效果不太理想
//弹出层的拖拽(失败的方法,会出现对象丢失)
//control 为拖拽的元素,tag为动作的元素,一般control在tag内
// 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,但是还要有些许问题,移动过快的问题,坐标有小小的跳动现象
我还发现一个问题,如果我手残把弹出层直接拖到了屏幕上方的内部,这时放手,呵呵,你永远也不能把它拖回来或点关闭了。我去看了下百度首页的弹出层,他们也有这样的现象,但是把窗口点放大缩小后弹出层会重新回到中心。我也试着这样做,但是我绑定onresize会出现不能向最下面移动,他们用的事件肯定不是onresize.所以我就直接判断鼠标位置不能小于0了。
//弹出层的拖拽
//control 为拖拽的元素,tag为动作的元素,一般control在tag内
function xsdrag(control, tag) {
$(control).mousedown(function (e)//e鼠标事件
{
var offset = $(this).offset(); //DIV在页面的位置
var x = e.pageX - offset.left; //获得鼠标指针离DIV元素左边界的距离
var y = e.pageY - offset.top; //获得鼠标指针离DIV元素上边界的距离
$(document).bind("mousemove", function (ev)//绑定鼠标的移动事件,因为光标在DIV元素外面也要有效果,所以要用doucment的事件,而不用DIV元素的事件
{
if (ev.pageY <= 0) { return; }//防止边框超过屏幕后无法关闭和拖动
$(tag).css({
'left': ev.pageX - x + $(tag).width() / 2, //本人的布局需要加这个
'top': ev.pageY - y + $(tag).height() / 2
});
}); });
$(document).mouseup(function () {
$(this).unbind("mousemove");
});
}
6:样式表
弹出层的布局使用的是top和left+margin-top负值,所以我的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:;
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:页面的使用
测试服务器控件可以提交表单
$(document).ready(function () {
$("#btnPop").click(function () {
var options = {
title: "my pop",
width: 500,
heigth: 400,
close: "close",
mainContent: "form"
}
$("#pop1").xsPop(options); });
});
8:源码下载
下载地址:xsPop.zip
好了差不多就这些了。本来还想做个边框拉动改变大小的,发现需要点时间,就先不做了。其实说实话,我觉得拖拽意义不大,边框控制大小意义也不大,因为我设置了溢出会出现滚动条。
还闲扯一下,昨晚梦到发现博客园大神在我周围,然后我就约他出来吃饭,看到后发现是个戴眼镜的年轻人,我说想跟着他去学东西,他就把我带到他们公司,里面就几个人,还比较乱。我的想法是周末去免费帮他做事顺便学东西,可是他们周末不上班... 后面就是一大段角色扮演,魔幻武侠情结,呵呵,反正我的梦一般情节比较完整,有时场面还比较宏大,其实做做梦也是不错的么!悲剧的做梦后,早上上班迟到了...
Jquery学习之路(三) 实现弹出层插件的更多相关文章
- 效果非常好的 Jquery弹出层插件 jQuery Sweet alert
介绍款交互性非常不错的jquery弹出层插件,支持消息提示.错误提示.确认框提示等. 交互式体验感非常不错,比如咱们现在体验非常不错的微信支付.支付宝等完成后的效果. 不过本插件至少支持IE9+ Jq ...
- jQuery弹出层插件popbox
都什么年代了,还自己写弹出层插件!是的,①自己写的自己好控制②可定制性高③兼容低版本IE 本插件有以下特性: 样式分离,可定制,纯净无图片 可自定义按钮及按钮的样式.点击事件 可指定选择器选择页面元素 ...
- 写了一个jquery的 弹出层插件。
下载地址:http://pan.baidu.com/s/1eQ26CMm ps:ajax加载做的,要有环境才能正常运行哦! //这是一个以ajax加载显示弹出层插件 参数(option): widt ...
- 在Vue中使用layer.js弹出层插件
layer.js(mobile)是一个小巧方便的弹出层插件,在之前的apicloud项目中被大量使用,但最近对apicloud的IDE.非常不友好的文档和极低的开发效率深感厌烦,决定弃用然后转向Vue ...
- layer/layui弹出层插件bug
<button class="layui-btn" lay-submit lay-filter="formDemo" id="layui-btn ...
- layer —— 一个简单的jQuery弹出层插件
layer的使用 4.24更新:注意:layer现在有旧版1.8.5版本和新版本3.0版本的,对应引入的JQ也要不同,相对应的JQ引入1.1和3.1,否则JQ会出问题 4.21更新: 解答4-19的问 ...
- jQuery layer弹出层插件 http://layer.layui.com/直接上官网学
在许多网站中,经常用到弹出层,有时候为了达到更好的用户体验,你将写繁琐的css跟js,这款 jquery-layer可以让你想到即可做到的web弹窗/层js组件.layer侧重于用户灵活的自定义,为不 ...
- 分享一个JQuery弹出层插件
JQuery插件TipsWindown 1.1 一个基于jQuery的弹出层.支持拖拽,支持内容为文字,图片,URL等!至于兼容性.在IE6下,弹出对像无法绝对固定.其他应该没啥大问题: 最新更新:( ...
- 网站开发常用jQuery插件总结(二)弹出层插件Lightbox_me
网站开发过程中,为了增加网站交互效果,我们有时需要在当前页面弹出诸如登陆.注册.设置等窗口.而这些窗口就是层,弹出的窗口就是弹出层.jQuery中弹出层插件很多,但有些在html5+css3浏览器下, ...
随机推荐
- Ubuntu desktop基本操作
2018-03-03 11:48:52 ubuntu16 lts 更换源,系统安装的时候可以跳过语言包的安装 打开software & updates应用,Other software选项页, ...
- Struts1文件上传
package org.zln.struts.domain; import org.apache.struts.upload.FormFile; /** * Created by sherry on ...
- 大数据Hadoop-1
大数据Hadoop学习之搭建hadoop平台(2.2) 关于大数据,一看就懂,一懂就懵. 一.概述 本文介绍如何搭建hadoop分布式集群环境,前面文章已经介绍了如何搭建hadoop单机环境和伪分 ...
- 国内各运营商(ISP)IP段表
国内各运营商(ISP)IP段表 来源:http://bbs.hh010.com/forum.php?mod=viewthread&tid=490529&orderby=dateline ...
- 详解npm的模块安装机制
详解npm的模块安装机制 依赖树表面的逻辑结构与依赖树真实的物理结构 依赖树表面的逻辑结构与依赖树真实的物理结构并不一定相同! 这里要先提到两个命令:tree -d(linux)和npm ls(npm ...
- [bzoj1062] [NOI2008]糖果雨
Description 有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成的.更加神奇的是,天空中飘满了五颜六色的糖果云,很快糖果 ...
- [洛谷P2604][ZJOI2010]网络扩容
题目大意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小费用. 题解 ...
- NOI2018 D1T1 [NOI2018]归程 解题报告
P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...
- 非阻塞式JavaScript脚本及延伸知识
JavaScript 倾向于阻塞浏览器某些处理过程,如HTTP 请求和界面刷新,这是开发者面临的最显著的性能问题.保持JavaScript文件短小,并限制HTTP请求的数量,只是创建反应迅速的网页应用 ...
- [Usaco2005 Dec]Cleaning Shifts 清理牛棚 (DP优化/线段树)
[Usaco2005 Dec] Cleaning Shifts 清理牛棚 题目描述 Farmer John's cows, pampered since birth, have reached new ...