Dank HTML5 gibt es modernen Browser drag und drop-Events, welche natives Drag & Drop ermöglichen. Es ist sogar vorgesehen, dass man das Bild (welches während eines Drag-Vorgangs angezeigt wird) ändern kann. Dazu muss man sich der setDragImage
bedienen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <div id="wrapper" style="width:200px;height:200px;background-color:blue;" ondragstart="handleDragStart(event)"> </div> <script type="text/javascript"> var divWrapper = document.getElementById('wrapper'); divWrapper.setAttribute('draggable', 'true'); // for Chrome divWrapper.style.backgroundColor = 'red'; function handleDragStart(event) { // Drag Image var image = document.createElement('img'); image.src = './images/logo.png'; // Event event.dataTransfer.effectAllowed = 'move'; event.dataTransfer.setData('text/html', this.innerHTML); event.dataTransfer.setDragImage(image, -10, -10); } </script> |
Anstelle eines Bildes (img) ist es auch erlaubt das neue HTML5 canvas
-Element einzusetzen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <div id="wrapper" style="width:200px;height:200px;background-color:blue;" ondragstart="handleDragStart(event)"> </div> <script type="text/javascript"> var divWrapper = document.getElementById('wrapper'); divWrapper.setAttribute('draggable', 'true'); // for Chrome divWrapper.style.backgroundColor = 'red'; function handleDragStart(event) { // Drag Image var canvas = document.createElement('canvas'); canvas.width = canvas.height = 100; var context = canvas.getContext('2d'); context.fillStyle = 'rgb(255, 0, 255)'; context.fillRect(0, 0, canvas.width, canvas.height); // Event event.dataTransfer.effectAllowed = 'move'; event.dataTransfer.setData('text/html', this.innerHTML); event.dataTransfer.setDragImage(canvas, -10, -10); } </script> |
Hinweise:
- Damit ein Objekt die Drag-Eigenschaft aufweist, muss es das Attribut
draggable="true"
erhalten - Damit das
draggable
-Attribut auch im Safari funktionert, muss folgender CSS-Stil gesetzt werden:1 2 3 4 5 6 7
[draggable=true] { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; user-select: none; }
- Für den Mozilla Firefox ist es notwendig, dass es ein
ondragstart
-Event gibt - Es muss zuerst
dataTransfer.setData
aufgerufen werden, damitdataTransfer.setDragImage
funktioniert dataTransfer.setData
kann im Firefox nur in einemondragstart
-Event benutzt werdendataTransfer.setDragImage
erwartet ein Bild und eine Position (x,y). Die Position gibt ausgehend vom Mauszeiger an, an welcher Stelle das Drag Image angezeigt wird- Der Google Chrome erlaubt kein
canvas
-Element als Bild insetDragImage
. Deshalb muss vorher dascanvas
-Objekt mittoDataURL
in eine BASE64-kodierte Zeichenkette umgewandelt werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <div id="wrapper" style="width:200px;height:200px;background-color:blue;" ondragstart="handleDragStart(event)"> </div> <script type="text/javascript"> var divWrapper = document.getElementById('wrapper'); divWrapper.setAttribute('draggable', 'true'); // for Chrome divWrapper.style.backgroundColor = 'red'; function handleDragStart(event) { // Drag Image var image = new Image(); image.src = 'data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw=='; var canvas = document.createElement('canvas'); canvas.width = image.width; canvas.height = image.height; var context = canvas.getContext('2d'); context.drawImage(image, 0, 0); var canvasImage = new Image(); canvasImage.src = canvas.toDataURL('image/png'); // Event event.dataTransfer.effectAllowed = 'move'; event.dataTransfer.setData('text/html', this.innerHTML); event.dataTransfer.setDragImage(canvasImage, -10, -10); } </script> |