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的几种方法
Oct 23 Javascript
asp.net 30分钟掌握无刷新 Repeater
Sep 16 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 Javascript
$.getJSON在IE下失效的原因分析及解决方法
Jun 16 Javascript
Knockout visible绑定使用方法
Nov 15 Javascript
javascript中Date()函数在各浏览器中的显示效果
Jun 18 Javascript
jquery解析json格式数据的方法(对象、字符串)
Nov 24 Javascript
JS验证逗号隔开可以是中文字母数字
Apr 22 Javascript
jQuery实现动态文字搜索功能
Jan 05 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
Aug 10 Javascript
JavaScript接口实现方法实例分析
May 16 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
Jun 22 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
百度地图API使用方法详解
2015/08/25 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
JQuery 操作/获取table具体代码
2013/06/13 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
在Python中操作字典之update()方法的使用
2015/05/22 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
python解决字符串倒序输出的问题
2018/06/25 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
泰国网上购物:Shopee泰国
2018/09/14 全球购物
opencv实现图像平移效果
2021/03/24 Python
旅游个人求职信范文
2014/01/30 职场文书
优秀教师主要事迹
2014/02/01 职场文书
后勤部经理岗位职责
2014/02/23 职场文书
地雷战观后感
2015/06/09 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python