@transformation-dev/dragster
Version:
Port of Ben Smithett's dragster to ES6. Wraps native dragenter/dragleave to behave like mouse event when hovering over child DOM elements.
103 lines (80 loc) • 2.85 kB
Markdown
# `@transformation-dev/dragster`
`@transformation-dev/dragster` is a port of [Ben Smithett's dragster](http://bensmithett.github.io/dragster) to ES6.
It wraps the native dragenter/dragleave to behave like mouse event when hovering over child DOM elements.
## Differences from the original
* Has been converted from CoffeeScript to JavaScript
* Has had its events renamed to 'dragster-enter' and
'dragster-leave'
* Uses ES6 Class
* Keeps track of its instances for later reference so your drop
callback has a way to call `reset()`
* Provides a `destroy()` method that can be used as a callback to
remove said instances. If you use this with Svelte's `use:`
directive, then Svelte will automatically call `destroy()` as
something is removed from the DOM.
## Usage
To install with npm
```bash
npm install --save @transformation-dev/dragster
```
In a .svelte file
```html
<script>
import {Dragster} from '@transformation-dev/dragster'
function addDragster(node) {
return new Dragster(node)
}
let thingBeingDragged
function dragStart(event) {
thingBeingDragged = event.target.id
event.target.style.opacity = .5
}
function drop(event) {
const id = event.target.id
Dragster.reset(event.target) // Very important!
console.log('id of drop zone', id)
console.log('id of thing being dragged', thingBeingDragged)
}
function enter(event) {
event.target.style.background = 'grey'
}
function leave(event) {
event.target.style.background = ''
}
function over(event) {
event.preventDefault() // Very important!
}
function dragEnd(event) {
event.target.style.opacity = ""
}
</script>
<style>
.draggable {
width: 200px;
height: 20px;
text-align: center;
background: blue;
}
.dropzone {
width: 200px;
height: 20px;
text-align: center;
background: purple;
}
</style>
<div use:addDragster id="must-be-unique" class="dropzone" on:drop={drop} on:dragster-enter={enter} on:dragster-leave={leave} on:dragover={over}>
Drop something on me
</div>
<div id='must-also-be-unique' draggable='true' class="draggable" on:dragstart={dragStart} on:dragend={dragEnd}>
Drag me
</div>
```
React's JSX and I suspect Angular, Vue, etc. have a similar syntax to above. In JSX, it's `onDragster-start`. You may also have to
create Dragster instances yourself if your UI tech doesn't have
the equivalent to Svelte's `use:` and you should probably manually
call `destroy()`.
Plain HTML/JavaScript is essentially the same except you'll specify
the event listeners with `addEventListener()` like in the
[MDN web docs example](https://developer.mozilla.org/en-US/docs/Web/API/Document/drag_event) except that you have to instantiate the
Dragster instances yourself and you should probably manually call
`destroy()`.