I need to set the icon for cursor when a user is dragging DIV (red div in the following example).
I have tried several attempt, including using CSS cursor:move
and event.dataTransfer.dropEffect
with no success, as the icon always show up a "crossed circle".
Any ideas how to solve this issue using HTML5 drag-and-drop API?
http://jsbin.com/hifidunuqa/1/
<script>
window.app = {
config: {
canDrag: false,
cursorOffsetX: null,
cursorOffsetY: null
},
reset: function () {
this.config.cursorOffsetX = null;
this.config.cursorOffsetY = null;
},
start: function () {
document.getElementById('target').addEventListener('dragstart', function (event) {
console.log('+++++++++++++ dragstart')
this.config.cursorOffsetX = event.offsetX;
this.config.cursorOffsetY = event.offsetY;
this.adjustPostion(event);
event.dataTransfer.effectAllowed = 'move';
event.dataTransfer.dropEffect = 'move';
}.bind(this));
document.getElementById('target').addEventListener('drag', function (event) {
console.log('+++++++++++++ drag')
this.adjustPostion(event);
}.bind(this));
document.getElementById('target').addEventListener('dragend', function (event) {
console.log('+++++++++++++ dragend')
this.reset();
}.bind(this));;
},
adjustPostion: function (event) {
if (event.pageX <= 0 || event.pageY <= 0) {
console.log('skipped');
return;
}
var elm = document.getElementById('target');
elm.style.left = (event.pageX - this.config.cursorOffsetX) + 'px';
elm.style.top = (event.pageY - this.config.cursorOffsetY) + 'px';
console.log(event.pageX);
console.log(event.pageY);
}
};
</script>
Complete HTML/CSS Course 2022 Now HTML 5 came up with a Drag and Drop (DnD) API that brings native DnD support to the browser making it much easier to code up. HTML 5 DnD is supported by all the major browsers like Chrome, Firefox 3.5 and Safari 4 etc.
Answer: Use the CSS cursor property You can define a custom cursor using the CSS cursor property. The cursor property takes the comma-separated list of user-defined cursors value followed by the generic cursor. First of all create cursor image and save it with the extension .
HTML drag-and-drop uses the DOM event model and drag events inherited from mouse events . A typical drag operation begins when a user selects a draggable element, drags the element to a droppable element, and then releases the dragged element.
use mousedown and mousemove
window.app = { dragging: false, config: { canDrag: false, cursorOffsetX: null, cursorOffsetY: null }, reset: function () { this.config.cursorOffsetX = null; this.config.cursorOffsetY = null; }, start: function () { document.getElementById('target').addEventListener('mousedown', function (event) { console.log('+++++++++++++ dragstart'); this.dragging = true; this.config.cursorOffsetX = event.offsetX; this.config.cursorOffsetY = event.offsetY; this.adjustPostion(event); }.bind(this)); document.getElementById('target').addEventListener('mousemove', function (event) { if (this.dragging) { console.log('+++++++++++++ drag'); event.target.style.cursor = 'move'; this.adjustPostion(event); } }.bind(this)); document.getElementById('target').addEventListener('mouseup', function (event) { console.log('+++++++++++++ dragend'); this.dragging = false; event.target.style.cursor = 'pointer'; this.reset(); }.bind(this)); }, adjustPostion: function (event) { if (event.clientX <= 0 || event.clientY <= 0) { console.log('skipped'); return; } var elm = document.getElementById('target'); elm.style.left = (event.clientX - this.config.cursorOffsetX) + 'px'; elm.style.top = (event.clientY - this.config.cursorOffsetY) + 'px'; console.log(event.pageX); console.log(event.pageY); } };
#target { position: absolute; top: 100px; left: 100px; width: 400px; height: 400px; background-color: red; -moz-user-select: none; -ms-user-select: none; -webkit-user-select: none; user-select: none; } #ui1 { position: absolute; top: 50px; left: 50px; width: 100px; height: 400px; background-color: blue; z-index: 100; } #ui2 { position: absolute; top: 50px; left: 550px; width: 100px; height: 400px; background-color: green; z-index: 100; }
<!-- simulate --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> </head> <body onload="window.app.start();"> <div id="ui1"></div> <div id="ui2"></div> <div id="target"></div> </body> </html>
Do you actually need the Drag
API? I found that I was using the Drag
API because I was having trouble with the reliability of mouse events (mouseups
not being captured, for example).
The Drag
API is only for drag-and-drop functionality, and, if you're simply fiddling with the reliability of your clicking and pointing events, a new API, .setPointerCapture
is made to handle these cases more effectively. Here's the minimal viable way to achieve this:
el.onpointerdown = ev => {
el.onpointermove = pointerMove
el.setPointerCapture(ev.pointerId)
}
pointerMove = ev => {
console.log('Dragged!')
}
el.onpointerUp = ev => {
el.onpointermove = null
el.releasePointerCapture(ev.pointerId)
}
Beautifully, you will maintain full control over your cursor's display style.
I didn't care about a particular cursor, I just wanted to get rid of the "crossed circle" one. My solution was to include dragover event (with following function) to all elements, that already had dragenter, dragstart and dragend events.
function dragover(event)
{
event.dataTransfer.dropEffect = "move";
event.preventDefault();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With