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 计算当天是本年本月的第几周
Mar 22 Javascript
一个简单的JavaScript 日期计算算法
Sep 11 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
Jan 23 Javascript
jquery+ajax验证不通过也提交表单问题处理
Dec 12 Javascript
用jQuery实现优酷首页轮播图
Jan 09 Javascript
React-Native做一个文本输入框组件的实现代码
Aug 10 Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 jQuery
在vue项目中集成graphql(vue-ApolloClient)
Sep 08 Javascript
微信小程序实现文件、图片上传功能
Aug 18 Javascript
Node.js 的 GC 机制详解
Jun 03 Javascript
layui实现数据分页功能(ajax异步)
Jul 27 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 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
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
js opener的使用详解
2014/01/11 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
Python实现文件按照日期命名的方法
2015/07/09 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
对Python信号处理模块signal详解
2019/01/09 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
python学生信息管理系统实现代码
2019/12/17 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
python对文件的操作方法汇总
2020/02/28 Python
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
初中物理教学反思
2014/01/14 职场文书
婚庆公司的创业计划书
2014/01/22 职场文书
诉前财产保全担保书
2014/05/20 职场文书
中文专业求职信
2014/06/20 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
pytorch中[..., 0]的用法说明
2021/05/20 Python