/************************
* 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);
});
}
}
};