一個基於jQuery寫的彈窗效果(附源碼)


      最近項目中頻繁遇到需要彈出窗口的功能,一直使用瀏覽器默認的Alert和Confirm彈窗,感覺視覺效果不是那么好,而從網上下載的話又找不到合適的,找到的話有些也是十分臃腫,有時候感覺學習配置的功夫自己也就搞一個了(順便說一句,我呢,屬於比較懶的那種人,如果學習和配置需要花很多時間的話我一般是懶得學習的)。

     於是就本着“自己動手,豐衣足食”的原則,自己做了一個彈出的效果,以滿足自己的“小小”的需求,可以直接通過配置CSS來修改相關樣式。

      主要是將Javascript中的alert和confirm這兩個默認的彈窗進行了美化,在做的過程中使用了部分CSS3的一些屬性,因此可能在部分低智商的比如IE系列的6、7上面會出現一些偏差,但整體上還是兼容的。

     我的設計主要支持的功能如下:

     1、在當前窗口的正中位置彈出窗口;

     2、彈出窗口之后,有一個半透明的遮罩層將后面的內容擋着;

     3、能夠支持彈窗的拖動(這個功能剛好能用到前一段時間寫的那個鼠標拖拽效果,可以點擊這里查看,順便將鼠標拖拽效果進行了一下更新,修訂了一點點BUG);

     4、部分參數的可配置;

     5、可以在彈窗中引用其他的URL

     6、點擊確定或者取消之后可以定義要執行的函數

     顯示效果如下圖所示:

     主要代碼如下所示:

     先上JS

/**
* DialogBySHF Library v1.0.0
* http://cnblogs.com/iamshf
*
* author:盛浩峰
* Date: 2013-06-14
*/
(function ($) {
    //默認參數
    var PARAMS;
    var DEFAULTPARAMS = { Title: "Windows彈出消息", Content: "", Width: 400, Height: 300, URL: "", ConfirmFun: new Object, CancelFun: new Object };
    var ContentWidth = 0;
    var ContentHeight = 0;
    $.DialogBySHF = {
        //彈出提示框
        Alert: function (params) {
            Show(params, "Alert");
        },
        //彈出確認框
        Confirm: function (params) { Show(params, "Confirm"); },
        //彈出引用其他URL框
        Dialog: function (params) { Show(params, "Dialog") },
        //關閉彈出框
        Close: function () {
            $("#DialogBySHFLayer,#DialogBySHF").remove();
        }
    };
    //初始化參數
    function Init(params) {
        if (params != undefined && params != null) {
            PARAMS = $.extend({},DEFAULTPARAMS, params);
        }
        ContentWidth = PARAMS.Width - 10;
        ContentHeight = PARAMS.Height - 45;
    };
    //顯示彈出框
    function Show(params, caller) {
        Init(params);
        var screenWidth = $(window).width();
        var screenHeight = $(window).height();
        //在屏幕中顯示的位置(正中間)
        var positionLeft = (screenWidth - PARAMS.Width) / 2 + $(document).scrollLeft();
        var positionTop = (screenHeight - PARAMS.Height) / 2 + $(document).scrollTop();
        var Content = [];
        Content.push("<div id=\"DialogBySHFLayer\" style=\"width:" + $(document).width() + "px;height:" + $(document).height() + "px;\"></div>");
        Content.push("<div id=\"DialogBySHF\" style=\"width:" + PARAMS.Width + "px;height:" + PARAMS.Height + "px;left:" + positionLeft + "px;top:" + positionTop + "px;\">");
        Content.push("    <div id=\"Title\"><span>" + PARAMS.Title + "</span><span id=\"Close\">&#10005;</span></div>");
        Content.push("    <div id=\"Container\" style=\"width:" + ContentWidth + "px;height:" + ContentHeight + "px;\">");
        if (caller == "Dialog") {
            Content.push("        <iframe src=\"" + PARAMS.URL + "\"></iframe>");
        }
        else {
            var TipLineHeight = ContentHeight - 60;
            Content.push("        <table>");
            Content.push("            <tr><td id=\"TipLine\" style=\"height:" + TipLineHeight + "px;\">" + PARAMS.Content + "</td></tr>");
            Content.push("            <tr>");
            Content.push("                <td id=\"BtnLine\">");
            Content.push("                    <input type=\"button\" id=\"btnDialogBySHFConfirm\" value=\"確定\" />");
            if (caller == "Confirm") {
                Content.push("                    <input type=\"button\" id=\"btnDialogBySHFCancel\" value=\"取消\" />");
            }
            Content.push("                </td>");
            Content.push("            </tr>");
            Content.push("        </table>");
        }
        Content.push("    </div>");
        Content.push("</div>");
        $("body").append(Content.join("\n"));
        SetDialogEvent(caller);
    }
    //設置彈窗事件
    function SetDialogEvent(caller) {
        $("#DialogBySHF #Close").click(function () { $.DialogBySHF.Close(); });
        $("#DialogBySHF #Title").DragBySHF($("#DialogBySHF"));
        if (caller != "Dialog") {
            $("#DialogBySHF #btnDialogBySHFConfirm").click(function () {
                $.DialogBySHF.Close();
                if ($.isFunction(PARAMS.ConfirmFun)) {
                    PARAMS.ConfirmFun();
                }
            })
        }
        if (caller == "Confirm") {
            $("#DialogBySHF #btnDialogBySHFCancel").click(function () {
                $.DialogBySHF.Close();
                if ($.isFunction(PARAMS.CancelFun)) {
                    PARAMS.CancelFun();
                }
            })
        }
    }
})(jQuery);

