`
ouyangfeng521
  • 浏览: 248770 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

js 之拖动层

阅读更多

拖动js:

 

var isIE = (document.all) ? true : false;
 
var $ = function (id) {
	return "string" == typeof id ? document.getElementById(id) : id;
};
 
var Class = {
	create: function() {
		return function() { this.initialize.apply(this, arguments); }
	}
}
 
var Extend = function(destination, source) {
	for (var property in source) {
		destination[property] = source[property];
	}
}
 
var Bind = function(object, fun) {
	return function() {
		return fun.apply(object, arguments);
	}
}
 
var BindAsEventListener = function(object, fun) {
	return function(event) {
		return fun.call(object, (event || window.event));
	}
}
 
var CurrentStyle = function(element){
	return element.currentStyle || document.defaultView.getComputedStyle(element, null);
}
 
function addEventHandler(oTarget, sEventType, fnHandler) {
	if (oTarget.addEventListener) {
		oTarget.addEventListener(sEventType, fnHandler, false);
	} else if (oTarget.attachEvent) {
		oTarget.attachEvent("on" + sEventType, fnHandler);
	} else {
		oTarget["on" + sEventType] = fnHandler;
	}
};
 
function removeEventHandler(oTarget, sEventType, fnHandler) {
    if (oTarget.removeEventListener) {
        oTarget.removeEventListener(sEventType, fnHandler, false);
    } else if (oTarget.detachEvent) {
        oTarget.detachEvent("on" + sEventType, fnHandler);
    } else { 
        oTarget["on" + sEventType] = null;
    }
};
 
//拖放程序
var Drag = Class.create();
Drag.prototype = {
  //拖放对象
  initialize: function(drag, options) {
	this.Drag = $(drag);//拖放对象
	this._x = this._y = 0;//记录鼠标相对拖放对象的位置
	this._marginLeft = this._marginTop = 0;//记录margin
	//事件对象(用于绑定移除事件)
	this._fM = BindAsEventListener(this, this.Move);
	this._fS = Bind(this, this.Stop);
	
	this.SetOptions(options);
	
	this.Limit = !!this.options.Limit;
	this.mxLeft = parseInt(this.options.mxLeft);
	this.mxRight = parseInt(this.options.mxRight);
	this.mxTop = parseInt(this.options.mxTop);
	this.mxBottom = parseInt(this.options.mxBottom);
	
	this.LockX = !!this.options.LockX;
	this.LockY = !!this.options.LockY;
	this.Lock = !!this.options.Lock;
	
	this.onStart = this.options.onStart;
	this.onMove = this.options.onMove;
	this.onStop = this.options.onStop;
	
	this._Handle = $(this.options.Handle) || this.Drag;
	this._mxContainer = $(this.options.mxContainer) || null;
	
	this.Drag.style.position = "absolute";
	//透明
	if(isIE && !!this.options.Transparent){
		//填充拖放对象
		with(this._Handle.appendChild(document.createElement("div")).style){
			width = height = "100%"; backgroundColor = "#fff"; filter = "alpha(opacity:0)"; fontSize = 0;
		}
	}
	//修正范围
	this.Repair();
	addEventHandler(this._Handle, "mousedown", BindAsEventListener(this, this.Start));
  },
  //设置默认属性
  SetOptions: function(options) {
	this.options = {//默认值
		Handle:			"",//设置触发对象(不设置则使用拖放对象)
		Limit:			false,//是否设置范围限制(为true时下面参数有用,可以是负数)
		mxLeft:			0,//左边限制
		mxRight:		9999,//右边限制
		mxTop:			0,//上边限制
		mxBottom:		9999,//下边限制
		mxContainer:	"",//指定限制在容器内
		LockX:			false,//是否锁定水平方向拖放
		LockY:			false,//是否锁定垂直方向拖放
		Lock:			false,//是否锁定
		Transparent:	false,//是否透明
		onStart:		function(){},//开始移动时执行
		onMove:			function(){},//移动时执行
		onStop:			function(){}//结束移动时执行
	};
	Extend(this.options, options || {});
  },
  //准备拖动
  Start: function(oEvent) {
	if(this.Lock){ return; }
	this.Repair();
	//记录鼠标相对拖放对象的位置
	this._x = oEvent.clientX - this.Drag.offsetLeft;
	this._y = oEvent.clientY - this.Drag.offsetTop;
	//记录margin
	this._marginLeft = parseInt(CurrentStyle(this.Drag).marginLeft) || 0;
	this._marginTop = parseInt(CurrentStyle(this.Drag).marginTop) || 0;
	//mousemove时移动 mouseup时停止
	addEventHandler(document, "mousemove", this._fM);
	addEventHandler(document, "mouseup", this._fS);
	if(isIE){
		//焦点丢失
		addEventHandler(this._Handle, "losecapture", this._fS);
		//设置鼠标捕获
		this._Handle.setCapture();
	}else{
		//焦点丢失
		addEventHandler(window, "blur", this._fS);
		//阻止默认动作
		oEvent.preventDefault();
	};
	//附加程序
	this.onStart();
  },
  //修正范围
  Repair: function() {
	if(this.Limit){
		//修正错误范围参数
		this.mxRight = Math.max(this.mxRight, this.mxLeft + this.Drag.offsetWidth);
		this.mxBottom = Math.max(this.mxBottom, this.mxTop + this.Drag.offsetHeight);
		//如果有容器必须设置position为relative或absolute来相对或绝对定位,并在获取offset之前设置
		!this._mxContainer || CurrentStyle(this._mxContainer).position == "relative" || CurrentStyle(this._mxContainer).position == "absolute" || (this._mxContainer.style.position = "relative");
	}
  },
  //拖动
  Move: function(oEvent) {
	//判断是否锁定
	if(this.Lock){ this.Stop(); return; };
	//清除选择
	window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
	//设置移动参数
	var iLeft = oEvent.clientX - this._x, iTop = oEvent.clientY - this._y;
	//设置范围限制
	if(this.Limit){
		//设置范围参数
		var mxLeft = this.mxLeft, mxRight = this.mxRight, mxTop = this.mxTop, mxBottom = this.mxBottom;
		//如果设置了容器,再修正范围参数
		if(!!this._mxContainer){
			mxLeft = Math.max(mxLeft, 0);
			mxTop = Math.max(mxTop, 0);
			mxRight = Math.min(mxRight, this._mxContainer.clientWidth);
			mxBottom = Math.min(mxBottom, this._mxContainer.clientHeight);
		};
		//修正移动参数
		iLeft = Math.max(Math.min(iLeft, mxRight - this.Drag.offsetWidth), mxLeft);
		iTop = Math.max(Math.min(iTop, mxBottom - this.Drag.offsetHeight), mxTop);
	}
	//设置位置,并修正margin
	if(!this.LockX){ this.Drag.style.left = iLeft - this._marginLeft + "px"; }
	if(!this.LockY){ this.Drag.style.top = iTop - this._marginTop + "px"; }
	//附加程序
	this.onMove();
  },
  //停止拖动
  Stop: function() {
	//移除事件
	removeEventHandler(document, "mousemove", this._fM);
	removeEventHandler(document, "mouseup", this._fS);
	if(isIE){
		removeEventHandler(this._Handle, "losecapture", this._fS);
		this._Handle.releaseCapture();
	}else{
		removeEventHandler(window, "blur", this._fS);
	};
	//附加程序
	this.onStop();
  }
};

 

调用:

 

var drag = new Drag("idDrag", { mxContainer: "idContainer", Handle: "idHandle", Limit: false });
 

这段代码是帮朋友修改效果时,朋友给的,希望大家用时copy!!

分享到:
评论
1 楼 lq3158 2011-09-23  
写的不错...

很喜欢这种闭包格式

相关推荐

    JS可拖动层

    JavaScript可拖动层技术是网页开发中的一个重要组成部分,它允许用户通过鼠标操作在网页上移动元素,提升用户体验,尤其在创建交互式用户界面时显得尤为关键。这种技术基于JavaScript,一种广泛使用的客户端脚本语言...

    各种js层特效,拖动层

    "各种js层特效,拖动层"这个主题主要涵盖了JavaScript在处理页面元素,特别是层(Layer)的效果以及拖放功能的应用。这里我们将深入探讨这些知识点。 **层特效(Layer Effects)** 层在网页设计中扮演着关键角色,...

    asp.net1.1 拖动层保存拖动后层信息

    值得注意的是,描述中提到js不是完全由开发者编写,可能意味着部分拖动层的实现依赖于第三方库或已有的JavaScript代码片段。这可能是为了简化开发过程,利用现有的成熟解决方案,提高效率。 在压缩包中的"drag"文件...

    可保存位置并自动吸附的JavaScript拖动层.rar

    可保存位置并自动吸附的JavaScript拖动层.rar可保存位置并自动吸附的JavaScript拖动层.rar可保存位置并自动吸附的JavaScript拖动层.rar可保存位置并自动吸附的JavaScript拖动层.rar可保存位置并自动吸附的JavaScript...

    JavaScript制作拖动层

    JavaScript做的可以的拖动的层DIV,鼠标按下拖动 JavaScript做的可以的拖动的层DIV,鼠标按下拖动 JavaScript做的可以的拖动的层DIV,鼠标按下拖动

    javascript div拖动层

    javascript div拖动层 ,代码简单。

    js 可拖动的层(DIV)

    本知识点将深入探讨如何使用JavaScript实现一个可拖动的层(DIV)。DIV作为一个常用的HTML元素,通常用于布局和组织网页内容。通过赋予其拖动功能,用户可以自由调整层的位置,提供更灵活的交互体验。 首先,我们...

    js弹出层可拖动兼容各大浏览器

    "js弹出层可拖动兼容各大浏览器"这个主题涵盖了如何利用JavaScript实现一个弹出窗口,并确保它在各种浏览器(如Chrome、Firefox、Safari、Edge和IE等)上具有良好的兼容性。下面我们将深入探讨这一技术。 首先,...

    javascript拖动层类

    JavaScript拖动层类是一种在网页上实现元素动态拖放功能的技术。这种技术主要基于JavaScript语言,使得用户可以通过鼠标操作页面上的元素,就像在桌面上移动文件一样自由。它广泛应用于各种交互式应用,如对话框、...

    js版许愿墙(可拖动层)

    js版许愿墙 拖动层 许愿墙 可拖动层

    js拖动层事例-一定范围内拖动

    js拖动层事例-一定范围内拖动! 值得下载看看!资源免费,大家分享!!

    JS拖动层自动排序并生成编码

    JavaScrpt 拖动层鼠标松开后自动排序

    js控制拖动层

    在本场景中,“js控制拖动层”是指利用JavaScript实现网页元素(如层、窗口或模块)的拖放功能,允许用户通过鼠标点击并移动来改变这些元素在页面上的位置。这种功能对于创建可自定义布局的博客、微博或其他交互式...

    jQuery拖动任意层

    当用户按下鼠标并在层上移动时,层会随之移动。一旦用户释放鼠标,拖动行为就会停止。 需要注意的是,为了使拖动更加平滑,可以考虑使用`event.preventDefault()`阻止浏览器的默认行为,如文本选中。同时,添加适当...

    javascript实现拖动层特效

    javascript实现拖动层特效 请多多支持多多支持多多支持

    div 拖动 拖动层

    #### 2.1 使用JavaScript实现拖动 要使一个`div`元素具有拖动的功能,通常需要结合JavaScript来完成。具体步骤如下: - **监听mousedown事件**:当用户按下鼠标左键时触发。 - **计算偏移量**:记录鼠标按下时的...

    js拖动层例子-整个网页可以拖动

    js拖动层例子-整个网页可以拖动! 值得下载看看!资源免费,大家分享!!

    鼠标拖动层 实例

    "鼠标拖动层"是一种这样的技术,它允许用户通过鼠标操作来移动页面上的某个元素,比如一个图像、一个区块或者一个窗口。这种功能常见于游戏、个人网站或者任何需要用户手动调整元素位置的场景。下面将详细探讨如何...

    js 实现拖动层和获取自然周

    实现JS拖动层的关键在于监听鼠标事件,包括`mousedown`(鼠标按下)、`mousemove`(鼠标移动)和`mouseup`(鼠标释放)。以下是一个简单的拖动层实现步骤: 1. **初始化**:给需要拖动的元素添加`draggable`属性,...

    js 拖动层 代码少易懂

    js 拖动层 选中棋子并拖动js 拖动层 代码少易懂

Global site tag (gtag.js) - Google Analytics