Vue拖拽插件——Draglua 中文使用教程

声明

本人也在不断的学习和积累中,文章中有不足和误导的地方还请见谅,可以给我留言指正。希望和大家共同进步,共建和谐学习环境。

特征

  • 超级容易设置
  • 没有臃肿的依赖
  • 自己计算排序顺序
  • 物品将被丢弃的阴影提供视觉反馈
  • 触摸事件!
  • 无需任何配置即可无缝处理点击

安装

1、npm安装

   npm install dragula --save

2、bower安装

   bower install dragula --save

3、CDN

<script src='https://cdnjs.cloudflare.com/ajax/libs/dragula/$VERSION/dragula.min.js'></script>

注:最好放在<body>中引用,不要放在<head>中。

css

需要引入一些css样式,在页面中引入dist/dragula.cssdist/dragula.min.css,如果你使用的是Stylus,你可以这样引入

@import 'node_modules/dragula/dragula'

方法

dragula(containers?, options?)

dragula 允许在containers中间互相拖动,如果拖动到containers之外的元素时,会根据 revertOnSpill 和removeOnSpill 的配置终止操作。
请注意,拖动仅在左键单击时触发

下面的示例允许用户将元素从中left拖入right和从中right拖入left

dragula([document.querySelector('#left'), document.querySelector('#right')]);

您还可以提供一个options对象。以下是默认值的介绍

dragula(containers, {
  isContainer: function (el) {
    return false; // 点击和拖动都会触发,drake.containers元素将被考虑
  },
  moves: function (el, source, handle, sibling) {
    return true; // 一直能拖动,拖动时触发
  },
  accepts: function (el, target, source, sibling) {
    return true; // 元素可以放在任何`container`中
  },
  invalid: function (el, handle) {
    return false; // 默认情况下不会阻止任何拖动
  },
  direction: 'vertical',             //元素的排放方向
  copy: false,                       // 拖动的元素是否为副本
  copySortSource: false,             // 复制的源容器重新排序
  revertOnSpill: false,              // 是否将拖到容器外的元素放回原处
  removeOnSpill: false,              // 是否将拖到容器外的元素删除
  mirrorContainer: document.body,    // 设置获取附加镜像元素的元素
  ignoreInputTextSelection: true     //允许用户选择输入文本
});

您可以省略container参数,稍后动态添加容器。

var drake = dragula({
  copy: true
});
drake.containers.push(container);

还可以从options对象设置容器

var drake = dragula({ containers: containers });

你还可以设置一个没有container和options的draglua

var drake = dragula();

options对象详解:

containers:

和dragula(containers?, options?)的第一个参数效果是一样的。

isContainer:

containers,您还可以使用此方法指定任何类型的逻辑,这些逻辑定义了这个特定drake实例的containers
下面的示例使用一个CSS类dragula-container动态地处理所有DOM元素,将它们作为这个drake的dragula容器。

var drake = dragula({
isContainer: function (el) {
   return el.classList.contains('dragula-container');
 }
});
moves:

您可以定义一个moves方法,当单击一个元素时,它将被调用(el、source、handle、sibling)。如果此方法返回false,则不会开始拖动事件,也不会阻止该事件。handle元素将是原始的单击目标,这便于测试该元素是否是预期的“drag handle”。

accepts:

您可以将accept设置为具有以下签名的方法:(el、target、source、sibling)。它将被调用,以确保来自source的元素el可以在sibling元素之前被拖放到容器target上。sibling元素可以为null,这意味着元素将作为容器中的最后一个元素放置。注意如果options .copy被设置为true, el将被设置为copy,而不是原来拖动的元素。

还要注意,拖动开始的位置始终是放置元素的有效位置,即使在所有元素accepts都返回false。

copy:

如果copy被设置为true(或返回true的方法),那么项目将被复制,而不是移动。这意味着下列差别:
drag ---- move: 元素将从源中隐藏 / copy: 什么都不会发生
drop ---- move:元素将被移动到目标中 / copy: 元素将克隆到目标
remove----move:元素将从DOM中删除 / copy: 什么都不会发生
cancel----move:元素将保留在源代码中/ copy: 什么都不会发生

如果传递了一个方法,则无论何时开始拖拽一个元素,都会调用该方法,以决定它是否应该遵循复制行为。考虑下面的例子。

copy: function (el, source) {
 return el.className === 'you-may-copy-us';
}
copySortSource:

如果copy被设置为true(或返回true的方法),copySortSource也为true,那么用户将能够对复制源容器中的元素进行排序。

revertOnSpill:

默认情况下,将元素溢出到任何容器外将会将元素移回反馈阴影预览的放置位置。将revertOnSpill设置为true将确保将任何经过批准的容器外的元素移回拖放事件开始的源元素,而不是停留在反馈阴影预览的拖放位置。

removeOnSpill:

默认情况下,将元素溢出到任何容器外将会将元素移回反馈阴影预览的放置位置。将removeOnSpill设置为true将确保从DOM中删除任何经过批准的容器之外的元素。注意,如果copy被设置为true,那么remove事件不会触发。

direction:

当一个元素被放到容器中时,它将被放置在鼠标被释放的位置附近。如果方向为“vertical”(默认值),则将考虑Y轴。否则,如果方向为“horizontal”,则考虑X轴。

