整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript拖拽功能

挑战30天在头条写日记#

js 有关于拖拽功能实现的API

<div draggable = "true"></div>

一些事件

JavaScript拖拽功能可以通过以下步骤实现:

1.选定要进行拖拽的元素(例如一个图像或一个文本框)

2.为元素添加鼠标事件处理程序,包括mousedown、mousemove和mouseup事件。当鼠标按下时,将元素标记为“可拖拽”;当鼠标移动时,拖拽元素;当鼠标松开时,取消拖拽。

3.在mousemove事件处理程序中,可以计算鼠标位置和元素位置之间的差异,并将元素的位置设置为鼠标位置减去差异。

以下是一个简单的JavaScript拖拽功能的示例:

const draggableElement = document.getElementById("draggable");

// 初始化一些变量
let offsetX = 0;
let offsetY = 0;
let isDragging = false;

// 添加mousedown事件处理程序
draggableElement.addEventListener("mousedown", function(e) {
  // 标记元素为可拖动
  isDragging = true;
  // 计算鼠标位置和元素位置之间的差异
  offsetX = e.offsetX;
  offsetY = e.offsetY;
});

// 添加mousemove事件处理程序
draggableElement.addEventListener("mousemove", function(e) {
  // 如果元素被标记为可拖动,则拖动元素
  if (isDragging) {
    // 将元素位置设置为鼠标位置减去差异
    draggableElement.style.left = (e.pageX - offsetX) + "px";
    draggableElement.style.top = (e.pageY - offsetY) + "px";
  }
});

// 添加mouseup事件处理程序
draggableElement.addEventListener("mouseup", function() {
  // 取消元素的拖拽标记
  isDragging = false;
});


例子:



对于Vue,同样可以使用第三方拖拽库,如Vue.Draggable等。以下是使用

vue实现拖拽功能的示例:

1. 安装必要的库 使用npm或yarn安装 Vue.Draggable库:

npm install vuedraggable

2. 创建拖拽源和目标 在Vue中,需要使用draggable组件和dropzone组件来创建拖拽源和目标。 例如,创建一个拖拽源:

<template>
  <draggable :element="'div'" :options="dragOptions" :data-id="id">
    // 元素内容
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';
export default {
  components: { draggable },
  props: ['id'],
  data() {
    return {
      dragOptions: {
        // 拖拽选项
      }
    }
  }
}
</script>

这里,使用了draggable组件来创建拖拽源,通过element属性指定了元素的标签,通过options属性指定了拖拽选项,例如handle属性可以指定拖拽的手柄,group属性可以指定拖拽源和目标的分组等。 同样地,在Vue中,也可以创建一个拖拽目标:

<template>
  <dropzone :options="dropOptions">
    // 放置区域的内容
  </dropzone>
</template>

<script>
import { Droppable } from 'vuedraggable';
export default {
  components: { Droppable },
  data() {
    return {
      dropOptions: {
        // 放置区域选项
      }
    }
  }
}
</script>

这里,使用了dropzone组件来创建拖拽目标,通过options属性指定了放置区域的选项,例如group属性可以指定拖拽源和目标的分组等。 3. 绑定拖拽事件 在拖拽源和拖拽目标中,可以绑定一些拖拽事件,例如start、end、add、remove等事件,用于处理拖拽过程中的操作。例如,在拖拽源中绑定start事件:

<template>
  <draggable :element="'div'" :options="dragOptions" :data-id="id" @start="onDragStart">
    // 元素内容
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';
export default {
  components: { draggable },
  props: ['id'],
  data() {
    return {
      dragOptions: {
        // 拖拽选项
      }
    }
  },
  methods: {
    onDragStart(event) {
      // 处理拖拽开始时的操作
    }
  }
}
</script>

在拖拽目标中,绑定add事件:

<template>
  <dropzone :options="dropOptions" @add="onDrop">
    // 放置区域的内容
  </dropzone>
</template>

<script>
import { Droppable } from 'vuedraggable';
export default {
  components: { Droppable },
  data() {
    return {
      dropOptions: {
        // 放置区域选项
      }
    }
  },
  methods: {
    onDrop(event) {
      // 处理拖拽完成后的操作
    }
  }
}
</script>

这里,通过@start和@add等事件绑定,可以处理拖拽开始和拖拽完成后的操作。

最后:给大家推荐几款vue常用的拖拉拽组件和框架

  1. Vue.Draggable - 这是一个基于 Vue.js 的拖拽组件,可用于实现拖拽排序、拖拽交互等功能。它支持各种元素和列表的拖拽,并提供了丰富的事件和配置选项。

https://github.com/SortableJS/Vue.Draggable

  1. Vue-Sortable - 这是一个简单易用的 Vue.js 拖拽排序库,它提供了拖拽列表项的功能,并支持自定义排序规则和回调函数。

https://github.com/sagalbot/vue-sortable

  1. Vuedraggable - Vuedraggable 是一个基于 Vue.js 的拖拽和排序库,可以实现元素的拖拽和排序功能。它支持嵌套列表的拖拽和排序,并提供了丰富的事件和配置选项。

https://github.com/SortableJS/Vue.Draggable

  1. Vue Grid Layout - Vue Grid Layout 是一个用于构建可拖拽和可调整大小的网格布局的组件库。它提供了类似于网格系统的功能,可以轻松地创建可自定义的网格布局。

https://github.com/jbaysolutions/vue-grid-layout

  1. Vue2-Dragula - 这是一个基于Dragula库的Vue 2.x的拖拽组件,可以实现复杂的拖放交互和排序功能。

https://github.com/Astray-git/vue2-dragula

  1. Vue-Draggable-resizable - 这个组件提供了可拖拽和可调整大小的元素,可以轻松地创建可自定义的布局。它支持拖放、调整大小、限制范围等功能。

https://github.com/mauricius/vue-draggable-resizable

  1. Vue-Sortablejs - 这是一个基于Sortable.js库的Vue 2.x的拖拽和排序组件,提供了可拖拽的列表和栅格布局功能。

https://github.com/SortableJS/Vue.Sortable

  1. Vue-Draggable - 这个组件提供了基本的拖拽功能,适用于简单的拖放需求。它支持拖拽元素和容器之间的交互,并提供了一些事件和配置选项。

https://github.com/SortableJS/Vue.Draggable

这些组件和框架都是在 Vue.js 生态系统中常用的拖拽相关工具,可以根据项目的需求选择合适的组件来实现拖拽功能。

过拖放实现添加、删除

DataTransfer对象

包含的属性和方法

dataTransfer.dropEffect:设置或返回拖放目标上允许发生的拖放行为。如果此处设置的拖放行为不在effectAllowed属性设置的多种拖放行为之内,拖放操作将会失败。该属性值只允许为none、copy、link和move四个值之一。

dataTransfer.effectAllowed:设置或返回被拖动元素允许发生的拖放行为。该属性值可设置为none、copy、copyLink、copyMove、link、linkMove、move、all和uninitialized。

dataTransfer.items:该属性返回DataTransferltems对象,代表拖动数据。

dataTransfer.setDraglmage(element,x,y):设置拖放操作的自定义图标。

dataTransfer.addElement(element):添加自定义图标。

dataTransfer.types:该属性返回一个DOMStringList对象,该对象包括了存入dataTransfer中数据的所有类型。

dataTransfer.getData(format):获取DataTransfer对象中format格式的数据。

dataTransfer.setData(format,data):向DataTransfer对象中设置format格式的数据。format代表数据格式,data代表数据。

dataTransfer.clearData([format]):清除DataTransfer对象中format格式的数据。



可以将喜欢的水果放入下面的方框内,如果喜欢,可以放到右边的盘子内。

拖放行为

通过设置DataTransfer对象的effectAllowed、dropEffect两个属性可以控制拖放行为。effectAllowed用于控制被拖动元素的拖动行为,dropEffect来控制被“放”入得目标组件的行为。

如果effectAllowed设为none,则不允许拖动该元素。

如果dropEffect设置为none,则被拖动的元素不能“放”到本元素中。

如果effectAllowed设置为all或不设置,则dropEffect可设置为任何属性值,而且将会遵守dropEffect指定的拖放行为。

如果effectAllowed指定了特定的拖放行为,那么dropEffect指定的属性值必须是effectAllowed指定的多个属性值的子集。

上面代码通过调用DataTransfer对象的setDragImage可以改变拖放过程中图标。

简介】

拖放是一种常见的特性, 属于html5标准的一部分, 即抓取对象以后拖动到另一个位置, 在html5中, 任何元素都可被设置拖放。首先, 我们要给需要拖动的HTML元素启用拖动功能, 设置属性draggable="true",

<div draggable="true"></div>

提示:a标签和img标签默认是启用该属性的, 可不需要设置draggable属性。

draggable有三个值, 如下所示:

draggable = true(元素可以被拖动)

draggable = false(元素不能被拖动)

draggable = auto(浏览器可以自主决定某个元素是否可以被拖动)

【用法】

当我们用鼠标拖拽目标元素过程中会触发的事件:

ondragstart:用户按下鼠标开始拖动时触发

ondrag:用户正在拖动时反复触发

ondragend:用户结束拖动后触发

<img id="imgs" ondragstart="startFun()" ondrag="ondragFun()" ondragend="ondragendFun()" src="../img/a.png"/>

当拖动元素进入目标容器内触发的事件:

ondragenter:鼠标拖动对象进入释放区时触发

ondragover:被拖动物体进入目标容器内移动时反复触发

ondragleave:拖动对象在释放区没有释放就离开容器时触发

ondrop:被拖动物体在目标容器内释放时触发

<div id="container" ondragenter="ondragenterFun(event)" ondragover="ondragoverFun(event)" ondragleave="ondragleaveFun()" ondrop="drop()"></div>

ondragenter和ondragover事件的默认行为是拒绝接受任何被拖放的项目, 所以我们必须要做的最重要的事情就是防止这种默认行为的发生。

因此, 我们只需要在这两个事件调用的函数中传入event对象, 使用event.preventDefault()就可取消这种默认行为;举个例子, 在drop事件时, Firefox浏览器会关闭网页, 转而显示被拖动图片img元素src所引用的地址。

取消元素默认行为:

function ondragenterFun(e){

e.preventDefault();

}

function ondragoverFun(e){

e.preventDefault();

}

在event对象中, 我们会使用dataTransfer属性来获取DataTransfer对象, 在DataTransfer对象中有我们操作数据的属性和方法, 具体如下:

datatransfer:转移释放元素的数据到释放区, 返回Datatransfer对象

event.dataTransfer //返回DataTransfer对象

DataTransfer对象的属性:

files:处理从操作系统拖动并释放到释放区的文件;

types:返回一个字符串数组, 该对象包含了dataTransfer对象中数据的所有类型;

items:返回DataTransferItems对象, 该对象代表了拖动数据;

dropEffect:设置拖放目标允许发生的拖放行为, 如果此处设置的拖放行为不在effectAllowed属性设置的可拖放行为内, 拖放操作将会失败。该属性值只允许为"null"、"copy"、"link"或"move";

effectAllowed:设置拖动元素允许发生的拖动行为, 该属性值可为"none"、"copy"、"copyLink"、"copyMove"、"link"、"linkMove"、"move"、"all"或"uninitialized";

DataTransfer对象的方法:

setData( format , data ):将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据。

getData( format ):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据。

clearData( [format] ):从dataTransfer对象中删除指定格式的数据,参数可选,若不给参数,将删除对象中所有的数据。

