JS简易弹出层手机版

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS简易弹出层手机版相关的知识,希望对你有一定的参考价值。

简单说明

  手机弹出层模枋了WEIUI.弹出层原理还是依照bootstrap

  去掉了PC端的ESC关闭.点击背景层时也不默认关闭.

模板样子

  技术分享

CSS样式

技术分享
/*弹出时给body加上这个,关闭时去掉*/
.overhide {
    overflow: hidden;
}
/*关键样式 遮罩层的*/
.msgboxshadow {
    position: fixed; /*固定定位*/
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    opacity: .5; /*背景透明度.这里没有兼容样式*/
    background-color: #000; /*背景色*/
    z-index: 10000; /*层级数仅小于内容弹出框*/
}
/*关键样式 弹出框最外层*/
.msgboxbg {
    display: none;
    position: fixed; /*固定定位*/
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    overflow-x: hidden;
    overflow-y: auto;
    z-index: 10001; /*比遮罩层大1,要显示在遮罩层上面*/
}
/*内容层默认样式:效果是水平垂直固定定位居中*/
.msgboxcontent {
    position: fixed;
    border-radius: 3px;
    background-color: #fff;
    box-shadow: 2px 2px 40px #000000;
    top: 50%;
    left: 50%;
    width: 75%;
    max-width:320px;
    /*这三句话固定定位水平居中*/
    -ms-transform: translate(-50%,-50%);
    -webkit-transform: translate(-50%,-50%);
    -moz-transform: translate(-50%,-50%);
    transform: translate(-50%,-50%);
    /**/
    overflow-x: hidden;
    overflow-y: auto;
}

/*模板样式*/
/**共用S*/
/*****标题区*/
.titlearea {
    box-sizing: border-box;
    font-size: 18px;
    color: #444;
}
/*****内容区*/
.contentarea {
    box-sizing: border-box;
    padding: 10px 15px 15px 15px;
    text-indent: 5px;
    font-size: 16px;
    color: #666;
}
/*****按钮区*/
.btnarea {
    box-sizing: border-box;
    font-size: 0;
}
/*****按钮*/
.btnleft, .btnright {
    box-sizing: border-box;
    display: inline-block;
    -moz-user-select: none;
    -ms-user-select: none;
    -webkit-user-select: none;
    user-select: none;
    /**/
    height: 42px;
    line-height: 42px;
    font-size: 18px;
    color: #333;
}

    .btnleft:active, .btnright:active {
        background-color: #eee;
        color: #000;
    }
/*共用E*/

/*ios模板S*/
.ios.titlearea {
    text-align: center;
    padding: 25px 0 5px 0;
}

.ios.contentarea {
    line-height: 1.3;
}

.ios.btnarea {
    border-top: 1px solid #ddd;
}

.ios.btnleft, .ios.btnright {
    width: 50%;
    text-align: center;
}

.ios.btnleft {
    border-right: 1px solid #ddd;
}

    .ios.btnleft:active, .ios.btnright:active {
    }
/*IOS模板E*/

/*安卓模板S*/
.adr.titlearea {
    padding: 25px 0 5px 15px;
}
.adr.contentarea {
    line-height: 1.3;
}
.adr.btnarea{
    text-align:right;
    padding-right:30px;
}
.adr.btnleft, .adr.btnright {
    text-align: center;
    padding:0 5px;
}
.adr.btnleft {
    margin: 0 10px;
}
    .adr.btnright {
        margin:0 5px;
    }
/*安卓模板E*/

/*模板3 S*/
.tmp3.contentarea {
    text-align:center;
    font-size:18px;
}
.tmp3.btnarea{
    border-top:1px solid #eee;
    text-align:center;
}
.tmp3.btnleft {
    width:100%;
    text-align: center;
}
/*模板3 E*/

/*模板4 S*/
.tmp4.option{
    padding:5px 0;
    height:32px;
    line-height:32px;
    border-bottom:1px solid #ddd;
}
.tmp4.option:last-child{
    border:none;
}
    .tmp4.option:active{
        background-color:#ddd;
    }
    .tmp4.btnarea {
        border-top: 1px solid #eee;
        text-align: center;
    }
.tmp4.btnleft {
    width: 100%;
    text-align: center;
}
/*模板4 E*/

/*模板5 S*/
.tmp5.titlearea {
    text-align: center;
    padding: 20px 0 10px 0;
}
.tmp5.contentarea {
    height:160px;
    overflow-y:auto;
}
.tmp5.option {
    padding: 5px 0;
    height: 32px;
    line-height: 32px;
    border-bottom: 1px solid #ddd;
    text-align: center;
}

    .tmp5.option:last-child {
        border: none;
    }

    .tmp5.option:active {
        background-color: #ddd;
    }

.tmp5.btnarea {
    border-top: 1px solid #eee;
    text-align: center;
}

.tmp5.btnleft {
    width: 100%;
    text-align: center;
}
/*模板5 E*/

/*模板6S*/
.tmp6.titlearea {
    padding: 15px 0 5px 20px;
}

.tmp6.contentarea {
    
}
.tmp6input {
    display: block;
    width: 100%;
    height: 28px;
    line-height: 28px;
    border: 1px solid #ccc;
    border-radius: 2px;
    color: #333;
    font-size: 14px;
    text-indent: 5px;
}
    .tmp6input:focus {
        box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 8px rgba(102, 175, 233, 0.6);
        border-color: #66afe9;
        outline: 0 none;
    }
.tmp6.btnarea {
    text-align: right;
    padding-right: 30px;
}

.tmp6.btnleft, .tmp6.btnright {
    text-align: center;
    padding: 0 5px;
} 
.tmp6.btnleft {
    margin: 0 10px;
}
.tmp6.btnright {
    margin: 0 5px;
}
/*模板6E*/
View Code

 

模板

技术分享
<script type="text/html" id="tmp_ios">
        <div class="msgboxbg" id="$id">
            <div class="msgboxcontent">
                <div class="ios titlearea"><strong>模仿IOS弹出框</strong></div>
                <div class="ios contentarea">自定义内容区,内容描述应简洁明了直达要领!</div>
                <div class="ios btnarea">
                    <span class="ios btnleft" role="btncancel">取消</span>
                    <span class="ios btnright" role="btnok">确定</span>
                </div>
            </div>
        </div>
    </script>
    <script type="text/html" id="tmp_android">
        <div class="msgboxbg" id="$id">
            <div class="msgboxcontent">
                <div class="adr titlearea"><strong>模仿安卓弹出框</strong></div>
                <div class="adr contentarea">自定义内容区,内容描述应简洁明了直达要领!</div>
                <div class="adr btnarea">
                    <span class="adr btnleft" role="btncancel">取消</span>
                    <span class="adr btnright" role="btnok">确定</span>
                </div>
            </div>
        </div>
    </script>
    <script type="text/html" id="tmp_3">
        <div class="msgboxbg" id="$id">
            <div class="msgboxcontent">
                <div class="tmp3 contentarea">模板3,无标题,内容只一行!</div>
                <div class="tmp3 btnarea">
                    <span class="tmp3 btnleft" role="btncancel">取消</span>
                </div>
            </div>
        </div>
    </script>
    <script type="text/html" id="tmp_4">
        <div class="msgboxbg" id="$id">
            <div class="msgboxcontent">
                <div class="tmp4 contentarea">
                    <div class="tmp4 option">模板4,选择项目1</div>
                    <div class="tmp4 option">模板4,选择项目2</div>
                    <div class="tmp4 option">模板4,选择项目3</div>
                    <div class="tmp4 option">模板4,选择项目4</div>
                </div>
                <div class="tmp4 btnarea">
                    <span class="tmp4 btnleft" role="btncancel">取消</span>
                </div>
            </div>
        </div>
    </script>
    <script type="text/html" id="tmp_5">
        <div class="msgboxbg" id="$id">
            <div class="msgboxcontent">
                <div class="tmp5 titlearea"><strong>选择月份</strong></div>
                <div class="tmp5 contentarea">
                </div>
                <div class="tmp5 btnarea">
                    <span class="tmp5 btnleft" role="btncancel">取消</span>
                </div>
            </div>
        </div>
    </script>
    <script type="text/html" id="tmp_6">
        <div class="msgboxbg" id="$id">
            <div class="msgboxcontent">
                <div class="tmp6 titlearea"><strong>输入手机号</strong></div>
                <div class="tmp6 contentarea">
                    <input class="tmp6input" type="tel" maxlength="11"/>
                </div>
                <div class="tmp6 btnarea">
                    <span class="tmp6 btnleft" role="btncancel">取消</span>
                    <span class="tmp6 btnright" role="btnok">确定</span>
                </div>
            </div>
        </div>
    </script>
View Code

 

JS方法

技术分享
// *模板脚本*///
// // IOS模板S
function showios() {
    var cfg = {
        okEvent: function ()
        {
            msgBox.close();
        },
        cancelEvent: function ()
        {
            msgBox.close();
        }
    };
    msgBox.show(‘tmp_ios‘,cfg);
}
// // 安卓模板
function showandroid() {
    var cfg = {
        okEvent: function () {
            msgBox.close();
        },
        cancelEvent: function () {
            msgBox.close();
        }
    };
    msgBox.show(‘tmp_android‘, cfg);
}
// // 模板3
function showtmp3(msg) {
    var cfg = {
        cancelEvent: function () {
            msgBox.close();
        },
        beforeEvent: function (sbjq) {
            if(msg)
                sbjq.find(‘.contentarea‘).eq(0).html(msg);
            }
    };
    msgBox.show(‘tmp_3‘, cfg);
}
function showtmp4() {
    var cfg = {
        Bgclose:true,
        cancelEvent: function () {
            msgBox.close();
        },
        beforeEvent: function () {
            $(‘.tmp4.option‘).on(‘click‘, function () {
                alert($(this).html());
            })
        }
    };
    msgBox.show(‘tmp_4‘, cfg);}
function showtmp5() {
    var cfg = {
        Bgclose: true,
        cancelEvent: function () {
            msgBox.close();
        },
        beforeEvent: function (sbjq) {
            var months = [‘一‘, ‘二‘, ‘三‘, ‘四‘, ‘五‘, ‘六‘, ‘七‘, ‘八‘, ‘九‘, ‘十‘, ‘十一‘, ‘十二‘];
            var options = ‘‘;
            for (var i = 0; i < months.length; i++) {
                options += ‘<div class="tmp5 option">‘ + months[i] + ‘月</div>‘;
            }
            sbjq.find(‘.contentarea‘).eq(0).html(options);
            //
            $(‘.tmp5.option‘).on(‘click‘, function() {
                alert($(this).html());
            })
        }
    };
    msgBox.show(‘tmp_5‘, cfg);
}
function showtmp6() {
    var cfg = {
        okEvent: function(sbjq) {
            var input = sbjq.find(‘.tmp6input‘).eq(0).val();
            alert(input);
            msgBox.close();
        },
        cancelEvent: function() {
            msgBox.close();
        },
    };
    msgBox.show(‘tmp_6‘, cfg);}
// IOS模板E
View Code

 

弹出层类

技术分享
/*--msgbox函数对象,相当于弄了一个类,方法都在这个函数(类)上,是静态的--*/
function msgBox() {
}
/*****************************************/
/*******************  PROPERTY     ******/
/****************************************/
// public 点击背景关闭?(bool)
msgBox.Bgclose = false;
// public 弹出和关闭动画时间(豪秒)
msgBox.AniTime = 200;

// 弹出层显示之前执行
msgBox.beforeEvent = null;
// public 弹出层关闭之后事执行
msgBox.closedEvent = null;
// public 确定按钮 [role = btnok]
msgBox.okEvent = null;
// public 取消(关闭)按钮 [role = btncancel]
msgBox.cancelEvent = null;

// 当前弹出层元素的ID(string)
msgBox.CurrentDomId = null;
/******************************************/
/******************* FUNCTION     *******/
/*****************************************/
// 显示弹出层(主要方法) tmp_id=弹出层DOM模板所在的脚本标记ID , cfg=配置JSON
msgBox.show = function (tmp_id, cfg) {
    // 取出模板HTML,加上ID属性,然后添加到body中,但不显示
    msgBox.CurrentDomId = tmp_id + ‘_DOM‘;
    var dom = $(‘#‘ + tmp_id).html();
    dom = dom.replace(‘$id‘, msgBox.CurrentDomId);
    $(‘#‘ + msgBox.CurrentDomId).remove();
    $(‘body‘).append(dom);
    //
    var showboxJQ = $(‘#‘ + msgBox.CurrentDomId);
    // 将配置设置到属性
    msgBox.config(cfg);
    // window的宽度与高度
    //var windowWidth = window.innerWidth;
    //var windowHeight = window.innerHeight;
    // 文档宽度与高度
    //var scrollTop = $(document).scrollTop();
    //var scrollLeft = $(document).scrollLeft();
    // 添加遮罩 先将body的滚动条设无,这样遮罩范围就限于当前窗口大小.遮罩和弹出层还须是固定定位
    $(‘body‘).addClass(‘overhide‘);
    $(‘body .msgboxshadow‘).remove();
    $(‘body‘).append(‘<div class="msgboxshadow"></div>‘);
    // 要获得焦点,需要设定这个属性tabindex
    showboxJQ.attr(‘tabindex‘, -1);
    // 显示之前事件
    if (typeof msgBox.beforeEvent === ‘function‘)
        msgBox.beforeEvent(showboxJQ);
    // 显示内容层
    showboxJQ.fadeIn(msgBox.AniTime).focus();
}
// 用于配置属性的方法,参数是JSON对象 传入 def 则恢复到默认配置
msgBox.config = function (cfg) {
    if (cfg) {
        // 属性设定
        for (var n in cfg) {
            if (msgBox[n] !== undefined)
                msgBox[n] = cfg[n];
        }
    }
    // 事件绑定
    msgBox.bindEvent();
}
// 将属性重置,事件清空.但不清除当前弹出层JQ对象 不应在外部调用此法 关闭时会调用此方法
msgBox.reset = function () {
    msgBox.Bgclose = false; // 点击背景关闭
    msgBox.beforeEvent = null;
    msgBox.closedEvent = null; // 窗口关闭后执行
    msgBox.okEvent = null;   // 确定按钮 [role = btnok]
    msgBox.cancelEvent = null;// 取消(关闭)按钮 [role = btncancel]
    msgBox.AniTime = 200;// 动画时间
    msgBox.CurrentDomId = null;
}
// 该方法用于绑定事件:有默认事件如: 按ESC关闭,点击背景关闭.也有指定的事件,如确定 取消
// 不应在外部调用此方法,所有属性和事件应在CFG方法中传入,CFG会调用此方法
msgBox.bindEvent = function () {
    var showboxJQ = $(‘#‘ + msgBox.CurrentDomId);
    // 默认事件绑定 点击背景关闭
    if (msgBox.Bgclose === true)
        showboxJQ.on(‘click‘, function (event) {
            if (event.target.id === msgBox.CurrentDomId) {
                msgBox.close();
            }
        });
    // 事件 但role约定为btnok(确定) btncancel(取消)
    if (typeof msgBox.okEvent === ‘function‘)
        showboxJQ.find("[role = btnok]").one("click", function () {
            msgBox.okEvent(showboxJQ);
        })
    if (typeof msgBox.cancelEvent === ‘function‘)
        showboxJQ.find("[role = btncancel]").one("click", function () {
            msgBox.cancelEvent(showboxJQ);
        })
}
// public 关闭对话框(确认和取消事件中如果要关闭对话框应调用此方法)
msgBox.close = function () {
    var showboxJQ = $(‘#‘ + msgBox.CurrentDomId);
    // 清除弹出层
    showboxJQ.fadeOut(msgBox.AniTime, function () {
        showboxJQ.remove();
        // 还原文档的滚动条,清除遮罩层
        $(‘body‘).removeClass(‘overhide‘);
        $(‘body .msgboxshadow‘).remove();
    });
    // 执行关闭后事件
    if (typeof msgBox.closedEvent === ‘function‘)
        msgBox.closedEvent();
    // 重置属性
    msgBox.reset();
}
View Code

 

以上是关于JS简易弹出层手机版的主要内容,如果未能解决你的问题,请参考以下文章

JS弹出层传值的问题(多个请求)

js弹出层代码

很实用的baguetteBox.js 图片弹出层

移动端在有弹出层时如何禁止底层的滚动

js 实现弹出层效果

ios手机弹出层上表单的操作,收起键盘焦点错乱的问题