invalid:

您可以提供一个带有(el, handle)签名的无效方法。对于不应该触发拖动的元素,此方法应该返回true。handle参数是被单击的元素,而el是要拖动的项。这是默认实现,它不阻止任何拖动。

function invalidTarget (el, handle) {
 return false;
}

请注意,invalid将在被单击的DOM元素和drake容器的每个父元素及其直接子元素上调用。

例如,当单击的元素(或其任何父元素)是锚标记时,可以将invalid设置为return false。

invalid: function (el, handle) {
 return el.tagName === 'A';
}
mirrorContainer:

拖动时显示镜像元素的DOM元素将被附加到其中。默认为document.body

ignoreInputTextSelection:

当启用此选项时,如果用户单击输入元素,则在鼠标指针退出输入之前不会开始拖动。这意味着用户可以在包含在draggable元素中的输入中选择文本,并且仍然可以通过将鼠标移到输入之外来拖动该元素——这样您就可以同时使用这两种方法。

默认情况下启用此选项。通过设置为false来关闭它。如果禁用了它,用户将无法用鼠标在dragula容器的输入中选择文本。

API:

dragula方法返回一个带有简洁API的小对象。我们将把dragula返回的API称为drake。

drake.containers

此属性包含构建此drake实例时传递给dragula的容器集合。您可以随意push更多的容器和拼接旧容器。

drake.dragging

每当拖动元素时,此属性将为true。

drake.start(item)

进入没有阴影的拖动模式。当为现有的拖放解决方案提供互补的键盘快捷方式时,此方法非常有用。虽然一开始不会创建阴影,但是用户只要单击项目并开始拖动它,就会得到阴影。注意,如果他们单击并拖动其他内容,.end将在获取新项目之前被调用。

drake.end()

优雅地结束拖放事件,就像使用预览阴影标记的最后一个位置作为拖放目标一样。cancel或drop事件将被触发,这取决于该项目是否被拖回到最初被提取的地方(本质上是一个被视为cancel事件的no-op)。

drake.cancel(revert)

如果当前正在拖拽drake管理的元素,此方法将优雅地取消拖拽操作。您还可以在方法调用时传递revert,有效地生成与revertOnSpill为true时相同的结果。

注意,“取消”只会在以下场景中导致取消事件。
1、revertOnSpill 为 true
2、Drop target(如反馈阴影预览的那样)是源容器,项目将被放置在最初拖动它的位置

drake.remove()

如果当前正在拖拽drake管理的元素,此方法将优雅地将其从DOM中删除。

drake.on (Events)

drake是一个事件发射器。drake.on(type, listener)可以使用drake跟踪以下事件。

Events:

  • drag,(el, source) —— el被从source 移除
  • dragend,(el) —— el的拖动事件以cancel、remove或drop结束
  • drop,(el, target, source, sibling) ——el在sibling元素之前被放入target 中,最初来自 source
  • cancel,(el, container, source) —— el被拖着走,但它什么也没得到,又回到了它最后一个稳定的container里;el最初来源于source
  • remove,(el, container, source) —— el被拖着走了,被从DOM中移除。它最后一个稳定的父类是container,最初来自source
  • shadow,(el, container, source) —— el,视觉辅助阴影,被移动到container中。当el位置发生变化时,即使在同一容器内,也可能多次触发;el最初来源于source
  • over,(el, container, source) —— el是over container,最初来自source
  • out,(el, container, source) —— el被拖出容器或被丢弃,最初来自source
  • cloned,(clone, original, type) —— DOM元素original被克隆为clone,类型为('mirror'或'copy')。为镜像和复制时触发:true
drake.canMove(item)

返回drake实例是否可以接受DOM元素项的拖动。当满足下面列出的所有条件时,此方法返回true,否则返回false。

  • item是drake指定容器之一的子容器
  • item通过相关的无效检查
  • item通过移动检查
drake.destroy()

删除dragula用于管理容器之间拖放的所有拖放事件。如果在拖动元素时调用.destroy,则该拖动将被有效地取消。

css:

Dragula只使用四个CSS类。下面将快速解释它们的用途

  • gu-unselectable ----- 在拖动时添加到mirrorContainer元素。您可以在拖动对象时使用它来设置mirrorContainer的样式。
  • gu-transit ----- 在拖动源元素的镜像时将其添加到源元素。它只是增加了不透明度。
  • gu-mirror ----- 被添加到镜像中。它处理fixed 定位和z-index(并删除元素上的任何先前的边距)。注意,镜像被附加到mirrorContainer,而不是它的初始容器。当使用嵌套规则对元素进行样式化时,请记住这一点,比如.list .item {padding: 10px;}
  • gu-hide ----- 是一个帮助类,用于对元素应用display: none。

默认:

.gu-mirror {
  position: fixed !important;
  margin: 0 !important;
  z-index: 9999 !important;
  opacity: 0.8;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
  filter: alpha(opacity=80);
}
.gu-hide {
  display: none !important;
}
.gu-unselectable {
  -webkit-user-select: none !important;
  -moz-user-select: none !important;
  -ms-user-select: none !important;
  user-select: none !important;
}
.gu-transit {
  opacity: 0.2;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
  filter: alpha(opacity=20);
}

参考

Github/dragula

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容