Claro, puedo ajustar el código para usar el HTML que proporcionaste para el área de agarre. También lo integraré con la funcionalidad de arrastre existente. Aquí tienes el código completo con tu especificación para el área de agarre.
### Código Ajustado con tu Área de Agarre
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 con Iframes</title>
<style>
body {
margin: 0;
height: 100vh; /* Altura completa de la ventana */
overflow: hidden; /* Evitar scroll */
position: relative; /* Para posicionar los divs hijos */
}
.miDiv {
width: 300px; /* Ajusta el ancho según sea necesario */
height: 200px;
background-color: blue;
position: absolute; /* Necesario para moverlos */
cursor: move; /* Cambia el cursor al arrastrar */
bottom: 0; /* Comienza en la parte inferior de la ventana */
display: flex;
flex-direction: column;
}
.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;
padding: 10px; /* Espaciado para el área de agarre */
width: 100%; /* Ancho completo */
text-align: center; /* Centrar el texto */
cursor: move; /* Cursor de mover */
z-index: 2; /* Asegúrate que esté por encima del contenido */
}
</style>
</head>
<body>
<button id="addDiv">Agregar Div</button>
<script>
document.addEventListener("DOMContentLoaded", () => {
let isDragging = false;
let startY;
let movedDistance = 0; // Distancia movida
let currentDiv = null; // Referencia al div actual arrastrable
const divHeight = 200; // Altura del div en píxeles
const alertThreshold = divHeight * 0.5; // 50% de la altura del div
const startDrag = (e) => {
isDragging = true;
startY = e.touches ? e.touches[0].clientY : e.clientY; // Almacena la posición inicial
};
const drag = (e) => {
if (isDragging && currentDiv) {
const y = e.touches ? e.touches[0].clientY : e.clientY; // Posición actual
const distance = startY - y; // Distancia movida hacia arriba
const currentBottom = parseInt(window.getComputedStyle(currentDiv).bottom);
movedDistance = Math.max(0, currentBottom + distance); // Mueve el div hacia arriba
currentDiv.style.bottom = movedDistance + 'px'; // Mueve el div
startY = y; // Actualiza la posición inicial
}
};
const endDrag = () => {
isDragging = false; // Detener el arrastre
// Verifica si se alcanzó el 50% de la altura al soltar
if (movedDistance >= alertThreshold) {
alert("¡Has subido el div un 50%!");
}
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')) {
currentDiv = e.target.closest('.miDiv'); // Asigna el div padre
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')) {
currentDiv = e.target.closest('.miDiv'); // Asigna el div padre
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 = 'miDiv';
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 Implementación
1.
Área de Agarre: El área de agarre que mencionaste se ha integrado y se muestra en la parte superior del div. Si haces clic y arrastras desde aquí, podrás mover el div completo.
2.
Interacciones: El arrastre se inicia cuando se hace clic en el área de agarre (span con la clase
.drag-handle).
3.
Flexibilidad y Diseño: He configurado las propiedades de Display y Z-Index para asegurar que el diseño sea compatible con otros elementos que puedan estar en el DOM.
### Conclusión
Este código ahora debería permitirte arrastrar los divs utilizando el área de agarre definida. Si necesitas más cambios o tienes alguna otra solicitud, ¡estaré encantado de ayudarte!
document.addEventListener("DOMContentLoaded", () => {
let isDragging = false;
let startY;
let movedDistance = 0; // Distancia movida
let currentDiv = null; // Referencia al div actual arrastrable
const divHeight = 200; // Altura del div en píxeles
const alertThreshold = divHeight * 0.5; // 50% de la altura del div
const startDrag = (e) => {
isDragging = true;
startY = e.touches ? e.touches[0].clientY : e.clientY; // Almacena la posición inicial
};
const drag = (e) => {
if (isDragging && currentDiv) {
const y = e.touches ? e.touches[0].clientY : e.clientY; // Posición actual
const distance = startY - y; // Distancia movida hacia arriba
const currentBottom = parseInt(window.getComputedStyle(currentDiv).bottom);
movedDistance = Math.max(0, currentBottom + distance); // Mueve el div hacia arriba
currentDiv.style.bottom = movedDistance + 'px'; // Mueve el div
startY = y; // Actualiza la posición inicial
}
};
const endDrag = () => {
isDragging = false; // Detener el arrastre
// Verifica si se alcanzó el 50% de la altura al soltar
if (movedDistance >= alertThreshold) {
alert("¡Has subido el div un 50%!");
}
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')) {
currentDiv = e.target.closest('.metagets'); // Asigna el div padre
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')) {
currentDiv = e.target.closest('.metagets'); // Asigna el div padre
startDrag(e); // Iniciar arrastre
}
});
document.addEventListener('touchmove', drag);
document.addEventListener('touchend', endDrag);
});
puedes hacer que se mueva un poco mas rapido?