B
blankito1998
Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
ahora no sube ni bajaParece que el problema de que el div desaparezca puede estar relacionado con cómo estamos calculando la posición en el evento de arrastre. Es posible que se esté posicionando fuera del área visible de la ventana.
Vamos a asegurarnos de que al calcular la nueva posición del div, no se desplace fuera de los límites visibles del área de visualización. Aquí está el código actualizado para evitar que el div desaparezca al arrastrar:
### Código Corregido para Evitar que el Div Desaparezca
HTML:<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Divs Arrastrables Sincronizados</title> <style> body { margin: 0; height: 100vh; /* Altura completa de la ventana */ overflow: hidden; /* Evitar scroll */ position: relative; /* Para posicionar los divs hijos */ } .metagets { width: 300px; /* Ancho del div */ height: 200px; /* Alto del div */ background-color: blue; /* Color del div */ position: absolute; /* Necesario para permitir el movimiento */ display: flex; flex-direction: column; justify-content: flex-start; /* Asegura el contenido en la parte superior */ bottom: 0; /* Inicialmente en la parte inferior */ } .content { position: relative; /* Para asegurar que el contenido esté en su lugar */ width: 100%; height: 100%; z-index: 1; /* Para que el contenido esté encima */ } .drag-handle { background: gold; /* Color del área de agarre */ padding: 10px; /* Espaciado del área de agarre */ width: 100%; /* Ancho completo */ text-align: center; /* Centrar el texto */ cursor: move; /* Cursor de mover */ z-index: 2; /* Por encima del contenido */ } </style> </head> <body> <button id="addDiv">Agregar Div</button> <script> document.addEventListener("DOMContentLoaded", () => { let isDragging = false; let currentDiv = null; // Referencia al div actual arrastrable let offsetY = 0; // El desplazamiento vertical desde el área de agarre const startDrag = (e) => { isDragging = true; currentDiv = e.target.closest('.metagets'); // Asigna el div padre offsetY = e.touches ? e.touches[0].clientY - currentDiv.getBoundingClientRect().top : e.clientY - currentDiv.getBoundingClientRect().top; // Calcular el desplazamiento }; const drag = (e) => { if (isDragging && currentDiv) { const y = e.touches ? e.touches[0].clientY : e.clientY; // Calcula la nueva posición en la parte inferior const newBottom = window.innerHeight - (y - offsetY); // Asegúrate que el div no se mueva fuera de la ventana if (newBottom >= 0 && newBottom <= window.innerHeight - currentDiv.offsetHeight) { currentDiv.style.bottom = newBottom + 'px'; // Mueve el div solo si está dentro de los límites } } }; const endDrag = () => { isDragging = false; // Detener el arrastre currentDiv = null; // Resetea la referencia }; // Eventos de Delegación para el área de agarre document.addEventListener('mousedown', (e) => { if (e.target.classList.contains('drag-handle')) { startDrag(e); // Iniciar arrastre } }); document.addEventListener('mousemove', drag); document.addEventListener('mouseup', endDrag); // Eventos para touch document.addEventListener('touchstart', (e) => { if (e.target.classList.contains('drag-handle')) { startDrag(e); // Iniciar arrastre } }); document.addEventListener('touchmove', drag); document.addEventListener('touchend', endDrag); // Agregar nuevo div document.getElementById('addDiv').addEventListener('click', () => { const newDiv = document.createElement('div'); newDiv.className = 'metagets'; newDiv.innerHTML = ` <div style="z-index:1; float:left; background:red; position:absolute; justify-content:center; justify-items:center; bottom:50px; width:100%; display:flex;"> <span class="drag-handle">Arrastra desde aquí</span> </div> <iframe class="content" src="https://www.example.com" frameborder="0"></iframe> `; // Contenido dentro del div document.body.appendChild(newDiv); // Agregar nuevo div al DOM }); }); </script> </body> </html>
### Explicación de la Solución
1. Condición de Movimiento Segura: En el eventodrag, se ha añadido una condición para asegurarnos de que el nuevo valor debottomse mantenga dentro del límite de la ventana y no se desplace fuera de ella. Esto evita que el div "desaparezca" al arrastrarlo.
2. Fijación de Límites: Se verifica que elnewBottomesté entre 0 y la altura de la ventana menos la altura del div (esto asegura que siempre esté visible).
### Conclusión
Con este ajuste, el div debería arrastrarse sin desaparecer de la vista. Prueba el código y hazme saber si necesitas más ayuda o si algo no está funcionando como esperabas. ¡Estoy aquí para ayudar!

