, ,, , ,, , , , image/svg+xml , image/svg+xml , interact.js , image/svg+xml , ,, , ,
NAV

The reflow method lets you trigger an action start -> move -> end sequence which runs modifiers and does drop calculations, etc. If your interactable target is a CSS selector, an interaction will be run for each matching element.

const resizableContainer = interact('#container')
const draggable = interact('.draggable')

draggable.on('tap', function (event) {
  // start a drag action to apply modifiers
  draggable.reflow({ name: 'drag', axis: 'xy' })
})

// the usual interact actions setup
resizableContainer.resizable({
  edges: { bottom: true, right: true },
  modifiers: [
    interact.modifiers.restrictEdges({
      outer: 'html',
    }),
    interact.modifiers.restrictEdges({
      min: { width: 200, height: 200 }
    })
  ],
  listeners: {
    move: function (event) {
      let { x, y } = event.target.dataset

      x = (parseFloat(x) || 0) + event.deltaRect.left
      y = (parseFloat(y) || 0) + event.deltaRect.top

      Object.assign(event.target.style, {
        width: `${event.rect.width}px`,
        height: `${event.rect.height}px`,
        transform: `translate(${x}px, ${y}px)`
      })

      Object.assign(event.target.dataset, { x, y })
    }
  }
})

draggable.draggable({
  inertia: true,
  modifiers: [
    interact.modifiers.restrictRect({
      restriction: document.querySelector('#container'),
      endOnly: true,
    })
  ],
  listeners: {
    move (event) {
      const x = (parseFloat(event.target.dataset.x) || 0) + event.dx
      const y = (parseFloat(event.target.dataset.y) || 0) + event.dy

      event.target.style.transform =
        `translate(${x}px, ${y}px)`
      Object.assign(event.target.dataset, { x, y })
    },
  }
})

If the elements have inertia, endOnly modifiers and smoothEndDuration, then the interactions may not end immediately. The reflow method returns a Promise which is resolved when all interactions are complete. So you can await or .then() multiple reflows

const interactable = interact(target).draggable({}).resizable({})

async function onWindowResize () {
  // start a resize action and wait for inertia to finish
  await interactable.reflow({ name: drag, axis: 'x' })

  // start a drag action
  await interactable.reflow({
    name: 'resize',
    edges: { left: true, bottom: true },
  })
}

window.addEventListener(onWindowResize, 'resize')