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实现字体选色板实例代码
Nov 20 Javascript
JavaScript与HTML的结合方法详解
Nov 23 Javascript
详解vue-cli + webpack 多页面实例应用
Apr 25 Javascript
vue获取DOM元素并设置属性的两种实现方法
Sep 30 Javascript
AngularJS动态添加数据并删除的实例
Feb 27 Javascript
vux uploader 图片上传组件的安装使用方法
May 15 Javascript
微信小程序实现人脸检测功能
May 25 Javascript
layui监听工具栏的实例(操作列表按钮)
Sep 10 Javascript
浅谈vuex的基本用法和mapaction传值问题
Nov 08 Javascript
Vue实现Layui的集成方法步骤
Apr 10 Javascript
vue根据条件不同显示不同按钮的操作
Aug 04 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
Aug 06 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面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
PHP修改session_id示例代码
2014/01/08 PHP
两款万能的php分页类
2015/11/12 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
用javascript控制iframe滚动的代码
2007/04/10 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
jQuery表单元素选择器代码实例
2017/02/06 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
2017/03/23 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
three.js 入门案例详解
2018/01/23 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
JQuery常见节点操作实例分析
2019/05/15 jQuery
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
python 瀑布线指标编写实例
2020/06/03 Python
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
俄罗斯天然和有机产品、健康生活网上商店:Fitomarket.ru
2020/10/09 全球购物
学期自我鉴定
2013/11/04 职场文书
计算机专业推荐信范文
2013/11/27 职场文书
员工生日会策划方案
2014/06/14 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书