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实现的批量图片预览加载功能
Aug 14 Javascript
JS获取鼠标坐标的实例方法
Jul 18 Javascript
特殊情况下如何获取span里面的值
May 20 Javascript
jQuery简单实现隐藏以及显示特效
Feb 26 Javascript
js实现兼容IE和FF的上下层的移动
May 04 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
Aug 10 Javascript
使用JQuery 加载页面时调用JS的实现方法
May 30 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
Jun 24 Javascript
AngularJS基础 ng-dblclick 指令用法
Aug 01 Javascript
React组件的三种写法总结
Jan 12 Javascript
谈谈JS中的!!
Dec 07 Javascript
JS实现省市县三级下拉联动
Apr 10 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
python Django批量导入数据
2016/03/25 Python
python散点图实例之随机漫步
2018/08/27 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Python语法分析之字符串格式化
2019/06/13 Python
Python安装selenium包详细过程
2019/07/23 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
python学习笔记之多进程
2020/08/06 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
python 实现图片批量压缩的示例
2020/12/18 Python
html5+svg学习指南之SVG基础知识
2014/12/17 HTML / CSS
生物科学专业个人求职信范文
2013/12/07 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle
PyTorch中的torch.cat简单介绍
2022/03/17 Python