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 相关文章推荐
JavaScript Event学习补遗 addEventSimple
Feb 11 Javascript
SWFObject 2.1以上版本语法介绍
Jul 10 Javascript
jQuery学习总结之jQuery事件
Jun 30 Javascript
使用javascript实现雪花飘落的效果
Jan 13 Javascript
jQuery深拷贝Json对象简单示例
Jul 06 Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
JS中Attr的用法详解
Oct 09 Javascript
vue 点击按钮实现动态挂载子组件的方法
Sep 07 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
Nov 25 Javascript
webpack 代码分离优化快速指北
May 18 Javascript
vue2.0 watch里面的 deep和immediate用法说明
Oct 30 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
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
php split汉字
2009/06/05 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
javascript写的一个链表实现代码
2009/10/25 Javascript
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
150行代码带你实现微信小程序中的数据侦听
2019/05/17 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
python实现Floyd算法
2018/01/03 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
什么是设计模式
2012/06/17 面试题
连带责任保证书
2014/04/29 职场文书
大学学风建设方案
2014/05/04 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
大学副班长竞选稿
2015/11/21 职场文书
初一数学教学反思
2016/02/17 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
python实现批量提取指定文件夹下同类型文件
2021/04/05 Python