























interact.js和大多数拖拽库相比有点不太一样:它提供了简单、灵活的API,对外暴露操作DOM元素所需的全部鼠标或触摸事件信息。但为了更自主的控制,**它不会对DOM元素进行任何操作!**你必须自己操作DOM,实现UI的响应——拖拽、绘制或者滚动页面等。
这是一个很特别的拖拽库:
为了避免枯燥的概念,可以先看一个用interact.js实现的,包含吸附和左对齐的组件拖拽demo:
Action是interact.js定义的一种概念,有三种Action——Draggable、Resizable和Gesturable,对应拖拽、缩放、手势(移动端)三种操作。
在这些Action中,实现了对鼠标或触摸操作中原生事件的封装,并将事件对象interaction暴露给事件回调。
Draggable、Resizable和Gesturable三者的基本语法是一致的,以Draggable为例:
1 | <style> |
需要注意的是,Action的回调函数提供了三个语法形式,它们的效果完全一样,可以选择任意一个使用。
1 |
|
Resizable对应的三种形式的事件为:
onstart onmove oninertiastart onendstart move inertiastart endresizestart resizemove resizeinertiastart resizeendGesturable对应的三种形式的事件为:
onstart onmove onendstart move endgesturestart gesturemove gestureendDraggable、Resizable、Gesturable三种Action,有一些公共参数(Action Options),公共参数可以对Action进行一些扩展或约束:
max - 限制Interactable的事件绑定数maxPerElement - 限制Interactable对象和对应元素的事件绑定数manualStart - 手动启动事件hold - 长按指定毫秒数,才能触发Actioninertia - 实现惯性拖拽、缩放styleCursor - 开关拖拽、缩放的鼠标指针样式cursorChecker - 根据事件手动设置鼠标指针样式autoScroll - 鼠标超出范围时,是否允许容器滚动allowFrom - 定义可操作的范围或元素(相当于拖拽、缩放把手)ignoreFrom - 定义不可操作的范围或元素enabled - 是否启用除了这些公共参数,Draggable和Resizable还分别有各自的专有参数,可以在文档各章节找到:
用enabled参数,可以设置Action的开关状态。
1 |
|
Dropzone可以定义一个拖拽的放置区,主要和Draggable配合,实现拖拽-移动-放置的效果。
在Dropzone的回调事件中,可以操作放置区本身(event.target),也可以操作拖拽元素(event.relatedTarget)。
1 | interact('.dropzone').dropzone({ |
在Action中,modifiers参数接收一个数组,数组包含一系列的Modifier对象,用于按顺序对Action的事件进行修改。
interact.js提供了两种内置的Modifier——Restrict(限制)和Snapping(吸附)。
Restrict是一种限制鼠标或元素移动范围的Modifier。
如以下示例代码,interact.modifiers.restrictRect定义了拖拽事件中,元素不能超出父元素的修改器。
1 | interact('.son').draggable({ |
它会在onmove事件回调触发前,判断元素是否超出了父元素:
event.dx(x方向位移)修改为0event.dy(y方向位移)修改为0这样,在onmove中定义的DOM操作,会在元素即将超出父元素时停止移动,实现 restrictRect 的限制逻辑。
除了restrict,还可以根据不同的需要,使用restrict、elementRect、restrictSize、restrictEdge(Restrict)。
Snapping也是一种Modifier,它指定一系列的坐标点或轴线,在元素靠近时,实现吸附效果。
如以下示例代码,interact.modifiers.snap定义了拖拽事件中,元素的左上角、中心和右下角,在靠近到50px距离时,会吸附到父元素(300, 300)的坐标点。
1 | interact('.draggable').draggable({ |
它会在onmove事件回调触发前,判断元素的3个点和(300, 300)的距离:
event.dx,event.dy,吸附过去event.dx,event.dy,取消吸附,有一个弹开的效果这样,在onmove中定义的DOM操作,会实现真正的吸附效果。
除了snap,还可以根据不同的需要,使用snapSize、snapEdges、[Snapping]((https://interactjs.io/docs/snapping/#snapsize))。
Snapping中的 targets 参数,接收一个数组,数组中可以是:
{ x: 100, y: 100 } 的吸附点对象{ x: 100 } 的吸附线对象interact.snappers.grid 生成的网格数组中的多个对象或函数,interact.js会在内部判断距离最近的吸附,最终执行吸附。
其中直接传入点对象、线对象和网格比较死板,不能实现动态的吸附效果。
用函数的方式,可以根据事件信息、元素相对位置等,通过实时计算,达到动态吸附效果:
1 | function snapFunc ( |
除了Action这种组合操作的事件,interact.js也支持原子化的鼠标或触摸事件:
downmoveupcanceltapdoubletaphold例如长按事件:
1 | interact('.button').on('hold', (event) => { |
interact.js的使用全流程:
interact('.css-selector')初始化一个Interactable对象总体来说,interact.js是一个比较简单的拖拽库,其优势在于灵活性——你可以让拖拽行为变成在canvas上画画,也可以用手势实现一个类似愤怒小鸟的拉弹弓的弹性效果。另外,如果对于性能有非常极限的要求,你可以在DOM操作中做各种艺术体操,满足性能指标。
如果你只是简单想实现一个拖拽商品列表的功能,那么建议不要使用interact.js,去用其他正常一点的拖拽库吧。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。