본문 바로가기
프로그래밍/JavaScript

Bootstrap v5에서 Modal창 드래그하기

by 꾸션 2023. 3. 23.

Bootstrap v5에서 모달창의 헤더를 마우스로 클릭 후 드래그 해서 움직이게 하는 방법에 대해서 포스팅 진행하겠습니다. BS5에서는 jQuery를 다 들어냈으므로, 순수 자바스크립트로 구현하는 방법으로 진행해 보겠습니다.

 

jQuery로 구현하는 방법은 아래의 링크를 참고하시기 바랍니다.

 

Bootstrap 모달창 드래그

Bootstrap 모달창을 드래그가 가능하게 해달라는 요구가 간혹 있습니다. jquery ui를 사용하여 modal-dailog에 draggalbe 이벤트를 걸어주면 됩니다. 아래는 stackoverflow 참고 사이트 주소입니다. 참고 자료: s

ccusean.tistory.com

 

HTML 소스 수정

아래는 BS5의 버튼을 눌러서 모달창을 띄우는 기본 소스입니다.

여기에 모달창을 드래그 하기 위해서 커스텀 속성 "[data-draggable='true']"을 모달의 헤더에 추가합니다.

"<div class="modal-header">"를 "<div class="modal-header" data-draggable="true">"로 변경.

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel"
  aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header" data-draggable="true">
        <h1 class="modal-title fs-5" id="exampleModalLabel">Modal title</h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

 

자바스크립트 추가하기

아래 소스의 간략한 설명은 아래와 같습니다.

  • "mouseDown"이벤트에서 다이얼로그가 드래그 가능하게 플래그를 설정하고, 현재 마우스와 다이얼로그의 위치를 기억합니다.
  • "mouseMove"이벤트에서 위치 변화에 따라서 다이얼로그의 좌표를 변화시킵니다.
  • "mouseUp"이벤트에서 다이얼로그가 드래그 가능 플래그를 false로 변경하여 드래깅이 되지 않도록 합니다.
const modalHeader = document.querySelector("[data-draggable='true']");
const modalDialog = document.querySelector(".modal-dialog");
let isDragging = false;
let mouseOffset = { x: 0, y: 0 };
let dialogOffset = { left: 0, right: 0 };

modalHeader.addEventListener("mousedown", function (event) {
  isDragging = true;
  mouseOffset = { x: event.clientX, y: event.clientY };
  dialogOffset = {
    left: modalDialog.style.left === '' ? 0 : Number(modalDialog.style.left.replace('px', '')),
    right: modalDialog.style.top === '' ? 0 : Number(modalDialog.style.top.replace('px', ''))
  }
});

document.addEventListener("mouseup", function () {
  isDragging = false;
});

document.addEventListener("mousemove", function (event) {
  if (!isDragging) {
    return;
  }
  let newX = event.clientX - mouseOffset.x;
  let newY = event.clientY - mouseOffset.y;

  modalDialog.style.left = `${dialogOffset.left + newX}px`
  modalDialog.style.top = `${dialogOffset.right + newY}px`
});
반응형

댓글