react over imagen ejemplo color javascript jquery hover draggable

javascript - imagen - Cómo iniciar el evento mouseover mientras se arrastra.



onmouseover javascript ejemplo (6)

Aquí hay un ejemplo usando la solución de coordenadas XY.

Ejemplo de trabajo en jsfiddle

El ejemplo puede mejorarse, pero es un buen punto de partida.

Simplemente realiza un seguimiento de la ubicación del mouse y comprueba si parece estar dentro de los cuadros delimitadores de los objetos sueltos. Por lo tanto, si el evento mouseup se dispara en cualquiera de ellos, el objeto arrastrado se elimina.

También puede usar las coordenadas del objeto que está arrastrando para detectar si está en un cuadro desplegable, pero requiere un poco más de código para encontrar las coords del cuadro delimitador y usar el mouse es suficiente para mí.

El código usa jQuery pero no jQueryUI. Probé en Chrome, Firefox y Opera, pero no en IE :)

También estoy agregando el código aquí si no se puede acceder a jsfiddle.

HTML

<p>Drag orange boxes to grey ones</p> <div class="droppable"></div> <div class="droppable"></div> <div class="droppable"></div> <div class="droppable"></div> <div class="draggable"></div> <div class="draggable"></div> <div class="draggable"></div>

CSS

