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 相关文章推荐
父窗口获取弹出子窗口文本框的值
Jun 27 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
Mar 19 Javascript
javascript + jquery实现定时修改文章标题
Mar 19 Javascript
js实现回放拖拽轨迹从过程上进行分析
Jun 26 Javascript
js通过location.search来获取页面传来的参数
Sep 11 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
Apr 08 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
Jan 14 Javascript
angularjs实现的前端分页控件示例
Feb 10 Javascript
微信小程序生成海报分享朋友圈的实现方法
May 06 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
在vue中动态修改css其中一个属性值操作
Dec 07 Vue.js
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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
基于node.js之调试器详解
2017/08/22 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
python查询sqlite数据表的方法
2015/05/08 Python
Python中的random()方法的使用介绍
2015/05/15 Python
Python global全局变量函数详解
2018/09/18 Python
python logging日志模块原理及操作解析
2019/10/12 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
艺术系应届生的自我评价
2013/10/19 职场文书
个人自我鉴定写法
2013/11/30 职场文书
企业内部培训方案
2014/02/04 职场文书
学历公证书范本
2014/04/09 职场文书
门市房租房协议书
2014/12/04 职场文书
正规欠条模板
2015/07/03 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android