moveable組件學(xué)習(xí)筆記一: moveable

一. 準(zhǔn)備階段

moveable支持拖拽(drag),更改大小(resize),縮放(scale),旋轉(zhuǎn)(rotate)等功能

1.github文檔地址(https://github.com/daybrush/moveable) 6.2k個(gè)星

2.demo地址

原插件demo https://daybrush.com/moveable/
vue-moveable的demo https://alis.oss.aliyuncs.com/page/moveble/#/

二.文檔

1.初始化一個(gè)moveable

通過(guò)new Moveable(parentElement, options),options都支持先初始化一個(gè)實(shí)例,后續(xù)直接使用.屬性名的方式設(shè)置

import Moveable from "moveable";

this.moveable = new Moveable(
        this.$refs.container, // moveable元素的父元素
        {
          className: 'draggable', // 可交互組件的class名稱
          target: this.$refs.example, // 響應(yīng)moveable操作結(jié)果的元素,如包裹一個(gè)可拖拽圖釘?shù)姆綁K
          origin: false, // moveable元素的中心點(diǎn)是否可見(jiàn),default: true
          edge: true, // resize,scale是否支持通過(guò)邊框操作
          padding: { left: 0, top: 0, right: 0, bottom: 0 }, // target元素周圍增加padding,不會(huì)改變target樣式,只是將moveable選框撐開(kāi), default: null
          passDragArea: false, // default: false, [**沒(méi)有發(fā)現(xiàn)實(shí)際作用**]
          zoom: 1, // moeable組件的元素縮放比例,default: 1,即邊框或者四角和邊框的句柄等
          draggable: true, // 是否支持可拖拽
          dragTarget: this.$refs.drag, // 執(zhí)行moveable操作的元素,如可拖拽的圖釘
          resizable: true, // 是否支持更改大小
          scalable: true, // 是否支持縮放
          rotatable: true, // 是否支持旋轉(zhuǎn)
          warpable: true,  // 是否支持折疊,3d效果,增加Z軸
          throttleDrag: 0,
          throttleResize: 0
        }
      );
this.moveable.scalable = false

moveable實(shí)例為需要執(zhí)行moveable操作的moveable對(duì)象,包括拖拽句柄或者邊框等;
target: 則為響應(yīng)moveable操作結(jié)果的dom元素,即我們真實(shí)想要變更的dom

2.事件

  • click
    this.moveable.on("click", (e) => {

    })

3.方法

  • destroy()
    銷毀moveable實(shí)例,并且移除實(shí)例化moveable所產(chǎn)生的元素和監(jiān)聽(tīng)事件
this.moveable.destroy(); 
// moveable立即執(zhí)行
this.moveable.request("draggable", { deltaX: 10, deltaY: 10 }, true);
const requester = this.moveable.request("draggable");
requester.request({ deltaX: 10, deltaY: 10 });
requester.request({ deltaX: 10, deltaY: 10 });
requester.request({ deltaX: 10, deltaY: 10 });
requester.requestEnd();
  • dragStart(event)
    moveable實(shí)例執(zhí)行拖動(dòng)操作,多用于選中dom元素同時(shí)直接執(zhí)行拖動(dòng)操作
import Moveable from "moveable";
const moveable = new Moveable(document.body);
document.body.addEventListener("mousedown", e => {
      moveable.target = e.target;
      moveable.dragStart(e);
});
  • emit/on/off/once
    事件發(fā)送/監(jiān)聽(tīng)/關(guān)閉/監(jiān)聽(tīng)執(zhí)行一次,一般用作跨組件傳值交互
import EventEmitter from "@scena/event-emitter"; // moveable插件本身依賴于@scena/event-emitter,安裝moveable時(shí)會(huì)同步安裝@scena/event-emitter
const emitter = new EventEmitter();
emitter.on("a", e => {
});
emitter.emit("a", {
  a: 1,
});
emitter.once("a", () => {
});
// 移除emitter實(shí)例的所有監(jiān)聽(tīng)事件
emitter.off();
// 移除a事件的所有監(jiān)聽(tīng)事件
emitter.off("a");
// 移除a事件的名為listener的監(jiān)聽(tīng)事件
emitter.off("a", listener);
  • trigger(eventName, param)
    直接調(diào)用eventName方法,返回方法執(zhí)行是否成功,即使eventName未被監(jiān)聽(tīng),或者關(guān)閉監(jiān)聽(tīng),tigger依舊可以被執(zhí)行,且返回結(jié)果為true
import EventEmitter from "@scena/event-emitter";
const emitter = new EventEmitter();
    emitter.on("a", (e) => {
      console.log(e)
    });
    // emit
    let result1 = emitter.trigger("a", {
      a: 1,
    });
    console.log(result1);
    let result2 = emitter.trigger("a", { a: 3 });
    console.log(result2); // true
    let result3 = emitter.trigger("b", { b: 3 });
    console.log(result3); // true
    emitter.off("a");
    let result4 = emitter.trigger("a", { a: 3 });
    console.log(result4); // true
  • getManager()
    獲取一個(gè)moveable狀態(tài)和屬性的管理器,即moveablemanager類的實(shí)例
const manager = this.moveable.getManager();
  • getRect()
    獲取moveable實(shí)例的target的邊界數(shù)據(jù)
const rectInfo = this.moveable.getRect();
console.log(rectInfo); // {width, height, left, top... }
  • hitTest(el | HitRect)
    el或者HitRect類型的數(shù)據(jù)與moveable.target的碰撞檢測(cè),返回值為number
document.body.addEventListener("mousedown", e => {
   console.log(this.moveable.hitTest(e.target))
});
  • isDragging()
    檢測(cè)moveable是否正處于drag狀態(tài)
console.log(this.moveable.isDragging()); // false
this.moveable.on("dragStart", () => {
  console.log(moveable.isDragging()); // true
});
this.moveable.on("drag", () => {
  console.log(moveable.isDragging()); // true
});
this.moveable.on("dragEnd", () => {
  console.log(moveable.isDragging()); // false
});
  • isInside(clientX, clientY)
    校驗(yàn)傳入點(diǎn)位是否在moveable內(nèi)部
document.body.addEventListener("mousedown", e => {
    if (this.moveable.isInside(e.clientX, e.clientY)) {
         console.log("inside");
    }
});
  • isMoveableElement(target)
    校驗(yàn)傳入的target是否是moveable實(shí)例的target
document.body.addEventListener("click", e => {
    if (!this.moveable.isMoveableElement(e.target)) {
         this.moveable.target = e.target;
    }
});
  • updateRect
    如果所有元素的寬高位置發(fā)生變化(即觸發(fā)瀏覽器重排),調(diào)用此方法更新moveable
window.addEventListener("resize", e => {
    this.moveable.updateRect();
});
  • updateTarget
    如果所有元素的寬高位置發(fā)生變化(即觸發(fā)瀏覽器重排),調(diào)用此方法更新moveable
this.moveable.updateTarget();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容