.droppable { width:50px; height:50px; float: left; background-color: #DDD; margin: 5px; } .draggable { width:40px; height:40px; float: right; background-color: #FC0; margin: 5px; cursor: pointer; } .dropped { background-color: #FC0; } .somethingover { background-color: #FCD; }

JS

var dragged, mousex, mousey, coordinates = []; var continueDragging = function(e) { // Change the location of the draggable object dragged.css({ "left": e.pageX - (dragged.width() / 2), "top": e.pageY - (dragged.height() / 2) }); // Check if we hit any boxes for (var i in coordinates) { if (mousex >= coordinates[i].left && mousex <= coordinates[i].right) { if (mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) { // Yes, the mouse is on a droppable area // Lets change the background color coordinates[i].dom.addClass("somethingover"); } } else { // Nope, we did not hit any objects yet coordinates[i].dom.removeClass("somethingover"); } } // Keep the last positions of the mouse coord.s mousex = e.pageX; mousey = e.pageY; } var endDragging = function(e) { // Remove document event listeners $(document).unbind("mousemove", continueDragging); $(document).unbind("mouseup", endDragging); // Check if we hit any boxes for (var i in coordinates) { if (mousex >= coordinates[i].left && mousex <= coordinates[i].right) { if (mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) { // Yes, the mouse is on a droppable area droptarget = coordinates[i].dom; droptarget.removeClass("somethingover").addClass("dropped"); dragged.hide("fast", function() { $(this).remove(); }); } } } // Reset variables mousex = 0; mousey = 0; dragged = null; coordinates = []; } var startDragging = function(e) { // Find coordinates of the droppable bounding boxes $(".droppable").each(function() { var lefttop = $(this).offset(); // and save them in a container for later access coordinates.push({ dom: $(this), left: lefttop.left, top: lefttop.top, right: lefttop.left + $(this).width(), bottom: lefttop.top + $(this).height() }); }); // When the mouse down event is received if (e.type == "mousedown") { dragged = $(this); // Change the position of the draggable dragged.css({ "left": e.pageX - (dragged.width() / 2), "top": e.pageY - (dragged.height() / 2), "position": "absolute" }); // Bind the events for dragging and stopping $(document).bind("mousemove", continueDragging); $(document).bind("mouseup", endDragging); } } // Start the dragging $(".draggable").bind("mousedown", startDragging);

Cuando arrastro un elemento sobre otro div en el que tengo un evento de mouseover, el evento no se dispara. Sin embargo, funciona si me desplazo sin arrastrar.

¿Hay una manera de detectar eventos de desplazamiento en un elemento si arrastro otro sobre él?


En todas las respuestas presentadas, no veo la más simple y obvia (tal vez me esté perdiendo algo en la pregunta OP). Pero, si alguien se encuentra con esto más tarde, y necesita una solución rápida y simple en JS puro ...

Lo hace cambiando el elemento className ondragover , y cambiando de nuevo a la clase original ondragleave

my_element.ondragover = function(ev) { ev.preventDefault(); this.className = ''myElem_dragover''; } my_element.ondragleave = function(ev) { ev.preventDefault(); this.className = ''myElem_orig''; }

CSS

.myElem_orig { //this is your initial class for element top: 30px; left: 20px; ..... background-color: blue; } .myElem_orig:hover { //this is hover state, just changing bg color background-color: red; } .myElem_dragover { //new class, needs all attributes from original class top: 30px; left: 20px; ........ background-color: red; //behaves the same like hover does }

editar:
se olvidó de mencionar, también es necesario traer de vuelta a la clase original, de lo contrario div se quedará en la clase de dragón


Encontré un pequeño error en el ejemplo jsfiddle. Cuando abandona el área de colocación verticalmente, el área de colocación todavía tiene la clase "algo transitado".

http://jsfiddle.net/MAazv

Reemplazar este

if (mousex >= coordinates[i].left && mousex <= coordinates[i].right) { if (mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) { // Yes, the mouse is on a droppable area // Lets change the background color coordinates[i].dom.addClass("somethingover"); } } else { // Nope, we did not hit any objects yet coordinates[i].dom.removeClass("somethingover"); }

http://jsfiddle.net/MAazv/122

con este:

if (mousex >= coordinates[i].left && mousex <= coordinates[i].right && mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) { // Yes, the mouse is on a droppable area // Lets change the background color coordinates[i].dom.addClass("somethingover"); } else { // Nope, we did not hit any objects yet coordinates[i].dom.removeClass("somethingover"); }


Hay dos formas básicas de hacerlo:

  1. mousemove y reaccionar a las coordenadas x / y
  2. tener un objetivo transparente que tenga un z-index más alto que el contenedor de arrastre

La primera opción realmente no usa el evento mouseover en absoluto, pero le dará el mismo resultado neto.

Tenga en cuenta que algunos navegadores (es decir,) no activan el mouseover en los elementos transparentes, por lo que tiene que falsificarlo configurando una imagen de fondo que sea transparente o configurando una imagen aleatoria como fondo y posicionándola fuera del elemento de esta manera:

element { background: url(/path/to/img) no-repeat -10000px 0; }


Modificando un poco el código publicado por emrahgunduz, específicamente el bucle for, también puede administrar el área encajable anidada.

var dragged, mousex, mousey, coordinates = []; var continueDragging = function(e) { // Change the location of the draggable object dragged.css({ "left": e.pageX - (dragged.width() / 2), "top": e.pageY - (dragged.height() / 2) }); // Check if we hit any boxes for (var i = coordinates.length - 1; i >= 0; i--) { if (mousex >= coordinates[i].left && mousex <= coordinates[i].right) { if (mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) { // Yes, the mouse is on a droppable area // Lets change the background color $(''.droppable'').removeClass("somethingover"); coordinates[i].dom.addClass("somethingover"); break; } } else { // Nope, we did not hit any objects yet coordinates[i].dom.removeClass("somethingover"); } } // Keep the last positions of the mouse coord.s mousex = e.pageX; mousey = e.pageY; }; var endDragging = function(e) { // Remove document event listeners $(document).unbind("mousemove", continueDragging); $(document).unbind("mouseup", endDragging); // Check if we hit any boxes for (var i = coordinates.length - 1; i >= 0; i--) { if (mousex >= coordinates[i].left && mousex <= coordinates[i].right) { if (mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) { // Yes, the mouse is on a droppable area droptarget = coordinates[i].dom; droptarget.removeClass("somethingover").addClass("dropped"); dragged.hide("fast", function() { $(this).remove(); }); } } } // Reset variables mousex = 0; mousey = 0; dragged = null; coordinates = []; }; var startDragging = function(e) { // Find coordinates of the droppable bounding boxes $(".droppable").each(function() { var lefttop = $(this).offset(); // and save them in a container for later access coordinates.push({ dom: $(this), left: lefttop.left, top: lefttop.top, right: lefttop.left + $(this).width(), bottom: lefttop.top + $(this).height() }); }; // When the mouse down event is received if (e.type == "mousedown") { dragged = $(this); // Change the position of the draggable dragged.css({ "left": e.pageX - (dragged.width() / 2), "top": e.pageY - (dragged.height() / 2), "position": "absolute" }); // Bind the events for dragging and stopping $(document).bind("mousemove", continueDragging); $(document).bind("mouseup", endDragging); } // Start the dragging $(".draggable").bind("mousedown", startDragging);


jQuery-ui tiene un plugin droppable para esto.

El complemento, cuando se usa con un elemento que se puede arrastrar , desencadenará eventos de dropover , que pueden vincularse a cualquier acción que requiera.

Ver la respuesta de Mottie a esta pregunta (demo incluida)