//拖動層
(function ($) {
    $.fn.extend({
        DragBySHF: function (objMoved) {
            return this.each(function () {
                //鼠標按下時的位置
                var mouseDownPosiX;
                var mouseDownPosiY;
                //移動的對象的初始位置
                var objPosiX;
                var objPosiY;
                //移動的對象
                var obj = $(objMoved) == undefined ? $(this) : $(objMoved);
                //是否處於移動狀態
                var status = false;

                //鼠標移動時計算移動的位置
                var tempX;
                var tempY;

                $(this).mousedown(function (e) {
                    status = true;
                    mouseDownPosiX = e.pageX;
                    mouseDownPosiY = e.pageY;

                    objPosiX = obj.css("left").replace("px", "");
                    objPosiY = obj.css("top").replace("px", "");
                }).mouseup(function () {
                    status = false;
                });
                $("body").mousemove(function (e) {
                    if (status) {
                        tempX = parseInt(e.pageX) - parseInt(mouseDownPosiX) + parseInt(objPosiX);
                        tempY = parseInt(e.pageY) - parseInt(mouseDownPosiY) + parseInt(objPosiY);
                        obj.css({ "left": tempX + "px", "top": tempY + "px" });
                    }
                }).mouseup(function () {
                    status = false;
                }).mouseleave(function () {
                    status = false;
                });
            });
        }
    })
})(jQuery);

     這是CSS代碼,如果修改樣式的話可以從此處修改