setDragImage(el, x, y):设置拖放操作的图标,其中el代表自定义图标,x代表图标与鼠标在水平方向上的距离,y代表图标与鼠标在垂直方向上的距离。

了解了H5拖动使用的api以后我们接下来看一个综合的案例, 功能如下:

1)、实现图片拖动功能;

2)、实现图片复制功能;

3)、过滤不能拖动的元素;

4)、实现拖动本地图片到浏览器指定位置;

公共css部分:

<style>

#dropIn{

border:1px solid #AAAAAA;

height:100px;

margin-bottom: 10px;

padding: 10px;

}

#dropIn>img{

margin-right: 10px;

border:2px solid deepskyblue;

}

img{

width:100px;

border-radius: 10px;

border:2px solid red;

}

</style>

html部分:

<body>

<div id="dropIn"></div> <!--释放区-->

<img id="drop1" src="img/a.png" alt="" />

<!--拖动的图片元素-->

</body>

js部分:

<script type="text/javascript">
var darggID;
function getId(el){
return document.getElementById(el)
}
var dropId1 = getId("drop1");
var dropInId = getId("dropIn");
//取消事件默认行为
dropInId.ondragenter = cancelDefault;
dropInId.ondragover = cancelDefault; //绑定拖动元素释放时触发的事件
dropInId.ondrop = drop; //绑定
dropId1.ondragstart = startFun;
function cancelDefault(ev){ //取消默认行为
ev.preventDefault();
}
function startFun(ev){
darggID = ev.target.id;
//获取被拖动元素的id
//从源对象上的事件处理中保存数据,数据类型为"Text"
ev.dataTransfer.setData("Text",darggID);
}
function drop(ev){
ev.preventDefault();
// 从目标对象上的事件处理中读取"Text"类型数据
var data=ev.dataTransfer.getData("Text");
// 插入到目标对象中
ev.target.appendChild(document.getElementById(data));
}
</script>

接下来我们添加两张图, "drop2"是实现复制的图片, "drop3"是既不能复制也不能拖动的图片;

<img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />

添加js代码:

//获取页面元素

var dropId2 = getId("drop2");

var dropId3 = getId("drop3");

//绑定事件

dropId2.ondragstart = startFun;dropId3.ondragstart = startFun;

//修改drop函数为

function drop(ev){

ev.preventDefault();

// 从目标对象上的事件处理中读取"Text"类型数据

var data=ev.dataTransfer.getData("Text");

if(data=='drop1'){

//移动

ev.target.appendChild(document.getElementById(data));

}

if(data=='drop2'){//复制

var nreEl=document.getElementById(darggID).cloneNode(false);

getId("dropIn").appendChild(nreEl);

}

if(data=='drop3'){//过滤drop3,drop3不做任何操作

alert('过滤drop3')

}

}

接下来我们实现拖动本地图片到浏览器, 我们就将图片拖动到id为"dropIn"的这个div中;添加js:

/*document 监听drop 并阻止浏览器打开客户端的图片*/

document.ondragover = function (e) {

//只有在ondragover中阻止默认行为

e.preventDefault();

};

document.ondrop = function (e) {

//阻止 document.ondrop的默认行为

e.preventDefault();

};

//dropIn是div的id

dropIn.ondrop = function (e) {

var list = e.dataTransfer.files;

for (var i = 0; i < list.length; i++) {

var f = list[i];

reader(f);

}

};

function reader(f) {

var reader = new FileReader();

//读取数据

reader.readAsDataURL(f);

reader.onload = function () {

var img = new Image();

img.src = reader.result;

dropIn.appendChild(img);

}

}

【浏览器支持】

目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。

最后再和大家分享一个技巧, 这种拖动行为还能跨浏览器工作, 这里说的跨浏览器不是浏览器之间的跨窗口, 而是可以从Chrome浏览器拖动到Firefox浏览器, 因为拖放功能的支持是集成在操作系统里面的, 有着相同的特性。