原生js拖拽(面向对象)

代码地址:http://files.cnblogs.com/files/fxnet/%E5%8E%9F%E7%94%9Fjs%E6%8B%96%E6%8B%BD%EF%BC%88%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%EF%BC%89.rar

<style>
img
{
width: 200px;
height: 200px;
}
.fx_drag
{
background: green;
width: 300px;
height: 500px;
float: left;
}
p
{
float: left;
margin-top: 0;
}
p img
{
float: left;
}
#end, #end2
{
background: red;
width: 300px;
height: 500px;
float: left;
margin-left: 500px;
}
.imgMoveing
{
position: absolute;
cursor: move;
}
.imgEnd
{
position: absolute;
transition: all 1s;
}
.div1
{
float: left;
width: 100%;
margin-bottom: 20px;
}
</style>
<div class="div1">
<div id="star" class="fx_drag">
<p>
<img draggable="false" fx_drag="true" src="46354375_950.jpg" /></p>
<p>
<img draggable="false" fx_drag="true" src="Focus_Monster-821_Concept-01_634x357_[634x357]8488546.png" /></p>
<p>
<span fx_drag="true">adasdadasd</span>
</p>
</div>
<div id="end">
</div>
</div>
<div>
<div id="star2" class="fx_drag">
<p>
<img draggable="false" fx_drag="true" src="46354375_950.jpg" /></p>
<p>
<img draggable="false" fx_drag="true" src="Focus_Monster-821_Concept-01_634x357_[634x357]8488546.png" /></p>
<p>
<span fx_drag="true">adasdadasd</span>
</p>
</div>
<div id="end2">
</div>
</div>
<script>
Object.extend = function (destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
}
var drag = function (options) {
var div_star;
var div_end;
this.options = {};
if (typeof options == "string") {
this.options.div_star = document.querySelector(options);
this.options.div_end = document.getElementById("end");
this.options.cloneNode = false;
}
else
this.options = Object.extend(this.options, options);
this.init();
}
drag.prototype.init = function () {
var self = this;
this.params = {
drag_star: false, //是否开始拖放
drag_success: false, //是否进入拖放区域
div_end: self.options.div_end, //目标容器
div_end_params: {
x: self.options.div_end.offsetLeft, //容器的所在位置x
y: self.options.div_end.offsetTop, //容器的所在位置y
width: self.options.div_end.offsetWidth, //容器宽度
height: self.options.div_end.offsetHeight//容器高度
},
move_obj: {}
};
var drag_list = self.options.div_star.querySelectorAll("[fx_drag=true]");
for (var i = 0; i < drag_list.length; i++) {
drag_list[i].onmousedown = function () {
self.fx_drag(‘star‘, event, this);
}
drag_list[i].onmousemove = function () {
self.fx_drag(‘move‘, event, this);
}
drag_list[i].onmouseup = function () {
self.fx_drag(‘end‘, event, this);
}
drag_list[i].onmouseout = function () {
self.fx_drag(‘end‘, event, this);
}
}
}
drag.prototype.fx_drag = function (type, event, obj) {
switch (type) {
case "star":
if (obj.className == "") {
this.params.drag_star = true; //鼠标已经按下
this.params.move_obj.x = event.x; //鼠标所在位置x
this.params.move_obj.y = event.y; //鼠标所在位置y
this.params.move_obj.offset = { x: obj.offsetLeft, y: obj.offsetTop }; //元素所在位置x,y
this.params.move_obj.width = obj.offsetWidth; //图片宽度
this.params.move_obj.height = obj.offsetHeight; //图片高度
}
break;
case "move":
if (this.params.drag_star) {
obj.className = "imgMoveing"; //设置图片的样式为拖动中样式
var XX = event.x - this.params.move_obj.x; //鼠标位置-鼠标落下位置=实际拖动像素x
var YY = event.y - this.params.move_obj.y; //鼠标位置-鼠标落下位置=实际拖动像素y
var NowX = this.params.move_obj.offset.x + XX; //图片原始位置+拖动像素x=当前图片应在位置x
var NowY = this.params.move_obj.offset.y + YY; //图片原始位置+拖动像素x=当前图片应在位置y
obj.style.left = NowX; //设置图片位置
obj.style.top = NowY; //设置图片位置
//判断图片是否进入容器
if (NowX > this.params.div_end_params.x && NowX < this.params.div_end_params.x + this.params.div_end_params.width - this.params.move_obj.width
&& NowY > this.params.div_end_params.y && NowY < this.params.div_end_params.y + this.params.div_end_params.height - this.params.move_obj.height)
this.params.drag_success = true;
else
this.params.drag_success = false;
}
break;
case "end":
//鼠标按下才会触发
if (!this.params.drag_star)
return;
this.params.drag_star = false;
//如果进入容器 把图片加入容器 并且把当前图片所有拖动属性清空
if (this.params.drag_success) {
if (this.options.cloneNode) {
var newNode = obj.parentNode.cloneNode(true);
newNode.children[0].onmousedown = null;
newNode.children[0].onmousemove = null;
newNode.children[0].onmouseup = null;
newNode.children[0].className = "";
newNode.children[0].removeAttribute("style");
newNode.children[0].removeAttribute("fx_drag");
this.params.div_end.appendChild(newNode);

obj.style.left = this.params.move_obj.offset.x;
obj.style.top = this.params.move_obj.offset.y;
obj.className = "";
} else {
obj.onmousedown = null;
obj.onmousemove = null;
obj.onmouseup = null;
obj.className = "";
this.params.div_end.appendChild(obj.parentNode);
}
this.params.move_obj = {};
} else {
//没有进入容器 按原位置返回,并且加入返回时间 1s内返回
obj.className = "imgEnd";
var self = this;
setTimeout(function () {
obj.style.left = self.params.move_obj.offset.x;
obj.style.top = self.params.move_obj.offset.y;
self.params.move_obj = {};
}, 20);
setTimeout(function () {
obj.className = "";
}, 1000);
}
break;
}
return false;
}
var aa = new drag("#star");
var bb = new drag({
div_star: document.getElementById("star2"),
div_end: document.getElementById("end2"),
cloneNode:true
});

console.log(aa);
console.log(bb);

</script>

http://files.cnblogs.com/files/fxnet/%E5%8E%9F%E7%94%9Fjs%E6%8B%96%E6%8B%BD%EF%BC%88%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%EF%BC%89.rar

时间: 2024-08-08 13:50:46

原生js拖拽(面向对象)的相关文章

React.js实现原生js拖拽效果及思考

一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖拽效果. 首先,其实拖拽效果的思路是很简单的.主要就是三个步骤: 1.onmousedown的时候,启动可拖拽事件,记录被拖拽元素的原始坐标参数. 2.onmousemove的时候,实时记录鼠标移动的距离,结合被拖拽元素第一阶段的坐标参数,计算并设置新的坐标值. 3.onmouseup的时候,关闭可拖拽事件

再谈React.js实现原生js拖拽效果

前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目地就是要尽量避免直接操作dom元素,所以我们在对dom元素进行操作的时候需要注意,我之前为了获取form的参数就直接用了var dragBox=document.getElementById('form')去找dom,但是其实记录from的初始位置,可以在其子组件更新父组件参数的时候调用.即在MyF

原生js拖拽效果

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title></title><style>   *{      margin:0;      padding:0;    }   #box{    width:100px;    height:100px;    background: red; 

js拖拽效果实现

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>    <meta

一步一步实现JS拖拽插件

js拖拽是常见的网页效果,本文将从零开始实现一个简单的js插件. 一.js拖拽插件的原理 常见的拖拽操作是什么样的呢?整过过程大概有下面几个步骤: 1.用鼠标点击被拖拽的元素 2.按住鼠标不放,移动鼠标 3.拖拽元素到一定位置,放开鼠标 这里的过程涉及到三个dom事件:onmousedown,onmousemove,onmouseup.所以拖拽的基本思路就是: 1.用鼠标点击被拖拽的元素触发onmousedown (1)设置当前元素的可拖拽为true,表示可以拖拽 (2)记录当前鼠标的坐标x,y

php+mysql+js拖拽div实例

php+mysql+js拖拽div实例 代码已改好,放在目录下可直接使用.适合新手学习! 效果如下图,比较适合做可以移动,拖拽的留言板. 实现思路: 思路也是很简单了,就是js获取定位后的数据,然后请求给PHP,php将定位的横向坐标和纵向坐标存到数据库! 代码实例下载地址:http://download.csdn.net/detail/u011986449/8099045

js拖拽分析

js拖拽分析 思路 1.三个鼠标事件,mousedown,mousemove,mouseup 2.可移动性absolute 3.边界限制 得到鼠标点击处和div边界的距离,然后得出top 和 left 的值 具体 mousedown div.onmousedown=function(event){ var event=event||window.event var diffX=event.clientX-div.offsetLeft var diffY=event.clientY-div.off

图片拖拽面向对象写法-1

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>拖拽之面向对象</title> <style> #box1{width: 100px;height: 100px;background-color: #0A246A; position: absolute;} </style> <s

JS拖拽

拖拽原理    a, 被拖拽物体绝对定位    b, 按下时记录鼠标在拖拽物体上的位置,拖拽时鼠标在拖拽物体上的位置保持不变    c, 鼠标移动时改变拖拽物体位置 1,简易拖拽 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>拖拽原型</title> <script type="text/javascript" sr