zoukankan      html  css  js  c++  java
  • Javascript自由拖拽类

    基本拖拽配置

    new Dragdrop({
    target 拖拽元素 HTMLElemnt 必选
    bridge 指定鼠标按下哪个元素时开始拖拽,实现模态对话框时用到 
    dragable 是否可拖拽 (true)默认
    dragX true/false false水平方向不可拖拽 (true)默认
    dragY true/false false垂直方向不可拖拽 (true)默认
    area [minX,maxX,minY,maxY] 指定拖拽范围 默认任意拖动
    callback 拖拽过程中的回调函数
    });

    /**
     * JavaScript Dragdrop Library v0.6
     * Copyright (c) 2010 snandy
     * Blog: http://snandy.javaeye.com/
     * QQ群: 34580561
     * Date: 2010-09-06
     * 
     * 
     * 基本拖拽
     * new Dragdrop({
     * 		target 	 拖拽元素 HTMLElemnt 必选
     * 		bridge	 指定鼠标按下哪个元素时开始拖拽,实现模态对话框时用到 
     * 		dragable 是否可拖拽	(true)默认
     * 		dragX 	 true/false false水平方向不可拖拽 (true)默认
     * 		dragY	 true/false false垂直方向不可拖拽 (true)默认
     * 		area 	 [minX,maxX,minY,maxY] 指定拖拽范围 默认任意拖动
     * 		callback 移动过程中的回调函数
     * });
     * 
     * demo
     * 		dragdrop_0.6.html
     */
    
    Dragdrop = function(window){
    	var doc = window.document;
    	var E = {
    		on : function(el, type, fn){
    			el.addEventListener ?
    				el.addEventListener(type, fn, false) :
    			el.attachEvent ?
    				el.attachEvent("on" + type, fn) :
    			el['on'+type] = fn;
    		},
    		un : function(el,type,fn){
    			el.removeEventListener ?
    				el.removeEventListener(type, fn, false) :
    			el.detachEvent ?
    				el.detachEvent("on" + type, fn) :
    			el['on'+type] = null;
    		},
    		evt : function(e){
    			return e || window.event;
    		}
    	};
    	return function(opt){
    		
    		var conf = null, defaultConf, diffX, diffY;
    		function Config(opt){
    			this.target = opt.target;
    			this.bridge = opt.bridge;
    			this.dragable = opt.dragable != false;
    			this.dragX = opt.dragX != false;
    			this.dragY = opt.dragY != false;
    			this.area  = opt.area;
    			this.callback = opt.callback;
    		}	
    		function Dragdrop(opt){
    			if(!opt){return;}
    			conf = new Config(opt);
    			defaultConf = new Config(opt);
    			conf.bridge ?
    				E.on(conf.bridge,'mousedown',mousedown) :
    				E.on(conf.target,'mousedown',mousedown);
    		}
    		Dragdrop.prototype = {
    			dragX : function(){
    				conf.dragX = true;
    				conf.dragY = false;
    			},
    			dragY : function(b){
    				conf.dragY = true;
    				conf.dragX = false;
    			},
    			dragAll : function(){
    				conf.dragX = true;
    				conf.dragY = true;
    			},
    			setArea : function(a){
    				conf.area = a;
    			},
    			setBridge : function(b){
    				conf.bridge = b;
    			},
    			setDragable : function(b){
    				conf.dragable = b;
    			},
    			reStore : function(){
    				conf = new Config(defaultConf);
    				conf.target.style.top = '0px';
    				conf.target.style.left = '0px';
    			},
    			getDragX : function(){
    				return conf.dragX;
    			},
    			getDragY : function(){
    				return conf.dragY;
    			}
    		}
    		function mousedown(e){
    			e = E.evt(e);
    			var el = conf.target;
    			el.style.position = 'absolute';
    			el.style.cursor = 'move';
    			if(el.setCapture){ //IE
    				E.on(el, "losecapture", mouseup);
    				el.setCapture();
    				e.cancelBubble = true;
    			}else if(window.captureEvents){ //标准DOM
    				e.stopPropagation();
    				E.on(window, "blur", mouseup);
    				e.preventDefault();
    			}
    			diffX = e.clientX - el.offsetLeft;
    			diffY = e.clientY - el.offsetTop;
    			E.on(doc,'mousemove',mousemove);
    			E.on(doc,'mouseup',mouseup);
    		}
    		function mousemove(e){
    			var el = conf.target, e = E.evt(e), moveX = e.clientX - diffX, moveY = e.clientY - diffY;
    			var minX, maxX, minY, maxY;
    			if(conf.area){
    				minX = conf.area[0];
    				maxX = conf.area[1];
    				minY = conf.area[2];
    				maxY = conf.area[3];
    				moveX < minX && (moveX = minX); // left 最小值
    				moveX > maxX && (moveX = maxX); // left 最大值
    				moveY < minY && (moveY = minY); // top 最小值
    				moveY > maxY && (moveY = maxY); // top 最大值
    			}
    			if(conf.dragable){
    				conf.dragX && (el.style.left = moveX + 'px');
    				conf.dragY && (el.style.top =  moveY + 'px');
    				if(conf.callback){
    					var obj = {moveX:moveX,moveY:moveY};
    					conf.callback.call(conf,obj);
    				}
    			}
    		}
    		function mouseup(e){
    			var el = conf.target;
    			el.style.cursor = 'default';
    			E.un(doc,'mousemove',mousemove);
    			E.un(doc,'mouseup',mouseup);
    			if(el.releaseCapture){ //IE
    				E.un(el, "losecapture", mouseup);
    				el.releaseCapture();
    			}
    			if(window.releaseEvents){ //标准DOM
    				E.un(window, "blur", mouseup);
    			}
    		}
    		return new Dragdrop(opt);
    		
    	}
    		
    }(this);
    

      HTML代码

    <!DOCTYPE HTML>
    <html>
      <head>
        <title>dragdrop_0.5.html</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
     	<style type="text/css">
     		body {margin:0;padding:0;}	
     	</style>
    	<script type="text/javascript" src="dragdrop_0.6.js"></script>
    	<script type="text/javascript">
    		window.onload = function(){
    			var container = document.getElementById('container');
    			var ele = document.getElementById('d1');
    			var bodyWidth = container.offsetWidth,
    				bodyHeight = container.offsetHeight;
    			var maxX = bodyWidth - ele.offsetWidth - 10;
    			var maxY = bodyHeight - ele.offsetHeight - 10;
    			var dd = new Dragdrop({
    				target : ele,
    				area : [0,maxX,0,maxY],
    				callback : function(obj){
    					if(typeof obj.moveX == 'number' && this.dragX){
    						document.getElementById('x').innerHTML = 'x:'+obj.moveX;
    					}
    					if(typeof obj.moveY == 'number' && this.dragY){
    						document.getElementById('y').innerHTML = 'y:'+obj.moveY;	
    					}
    				}
    			});	
    			document.getElementById('setting').onclick = function(e){
    				e = e || event;
    				var target = e.target || e.srcElement;
    				if(target.value == '1' && target.checked){
    					dd.dragAll();
    				}				
    				if(target.value == '2' && target.checked){
    					dd.dragX();
    				}
    				if(target.value == '3' && target.checked){
    					dd.dragY();
    				}
    				if(target.value == '4' && target.checked){
    					dd.setDragable(false);
    				}
    				if(target.value == '5' && target.checked){
    					dd.setDragable(true);
    				}
    				if(target.value == '6' && target.checked){
    					dd.reStore();
    					document.getElementById('x').innerHTML = 'x:0';
    					document.getElementById('y').innerHTML = 'y:0';
    				}
    			}
    		}
    	</script>
      </head>
      
      <body>
      	<div style="600px;height:20px;margin:10px auto;">
      		拖拽状态:<span id="x">x:0</span>, <span id="y">y:0</span>
    	</div>
    	
      	<div id="container" style="position:relative;border:5px solid gray;600px;height:300px;margin:0 auto;">
    		<div id="d1" style="100px;height:50px;background:gold;text-align:center;position:absolute;left:0px;top:0px;">
    			Drag me.
    		</div>  		
    	</div>
    	<div id="setting" style="600px;margin:20px auto;">
    		<input id="f1" type="radio" value="1" name="flag"/><label for="f1">任意方向</label>
    		<input id="f2" type="radio" value="2" name="flag"/><label for="f2">水平方向</label>
    		<input id="f3" type="radio" value="3" name="flag"/><label for="f3">垂直方向</label>
    		<input id="f4" type="radio" value="4" name="flag"/><label for="f4">停止拖拽</label>
    		<input id="f5" type="radio" value="5" name="flag"/><label for="f5">开启拖拽</label>
    		<input id="f6" type="radio" value="6" name="flag"/><label for="f6">恢复初始状态</label>
    	</div>
      </body>
    </html>
    

      

  • 相关阅读:
    Windows 和Linux 误删除后的恢复
    AWS 使用总结
    20180814 错误分析
    你必须知道的互联网协议详解
    linux常用命令和关闭防火墙
    Nginx之ngx_http_fastcgi_module模块详解
    nginx 限制ip
    nginx allow 多个ip & ipv4的网段表示方法解析
    从Nginx的Web请求处理机制中剖析多进程、多线程、异步IO
    剑指offer:二叉树的深度
  • 原文地址:https://www.cnblogs.com/axl234/p/3769779.html
Copyright © 2011-2022 走看看