JavaScript前端拖拽插件interact.js交互式操作方法
interact.js 是一款輕量且功能強大的 JavaScript 拖拽交互庫,核心用于實現(xiàn)元素的拖拽、縮放、旋轉(zhuǎn)等交互式操作。
一、核心特點
- 輕量無依賴,體積僅約 10KB(壓縮后),不依賴 jQuery 等框架。
- 支持多端適配,兼容桌面端(鼠標)和移動端(觸摸),適配主流瀏覽器。
- 功能豐富,除基礎(chǔ)拖拽外,還支持元素縮放、旋轉(zhuǎn)、拖拽對齊、碰撞檢測等進階功能。
- 高度可定制,可通過配置限制拖拽范圍、設(shè)置縮放比例、自定義交互回調(diào)等。
二、核心功能
- 拖拽(Draggable):支持元素自由拖拽、限制拖拽方向(水平 / 垂直)、設(shè)置拖拽邊界。
- 縮放(Resizable):允許通過拖拽元素邊緣 / 角落調(diào)整尺寸,可限制縮放比例和方向。
- 旋轉(zhuǎn)(Rotatable):支持鼠標 / 觸摸控制元素旋轉(zhuǎn),可設(shè)置旋轉(zhuǎn)中心和角度范圍。
- 交互輔助:提供拖拽對齊(吸附到網(wǎng)格 / 其他元素)、碰撞檢測、拖拽排序等實用功能。
三、適用場景
- 頁面組件拖拽排序(如儀表盤、表單元素配置)。
- 可視化工具(如圖表編輯器、流程圖制作工具)。
- 響應(yīng)式界面調(diào)整(如可縮放的面板、彈窗)。
- 移動端交互組件(如拖拽式菜單、滑動卡片)。
四、安裝使用
首先需要引入 interact.js 庫,有兩種方式:
CDN 引入(推薦快速測試):
<script src="https://cdn.jsdelivr.net/npm/interactjs/dist/interact.min.js"></script>
npm 安裝(適合項目開發(fā)):
npm install interactjs
五、相關(guān)屬性
1、拖拽(draggable)核心屬性
通過 interact(selector).draggable({ /* 配置 */ }) 定義,主要屬性包括:
| 屬性名 | 類型 / 值 | 說明 |
|---|---|---|
enabled | boolean | 是否啟用拖拽(默認 true,設(shè)為 false 可動態(tài)禁用)。 |
inertia | boolean / 對象 | 啟用慣性拖拽(拖拽結(jié)束后繼續(xù)滑動)。- 為對象時可配置:- resistance:阻力(0~1,值越小慣性越強,默認 0.1);- minSpeed:觸發(fā)慣性的最小速度(默認 100px/s);- endSpeed:慣性結(jié)束時的速度閾值(默認 10px/s)。 |
autoScroll | boolean / 對象 | 拖拽到容器邊緣時自動滾動容器(如頁面、滾動框)。- 為對象時可配置:- speed:滾動速度(默認 50px/s);- margin:觸發(fā)滾動的邊緣距離(默認 60px);- container:指定滾動容器(默認 window)。 |
restrict | 對象 | 限制拖拽范圍,支持:- restriction:限制區(qū)域(parent/ 選擇器 / 坐標對象 {left, top, right, bottom});- endOnly:true 時僅在拖拽結(jié)束后校正位置(默認實時限制);- elementRect:元素參與限制的區(qū)域(如 {left:0, right:1, top:0, bottom:1} 代表整個元素)。 |
axis | 'x' / 'y' / null | 限制拖拽方向(x 水平,y 垂直,null 自由拖拽,默認 null)。 |
snap | 對象 | 拖拽時吸附到網(wǎng)格或元素,支持:- targets:吸附目標(如 interact.snappers.grid({x:20, y:20}) 表示 20px 網(wǎng)格);- offset:吸附偏移量(如 {x:10, y:10});- relativePoints:元素上的吸附參考點(如 [{x:0.5, y:0.5}] 為中心點)。 |
allowFrom | 選擇器 | 僅允許通過元素內(nèi)的指定子元素觸發(fā)拖拽(如 .handle 表示僅通過手柄拖拽)。 |
ignoreFrom | 選擇器 | 忽略元素內(nèi)的指定子元素(不觸發(fā)拖拽,如 .no-drag)。 |
2、縮放(resizable)核心屬性
通過 interact(selector).resizable({ /* 配置 */ }) 定義,主要屬性包括:
| 屬性名 | 類型 / 值 | 說明 |
|---|---|---|
enabled | boolean | 是否啟用縮放(默認 true)。 |
edges | 對象 | 允許縮放的邊緣({left, right, top, bottom},設(shè)為 true 啟用對應(yīng)邊緣)。例:{left: true, right: true, bottom: true} 允許左、右、下邊緣縮放。 |
inertia | boolean / 對象 | 縮放慣性(類似拖拽,結(jié)束后繼續(xù)微小縮放),配置同拖拽的 inertia。 |
restrict | 對象 | 限制縮放范圍,支持:- min:最小尺寸({width, height});- max:最大尺寸({width, height});- ratio:寬高比(如 16/9 鎖定比例)。 |
snap | 對象 | 縮放到指定網(wǎng)格尺寸,如 {targets: [interact.snappers.grid({width:50, height:50})]} 表示寬高按 50px 遞增。 |
allowFrom / ignoreFrom | 選擇器 | 同拖拽,控制觸發(fā)縮放的子元素。 |
3、通用事件屬性
所有交互(拖拽、縮放、旋轉(zhuǎn))都支持通過 .on(eventName, callback) 監(jiān)聽事件,常用事件:
| 事件名 | 觸發(fā)時機 | 回調(diào)參數(shù)(event)關(guān)鍵信息 |
|---|---|---|
[type]start | 交互開始時(如 dragstart) | event.target(目標元素)、初始坐標 / 角度。 |
[type]move | 交互過程中(如 dragmove) | event.dx/dy(位移變化)、event.angle(角度變化)等。 |
[type]end | 交互結(jié)束時(如 dragend) | event.velocity(結(jié)束時速度)、最終狀態(tài)信息。 |
4、注意事項(1.10.7 版本)
- 該版本依賴元素的
transform屬性計算位置,需確保元素未被其他transform樣式(如scale)干擾,否則可能導(dǎo)致位置偏移。 autoScroll對嵌套滾動容器的支持有限,復(fù)雜場景可能需要手動處理滾動邏輯。
六、拖拽示例
// html
<div id="content"></div>
// js
let position = { x: 0, y: 0 };
interact('#content').draggable({
ignoreFrom: ".restore-drag,.tc-fz-input",// 忽略的類
listeners: {
start:(event) {},
move (event) {
position.x += event.dx;
position.y += event.dy;
event.target.style.transform = `translate(${position.x}px, ${position.y}px)`; },
end(event) {}
},
});總結(jié)
到此這篇關(guān)于JavaScript前端拖拽插件interact.js交互式操作方法的文章就介紹到這了,更多相關(guān)interact.js前端拖拽插件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js jquery 獲取某一元素到瀏覽器頂端的距離實現(xiàn)方法
今天小編就為大家分享一篇js jquery 獲取某一元素到瀏覽器頂端的距離實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
JavaScript中的稀疏數(shù)組與密集數(shù)組[譯]
一般來說,JavaScript中的數(shù)組是稀疏的,也就是說,數(shù)組中的元素之間可以有空隙,因為一個數(shù)組其實就是一個鍵值映射.本文解釋了如何創(chuàng)建稀疏數(shù)組和不稀疏的數(shù)組2012-09-09
js實現(xiàn)文本框?qū)挾茸赃m應(yīng)文本寬度的方法
這篇文章主要介紹了js實現(xiàn)文本框?qū)挾茸赃m應(yīng)文本寬度的方法,可實現(xiàn)根據(jù)文本框內(nèi)容動態(tài)改變寬度的功能,涉及javascript動態(tài)操作頁面元素屬性的技巧,需要的朋友可以參考下2015-08-08
實現(xiàn)連綴調(diào)用的map方法(prototype)
實現(xiàn)連綴調(diào)用的map方法(prototype),需要學(xué)習(xí)的朋友可以參考下。2009-08-08

