Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change the cursor icon when dragging in HTML5?

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>
like image 927
GibboK Avatar asked May 05 '15 11:05

GibboK


People also ask

Does html5 support drag and drop?

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.

How do I change my custom cursor on my website?

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 .

How does html5 implement drag and drop?

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.


3 Answers

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>
like image 161
Ihsan Avatar answered Sep 20 '22 00:09

Ihsan


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.

like image 29
nikk wong Avatar answered Sep 18 '22 00:09

nikk wong


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();
}
like image 31
mikiqex Avatar answered Sep 18 '22 00:09

mikiqex