Cómo hacer modal arrastrable en Bootstrap 5

Cómo hacer modal arrastrable en Bootstrap 5

Para hacer un modal arrastrable (draggable) en Bootstrap 5, puedes usar JavaScript puro y la API de eventos de arrastre (mousedown, mousemove, mouseup). Bootstrap 5 no proporciona esta funcionalidad de forma nativa, pero puedes implementarla fácilmente.

Pasos para hacer un modal arrastrable:

  1. Capturar el evento mousedown en el encabezado del modal.
  2. Seguir el movimiento del mouse con mousemove y actualizar la posición.
  3. Liberar el arrastre con mouseup.

Código Completo:

💣 Descarga sistemas PHP y Laravel COMPLETOS GRATIS
Recursos premium listos para usar en proyectos reales 💻
👥 +1000 desarrolladores · 🔥 Publicaciones diarias
🔥 Unirme al canal GRATIS ahora 👥 Grupo de Facebook
⏳ Enlaces disponibles por tiempo limitado
💻 Sistemas completos 🔌 Plugins PRO ⚡ Scripts listos 🔥 Recursos exclusivos

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Modal Arrastrable - Bootstrap 5</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
        /* Evita la selección de texto al arrastrar */
        .modal-header {
            cursor: grab;
            user-select: none;
        }
    </style>
</head>
<body>


<!-- Botón para abrir el modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#miModal">
    Abrir Modal
</button>


<!-- Modal -->
<div class="modal fade" id="miModal" tabindex="-1" aria-labelledby="modalTitulo" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header bg-primary text-white">
                <h5 class="modal-title" id="modalTitulo">Modal Arrastrable</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Cerrar"></button>
            </div>
            <div class="modal-body">
                Arrastra el encabezado del modal para moverlo.
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
            </div>
        </div>
    </div>
</div>


<script>
document.addEventListener("DOMContentLoaded", function () {
    const modal = document.querySelector(".modal-dialog"); // Elemento a mover
    const header = document.querySelector(".modal-header"); // Zona de agarre


    let isDragging = false;
    let startX, startY, initialX, initialY;


    header.addEventListener("mousedown", (e) => {
        isDragging = true;
        startX = e.clientX;
        startY = e.clientY;
        const rect = modal.getBoundingClientRect();
        initialX = rect.left;
        initialY = rect.top;
        modal.style.position = "absolute"; // Hace que el modal sea movible
    });


    document.addEventListener("mousemove", (e) => {
        if (!isDragging) return;
        const dx = e.clientX - startX;
        const dy = e.clientY - startY;
        modal.style.left = `${initialX + dx}px`;
        modal.style.top = `${initialY + dy}px`;
    });


    document.addEventListener("mouseup", () => {
        isDragging = false;
    });
});
</script>


<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

Explicación:

  1. El usuario arrastra el encabezado (.modal-header) y activa mousedown.
  2. Se mueve el modal con mousemove, ajustando su posición left y top.
  3. Se suelta el mouse (mouseup) y detiene el movimiento.

Características:

✅ Compatible con Bootstrap 5
✅ No afecta la funcionalidad del modal
✅ Evita selección de texto mientras arrastras
✅ Se puede cerrar con los botones de Bootstrap

Arrastrar modal usando bootstrap 5
Arrastrar modal usando bootstrap 5

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 0 / 5. Recuento de votos: 0

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.