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 相关文章推荐
setTimeout函数兼容各主流浏览器运行执行效果实例
Jun 13 Javascript
调试JavaScript中正则表达式中遇到的问题
Jan 27 Javascript
jquery实现简单合拢与展开网页面板的方法
Sep 01 Javascript
Spring mvc 接收json对象
Dec 10 Javascript
详解vue-Resource(与后端数据交互)
Jan 16 Javascript
理解Angular的providers给Http添加默认headers
Jul 04 Javascript
AngularJS 表单验证手机号的实例(非必填)
Nov 12 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
vue 使用自定义指令实现表单校验的方法
Aug 28 Javascript
原生JS实现轮播图效果
Oct 12 Javascript
解决Vue中 父子传值 数据丢失问题
Aug 27 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
Oct 27 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入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
深入解析php之apc
2013/05/15 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
js实现蒙版效果
2020/01/11 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
[02:27]刀塔重生降临
2015/10/14 DOTA
python文件与目录操作实例详解
2016/02/22 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
django rest framework serializers序列化实例
2020/05/13 Python
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
物流司机岗位职责
2013/12/28 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
怎样写好创业计划书的内容
2014/02/06 职场文书
一名老师的自我评价
2014/02/07 职场文书
鼓励运动员的广播稿
2014/02/08 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
保险内勤岗位职责
2015/04/13 职场文书
寒假生活随笔
2015/08/15 职场文书
会计主管竞聘书
2015/09/15 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript