`

Jquery学习之路(三) 实现弹出层插件

阅读更多

文章来源:http://www.itnose.net/detail/6051815.html  更多文章:http://www.itnose.net/type/71.html

弹出层的应用还是比较多的,登陆,一些同页面的操作,别人的总归是别人的,自己的才是自己的,所以一直以来想写个弹出层插件。不多废话,直接开始吧!

不想看可以在这里直接下载源码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: 20;
    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: 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:页面的使用

  测试服务器控件可以提交表单

        $(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

好了差不多就这些了。本来还想做个边框拉动改变大小的,发现需要点时间,就先不做了。其实说实话,我觉得拖拽意义不大,边框控制大小意义也不大,因为我设置了溢出会出现滚动条。

  还闲扯一下,昨晚梦到发现博客园大神在我周围,然后我就约他出来吃饭,看到后发现是个戴眼镜的年轻人,我说想跟着他去学东西,他就把我带到他们公司,里面就几个人,还比较乱。我的想法是周末去免费帮他做事顺便学东西,可是他们周末不上班... 后面就是一大段角色扮演,魔幻武侠情结,呵呵,反正我的梦一般情节比较完整,有时场面还比较宏大,其实做做梦也是不错的么!悲剧的做梦后,早上上班迟到了...
 

 

分享到:
评论

相关推荐

    20种弹出层,弹窗 jQuery+CSS3 多功能弹出层插件v2.0.1

    《jQuery+CSS3多功能弹出层插件v2.0.1详解》 在Web开发中,弹出层(也称为对话框或模态窗口)是不可或缺的元素,它们用于显示重要的信息、提示用户确认操作或者提供交互式内容。本文将深入探讨一款名为“20种弹出层...

    jquery弹出层插件

    这款jQuery弹出层插件提供了一种高效且自定义程度高的解决方案,可以轻松实现这些功能。 三、插件特性与使用 1. 方便性:该插件提供了简单的API调用,只需几行代码就能创建一个弹出层,大大降低了开发难度。 2. ...

    jquery弹出层插件SexyLightBox

    **jQuery弹出层插件SexyLightBox详解** 在网页设计中,弹出层是一种常见的交互元素,用于在用户点击某个链接或按钮时显示一个浮动窗口,通常用来展示图片、视频或者详细信息。SexyLightBox是一款基于jQuery的弹出层...

    JQuery弹出层插件

    在前端开发中,jQuery弹出层插件是用于创建弹窗效果的重要工具,它能够帮助开发者轻松实现模态对话框、提示信息、加载提示等交互功能。本篇将详细介绍jQuery弹出层插件,以及如何使用名为"Popup Div"的实例。 首先...

    一款不错的Jquery弹出层插件

    标签“Jquery弹出层插件”进一步明确了这个资源的核心特性,即它是利用JQuery库实现的弹出层功能。JQuery是一个广泛使用的JavaScript库,简化了DOM操作、事件处理和动画等任务,使得开发者能更高效地构建动态网页。...

    jQuery弹出层插件三种简单遮罩弹出框效果.rar

    在"jQuery弹出层插件三种简单遮罩弹出框效果.rar"压缩包中,包含以下关键文件: 1. reveal.css:这是插件的样式文件,定义了弹出层的基本样式和遮罩效果。通过调整这里的CSS代码,可以定制弹出框的外观。 2. demo....

    jQuery弹出层插件三种简单遮罩弹出框效果

    本文将深入探讨标题所提及的"jQuery弹出层插件三种简单遮罩弹出框效果",以及如何利用jQuery实现这些效果。 首先,让我们了解什么是弹出层和遮罩弹出框。弹出层(Popup Layer)是一种常见的网页交互设计,当用户...

    jquery 弹出层插件下载(简单、易用)

    首先,让我们深入了解一下jQuery弹出层插件的基本概念。弹出层通常包括模态对话框和非模态对话框两种类型。模态对话框会阻止用户与页面其他部分的交互,直到弹出层被关闭;而非模态对话框则允许用户在不关闭弹出层的...

    jQuery弹出层插件大全

    jQuery弹出层插件在网页开发中非常常见,它们用于创建弹窗、模态对话框、图片预览等效果,增强了用户体验。以下是一些流行的jQuery弹出层插件及其特点: 1. **Thickbox**: Thickbox是一款轻量级的jQuery插件,用于...

    jQuery zoom图片弹出层插件简单的图片相册弹出层窗口

    jQuery Zoom图片弹出层插件是一种广泛应用于网页设计中的JavaScript库,它允许用户在点击缩略图时,以放大效果展示全尺寸图片,为用户提供更好的视觉体验。这种插件尤其适用于创建图片相册或者产品展示页面,使得...

    jquery 弹出层插件

    **jQuery弹出层插件详解** 在Web开发中,弹出层(Popup)是一种常见的交互设计元素,用于显示额外的信息、对话框或者进行特定操作。jQuery作为一款强大的JavaScript库,提供了丰富的插件来实现弹出层功能。本文将...

    jquery弹出层插件点击弹出层可拖动,弹出层为umeditor

    在IT领域,尤其是在Web开发中,我们经常遇到各种交互式设计和组件的实现,其中“jQuery弹出层插件点击弹出层可拖动,弹出层为umeditor”就是一个典型的例子。这个功能结合了多个技术,包括jQuery、CSS、iframe以及...

    自己写的jquery 弹出层插件,可拖动

    标题中的“自己写的jquery 弹出层插件,可拖动”表明这是一个基于jQuery的自定义弹出框插件,具备拖动功能。在Web开发中,弹出层(也称为对话框或模态窗口)常用于显示警告、确认信息或者提供用户交互界面。这个插件...

    jquery插件库-jquery弹出层 三种弹出效果.zip

    本资源"jquery插件库-jquery弹出层 三种弹出效果.zip"聚焦于jQuery的一个特定应用:弹出层效果。下面我们将详细探讨jQuery弹出层的原理、实现方式以及三种不同的弹出效果。 1. jQuery弹出层基础 jQuery弹出层,通常...

    基于jQuery弹出层插件thickbox

    【jQuery弹出层插件thickbox】是一种广泛使用的JavaScript库,它基于强大的jQuery框架,为网页添加了优雅且功能丰富的弹出层效果。 Thickbox主要用于创建全屏背景的图片查看器、轻量级的模态对话框以及iframe加载等...

    jquery colorbox弹出层插件制作图片弹出显示代码

    《jQuery Colorbox弹出层插件:实现图片弹出显示的代码详解》 在Web开发中,为了提供更好的用户体验,我们常常需要实现一种效果:当用户点击某个元素时,图片或者其他内容以弹出层的形式展示出来。jQuery Colorbox...

    jQuery弹出层插件PopupDiv-v1.0下载

    jQuery弹出层插件PopupDiv-v1.0是一款基于JavaScript库jQuery开发的用户界面组件,主要用于在网页上创建各种类型的弹出窗口。弹出层在Web应用中非常常见,用于显示通知、对话框、表单、图片轮播等多种功能。PopupDiv...

    超级漂亮的Jquery弹出层插件

    超级漂亮的Jquery弹出层插件,可支持以下功能 1、触发响应事件 2、设置弹出层的标题 3、设置弹出层类型(text、容器ID、URL、Iframe) 4、弹出层的内容获取(text文本、容器ID名称、URL地址、Iframe的地址) 5、...

    jquery弹出层 jquery弹出层 jquery弹出层

    标题“jquery弹出层”暗示我们将会探讨的是如何使用jQuery来实现网页上的弹出层效果,这在网页设计中是非常常见的一种功能,用于显示警告、信息、确认对话框或者复杂的模态窗口。 首先,让我们理解什么是弹出层。弹...

Global site tag (gtag.js) - Google Analytics