/*彈出來的遮罩層*/
#DialogBySHFLayer
{
    position:absolute;
    /*width:100%;
    height:100%;*/
    left:0;
    top:0;
    z-index:500;
    background-color:#333333;
    filter:alpha(Opacity=40);
    -moz-opacity:0.4;
    opacity: 0.4;
}
/*彈出的提示框*/
#DialogBySHF
{
    position:absolute;
    /*left:50%;
    top:50%;
    width:400px;
    height:400px;*/
    border-radius:10px;
    box-shadow:0 0 8px rgba(0, 0, 0, .8);
    background-color:#f2f2f2;
    z-index:600;
}
#DialogBySHF #Title
{
    margin:0;
    width:100%;
    height:35px;
    background-color:#ffa500;
    color:#FFFFFF;
    font-family:微軟雅黑,黑體,宋體;
    font-weight:bold;
    font-size:18px;
    text-align:center;
    cursor:move;
    line-height:35px;
    border-radius:10px 10px 0 0;
}
#DialogBySHF #Close
{
    position:absolute;
    right:7px;
    top:7px;
    height:21px;
    line-height:21px;
    width:21px;
    cursor:pointer;
    display:block;
    border:1px solid #da8e02;
    box-shadow:0 0 4px rgba(255, 255, 255, .9);
    border-radius:5px;
}
#DialogBySHF #Container
{
    padding:0px 5px 5px 5px;
    /*width:390px;
    height:355px;*/
}
#DialogBySHF #Container table,#DialogBySHF #Container iframe
{
    width:100%;
    height:100%;
}
#DialogBySHF #Container table td
{
    vertical-align:middle;
}
#DialogBySHF #Container table #TipLine
{
    padding:0 30px;
}
#DialogBySHF #Container table #BtnLine
{
    height:60px;
    text-align:center;
}
#DialogBySHF #Container table #BtnLine input
{
    margin:6px 11px;
    -moz-user-select: none;
    background-color:#F5F5F5;
    background-image: -moz-linear-gradient(center top , #F5F5F5, #F1F1F1);
    background-image:-ms-linear-gradient(rgb(245, 245, 245), rgb(241, 241, 241));
    background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);
    border:1px solid rgba(0,0,0,0.1);
    *border:1px solid #DDDDDD;
    border:1px solid #DDDDDD\0;
    border-radius:2px;
    font-family:新宋體;
    color:#666666;
    cursor:default;
    font-size:12px;
    font-weight:bold;
    height:29px;
    line-height:27px;
    min-width:54px;
    padding:0 8px;
    text-align:center;
}
#DialogBySHF #Container table #BtnLine input:hover
{
    background-color: #F8F8F8;
    background-image: -moz-linear-gradient(center top , #F8F8F8, #F1F1F1);
    border: 1px solid #C6C6C6;
    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
    color: #333333;
}
#DialogBySHF #Container table #BtnLine input:focus
{
    border: 1px solid #4D90FE;
    outline: medium none;
}

     使用方法如下所示:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>彈出窗體Demo演示</title>
<link rel="Stylesheet" type="text/css" href="DialogBySHF.css" />
</head>

<body>
    <input type="button" value="彈出提示框" id="btnAlert" />
    <input type="button" value="彈出確認框" id="btnConfirm" />
    <input type="button" value="引用其他頁面" id="btnDialog" />
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="DialogBySHF.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        $("#btnAlert").click(function () {
            $.DialogBySHF.Alert({ Width: 400, Height: 300, Title: "提示信息", Content: '你好,這是彈出提示,即JS中的alert', ConfirmFun: test });
        })
        $("#btnConfirm").click(function () {
            $.DialogBySHF.Confirm({ Width: 400, Height: 300, Title: "提示信息", Content: '你好,這是確認信息,類似於JS中的confirm', ConfirmFun: test, CancelFun: testCancel });
        })
        $("#btnDialog").click(function () {
            $.DialogBySHF.Dialog({ Width: 1024, Height: 768, Title: "搜狐網站", URL: 'http://www.sohu.com' });
        })
    })
    function test() {
        $.DialogBySHF.Alert({ Width: 400, Height: 300, Title: "確認后執行方法", Content: '確認后執行的方法' });
    }
    function testCancel() {
        $.DialogBySHF.Alert({ Width: 400, Height: 300, Title: "取消后執行方法", Content: '取消后執行的方法' });
    }
</script>
</body>
</html>

     源碼和Demo都可以從這里下載:點擊下載

     當然,也可以在Google Code上下載源碼,我將源碼放在了Google Code上面,如果有更新的話也會在Google Code上面進行更新,Google Code地址為:https://code.google.com/p/dialogbyshf/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM