弹窗插件


/************************
 * name : layer-drag.js
 * version : 1.0
 * author : GrearWall
 * date : 2017-07-31
 * support : IE9+
 ***********************/

/*  //How to use
    <button style="display:block;margin:1000px auto 100px;padding:10px 30px;" onclick="a()">点击弹窗</button>
    <div id="aaa" style="width:450px;height:400px;margin:auto;background:#ddd;display: none;">内容区域</div>
    <script>
        function a(){
            layerDrag.layerModel({
                msg:"访问服务器失败!",
                el:"#aaa",
                width:500,
                height:500,
                title:"模态框",
                noDrag:true,
                buttons:[{label:"确定",callback:function(){
                    layerDrag.layerModel({
                        msg:"访问服务器失败!",
                        //buttons:["确定"]
                    },function(){
                        console.log("提示框已经创建完成!");
                    }); 
                }},{label:"取消",callback:function(){
                    layerDrag.layerModel({
                        msg:"取消",
                    });
                }},{label:"一半确定一半取消",callback:function(){
                    layerDrag.layerModel({
                        msg:"一半确定一半取消",
                    });
                }}]
            },function(){
                console.log("模态框已经创建完成!");
                console.log(this);
                var pgfx_chart1=echarts.init(document.getElementById('aaa'));
                pgfx_chart1.setOption(option);
            });
        }

        var option = {
            backgroundColor: '#2c343c',
            title: {
                text: 'Customized Pie',
                left: 'center',
                top: 20,
                textStyle: {
                    color: '#ccc'
                }
            },
            tooltip : {
                trigger: 'item',
                formatter: "{a} <br/>{b} : {c} ({d}%)"
            },
            visualMap: {
                show: false,
                min: 80,
                max: 600,
                inRange: {
                    colorLightness: [0, 1]
                }
            },
            series : [
                {
                    name:'访问来源',
                    type:'pie',
                    radius : '55%',
                    center: ['50%', '50%'],
                    data:[
                        {value:335, name:'直接访问'},
                        {value:310, name:'邮件营销'},
                        {value:274, name:'联盟广告'},
                        {value:235, name:'视频广告'},
                        {value:400, name:'搜索引擎'}
                    ].sort(function (a, b) { return a.value - b.value; }),
                    roseType: 'radius',
                    label: {
                        normal: {
                            textStyle: {
                                color: 'rgba(255, 255, 255, 0.3)'
                            }
                        }
                    },
                    labelLine: {
                        normal: {
                            lineStyle: {
                                color: 'rgba(255, 255, 255, 0.3)'
                            },
                            smooth: 0.2,
                            length: 10,
                            length2: 20
                        }
                    },
                    itemStyle: {
                        normal: {
                            color: '#c23531',
                            shadowBlur: 200,
                            shadowColor: 'rgba(0, 0, 0, 0.5)'
                        }
                    },
                    animationType: 'scale',
                    animationEasing: 'elasticOut',
                    animationDelay: function (idx) {
                        return Math.random() * 200;
                    }
                }
            ]
        };
    </script>
 */

var layerDrag = {
    addEventHandler : function (target,type,fn){    //bind event function
        if(target.addEventListener){    //W3C
            target.addEventListener(type,fn);
        }else if(target.attachEvent){   //IE
            target.attachEvent("on"+type,fn);
        }
     },
     removeEventHandler : function (target,type,fn){   //unbind event function
        if(target.removeEventListener){
            target.removeEventListener(type,fn);
        }else{
            target.detachEvent(type,fn);
        }
     },
     preventDefault : function (event){ //prevent defalut event
         var e = event || window.event;
        if(event.preventDefault){   //W3C
            e.preventDefault();
        }else{  //IE
            e.returnValue = false;
        }
     },
     stopPropagation : function (event){    //stop propagation event
         var e = event || window.event;
         if(e.stopPropagation){ //W3C
             e.stopPropagation();
         }else{ //IE
             e.canceBubble = true;
             return false;
         }
     },
     getInnerClient : function (){  //get window client size
         if(window.innerWidth){ //W3C
            return {
                width:window.innerWidth,
                height:window.innerHeight
            }
         }else{ //IE
             return {
                 width:document.documentElement.clientWidth,
                 height:document.documentElement.clientHeight
             }
         }
     },
     mouseHover : function (obj,enter,leave){
        obj.onmouseenter = enter;
        obj.onmouseleave = leave;
     },
     getElement : function (el){
        if(typeof el === "string"){
            if(el.indexOf("#") == 0){
                return document.getElementById(el.replace("#",""))
            }else if(el.indexOf(".") == 0){
                return document.getElementsByClassName(el.replace(".",""))
            }else{
                return document.getElementsByTagName(el)
            }
        }
     },
     creatDOM : function (attr,tag){
        var el = document.createElement(tag);
        for(i in attr){
            el.setAttribute(i,attr[i]);
        }
        return el;
     },
     setCSS : function (target,cssObj){
        for(i in cssObj){
            target.style[i] = cssObj[i]
        }
     },
     layerModel : function (options,callback){   //drag layer model
        var _this = this;
        _this.options = options;
        _this.bulidLayerModel(options);   //creat layer model
        var modelHead = _this.getElement("#modelHead"),
            modelContainer = _this.getElement("#modelContainer"),
            maxW = _this.getInnerClient().width - modelContainer.offsetWidth,
            maxH = _this.getInnerClient().height - modelContainer.offsetHeight,
            isDrag = false; //Flag for dragable
        //init layer model position
        modelContainer.style.left = (maxW/2) + "px";
        modelContainer.style.top = (maxH/3) + "px";
        modelContainer.style.opacity = 1;
        modelContainer.style.filter = "alpha(opacity=100)";
        layerDrag.currentScrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
        document.documentElement.scrollTop = window.pageYOffset = document.body.scrollTop = 0;
        document.body.style.overflow = "hidden";
        _this.addEventHandler(window,"resize",function(){
            var maxW = _this.getInnerClient().width - modelContainer.offsetWidth,
                maxH = _this.getInnerClient().height - modelContainer.offsetHeight;
            modelContainer.style.left = (maxW/2) + "px";
            modelContainer.style.top = (maxH/3) + "px";
        });
        //bind close event
        var headClose = _this.getElement("#headClose");
        headClose.onclick = _this.closelayerModel;
        //drag by mousedown first
        if(!options.noDrag){
            modelHead.onmousedown = function(e){
                modelContainer.style.transition = null;
                x = e.clientX - modelContainer.offsetLeft;
                y = e.clientY - modelContainer.offsetTop;
                isDrag = true;
                document.onmousemove = function(e){
                    if(isDrag){
                        var left = e.clientX - x,
                            top = e.clientY - y;
                        //cancle select element and text
                        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); 
                        if(left < 0){   //left overflow
                            left = 0;
                        }else if(left > maxW){  //right overflow
                            left = maxW;
                        };
                        if(top < 0){    //top overflow
                            top = 0;
                        }else if(top > maxH){   //bottom overflow
                            top = maxH;
                        }
                        modelContainer.style.left = left + "px";
                        modelContainer.style.top = top + "px";
                    }
                }
            }
            document.onmouseup = function(){    //clear draging when mouseup
                isDrag = false;
                // modelHead.onmousedown = null;
                document.onmousemove = null;
            }
        }else{
            modelHead.style.cursor = "default";
        }
        if(typeof callback === "function"){
            callback.apply(this, arguments);
        }
    },
    closelayerModel : function (callback){  //close layer model and remove it from document
        var modelContainer = layerDrag.getElement("#modelContainer");
        var modelLayer = layerDrag.getElement("#modelLayer");
        if(layerDrag.options.el){
            var target = layerDrag.getElement(layerDrag.options.el);
            target.style.display = "none";
            document.body.appendChild(target);
        }
        document.body.removeChild(modelContainer);
        document.body.removeChild(modelLayer);
        document.body.style.overflow = "auto";
        document.documentElement.scrollTop = window.pageYOffset = document.body.scrollTop = layerDrag.currentScrollTop;
        typeof callback === "function" ? callback() : null;
    },
    bulidLayerModel : function (options){   //creat DOM
        var _this = this;
        //handle arguments
        var width = options.width || 300,
            height = options.height || 160,
            msg = options.msg,
            el = options.el,
            title = options.title || "提示信息",
            buttons = options.buttons;
        //creat Mask
        var modelDom = _this.creatDOM({"id":"modelLayer"},"div");
        modelDom.style.cssText = "width:100%;height:100%;\
                                position:absolute;top:0;left:0;z-index:999998;\
                                background:#000;opacity:0.5;filter:alpha(opacity=60)";
        document.body.appendChild(modelDom);
        //creat layer model container
        var modelDiv = _this.creatDOM({"id":"modelContainer"},"div");
        modelDiv.style.cssText = "width:"+width+"px;height:"+height+"px;position: absolute;overflow:hidden; border: 1px solid #ccc;\
                                 transition:top 1s,opacity 1s;top:0;opacity:0;filter:alpha(opacity=0);border-radius: 6px;background: #fff;\
                                 z-index: 999999;box-shadow: #999 0 0 20px;font-size:14px;color:#666;";
        document.body.appendChild(modelDiv);
        //creat layer model head
        var modelHead = _this.creatDOM({"id":"modelHead"},"div");
        modelHead.innerHTML = title;
        modelHead.style.cssText = "width:100%;height:35px;text-indent:1.5em;background:#f2f2f2;border-bottom:1px solid #ddd;cursor:move;line-height:35px;";
        modelDiv.appendChild(modelHead);
        //creat head close button
        var headClose = _this.creatDOM({"id":"headClose"},"div");
        headClose.innerHTML = "×";
        headClose.style.cssText = "float:right;width:50px;line-height:34px;font-size:24px;text-align:center;text-indent:0;cursor:pointer;";
        modelHead.appendChild(headClose);
        //creat content
        var modelContent = _this.creatDOM({"id":"modelContent"},"div");
        modelContent.style.cssText = "width:100%;padding:10px;text-align:center;box-sizing:border-box;";
        modelDiv.appendChild(modelContent);
        if(el){
            var msgChild = _this.getElement(el);
            msgChild.style.display = "block";
            modelContent.appendChild(msgChild);
            modelContent.style.height = buttons ? (height - 75) + "px" : (height - 40) + "px";
            modelContent.style.overflow = "hidden";
        }else{
            modelDiv.style.transition = "top 1s,opacity 1s";
            modelDiv.style.top = null;
            modelContent.innerHTML = msg;
            modelContent.style.lineHeight = buttons ? (height - 90) + "px" : (height - 70) + "px";
        }

        if(buttons && buttons instanceof Array){
            var modelFooter = _this.creatDOM({"id":"modelFooter"},"div");
            modelFooter.style.cssText = "clear:both;text-align:center;padding:0 10px;overflow:hidden;";
            modelDiv.appendChild(modelFooter);
            buttons.map(function(item,index){
                var btn = _this.creatDOM({"class":"bottomBtn"},"div");
                if(typeof item === "string"){
                    btn.innerHTML = item;
                    btn.onclick = _this.closelayerModel;
                }else if(typeof item === "object"){
                    btn.innerHTML = item.label;
                    btn.onclick = function(){
                        _this.closelayerModel(item.callback);
                    } 
                }
                btn.style.cssText = "float:right;padding:4px 18px;border-radius:3px;border:1px solid #ddd;\
                                    background:none;cursor:pointer;margin:0 5px;";
                _this.mouseHover(btn,function(){
                    _this.setCSS(this,{
                        "background" : "#2CBBE3",
                        "borderColor" : "#2CBBE3",
                        "color" : "#fff"
                    });
                },function(){
                    _this.setCSS(this,{
                        "background" : "none",
                        "borderColor" : "#ddd",
                        "color" : "#666"
                    });
                });
                modelFooter.appendChild(btn);
            });
        }
    }
};


 

转载于:https://my.oschina.net/u/3288561/blog/1499222

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值