JS实现简易的图片拖拽排序实例代码


Posted in Javascript onJune 09, 2017

由HTML5的拖放API,实现的简易图片拖放效果。

一、HTML5拖放API的知识点

首先我们得知道元素怎么才可以被拖放,需要设置它们的draggable属性,其中img和a标签的dragable属性默认是true,不需要我们手动设置。

拖放API的监听事件如下:

  1. dragstart: 源对象拖拽开始;
  2. drag: 源对象拖拽的过程中;
  3. dragend: 源对象拖拽结束;
  4. dragenter: 进入过程对象区域;
  5. dragover: 在过程对象区域内移动;
  6. dragleave: 离开过程对象区域;
  7. drop: 源对象拖放到目标区域。

对于这几个事件,我们要结合需求利用preventDefault()取消它的默认行为。

在拖放事件中,提供dataTransfer用于在源对象与目标对象之间传递数据,dataTransfer一般通过e.dataTransfer调用,dataTransfer的方法如下:

  1. setData(format, data)
  2. getData(format);
  3. clearData()。

以上是一些基础知识,与其听我BB,不如去打开MDN,再敲几行代码岂不是美滋滋。

二、简易的图片拖拽排序。

先放效果图吧:

JS实现简易的图片拖拽排序实例代码

首先看看我们的dom结构

<!-- 部分标签 -->
  div#drag-wrap
    div(class="item" id="wrap1")
      img(id="img1")
    ...
    ...

我们需要监听的事件:

const dragCon = document.getElementById('drag-wrap');

  dragCon.addEventListener('dragstart', startDrag, false);

  /**
  * 这里一定要阻止dragover的默认行为,不然触发不了drop
  */
  dragCon.addEventListener('dragover', function (e) {
    e.preventDefault();
  }, false);
  dragCon.addEventListener('drop', exchangeElement, false);

在dragstart事件中,我们需要记住需要交换的子元素和父元素:

function startDrag(e) {
    e.dataTransfer.setData('Text', e.target.id + ';' + e.target.parentElement.id);
  }

最重要的就是在drop事件中处理我们交换元素的逻辑和一些边缘条件的判断。

function exchangeElement(e) {
    e.preventDefault();
    const el = e.target;
    let PE, //要插入位置的父元素
      CE; //需要交换的元素
    if (el.tagName.toLowerCase() !== 'div') {           PE = el.parentElement;
      CE = el;
    } else {
      PE = el;
      CE = el.querySelector('img');
    }

    /**
     * 判断不在控制范围内
     */
    if (!PE.classList.contains('item')) {
      return;
    }
    const data = e.dataTransfer.getData('Text').split(';');
    //交换元素
    document.getElementById(data[1]).appendChild(CE);
    PE.appendChild(document.getElementById(data[0]));
  }

其实如果你充分利用几个阶段的事件,做出的效果会更精致。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS控件的生命周期介绍
Oct 22 Javascript
JS实现根据当前文字选择返回被选中的文字
May 21 Javascript
3种Jquery限制文本框只能输入数字字母的方法
Dec 03 Javascript
面包屑导航详解
Dec 07 Javascript
react中使用swiper的具体方法
May 15 Javascript
JavaScript继承与多继承实例分析
May 26 Javascript
通过layer实现可输入的模态框的例子
Sep 27 Javascript
vue中在vuex的actions中请求数据实例
Nov 08 Javascript
JavaScript使用canvas绘制随机验证码
Feb 17 Javascript
vue项目中使用多选框的实例代码
Jul 22 Javascript
vue 监听 Treeselect 选择项的改变操作
Aug 31 Javascript
js实现复制粘贴的两种方法
Dec 04 Javascript
jQuery为某个div加入行样式
Jun 09 #jQuery
Vue.js中轻松解决v-for执行出错的三个方案
Jun 09 #Javascript
node.js中cluster的使用教程
Jun 09 #Javascript
vue bootstrap小例子一枚
Jun 09 #Javascript
详解webpack解惑:require的五种用法
Jun 09 #Javascript
Bootstrap输入框组件使用详解
Jun 09 #Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
Jun 09 #jQuery
You might like
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
一个可以显示阴历的JS代码
2007/03/05 Javascript
js 数组操作代码集锦
2009/04/28 Javascript
jQuery 使用手册(二)
2009/09/23 Javascript
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
Js 随机数产生6位数字
2010/05/13 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
python开发中module模块用法实例分析
2015/11/12 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
python3 pygame实现接小球游戏
2019/05/14 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
Python高并发和多线程有什么关系
2020/11/14 Python
Python修改DBF文件指定列
2020/12/19 Python
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
电气自动化求职信
2014/06/24 职场文书
五一劳动节活动总结
2015/02/09 职场文书
机关保密工作承诺书
2015/05/04 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
教你怎么用python selenium实现自动化测试
2021/05/27 Python
详解Vue的列表渲染
2021/11/20 Vue.js
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技