[HTML]ドラッグ&ドロップAPI

6080 ワード

ドラッグアンドドロップAPIでは、ユーザーがWebページの要素を自由にドラッグできます.Webページのすべての要素は、ドラッグ可能なプロパティを使用してドラッグするオブジェクト(ドラッグ可能なオブジェクト)に変換できます.
ドラッグ&ドロップイベント
99 mdragstart:ユーザーがオブジェクトのドラッグを開始したときに発生します.
89 dragenter:マウスがターゲットオブジェクトに最初に入ったときに発生します.
ドラッグアンドドロップ:ターゲットオブジェクトの上にマウスを置くと発生します.
ドラッグアンドドロップ:ターゲットオブジェクトをドラッグしながらマウスを移動するときに発生します.
ドラッグアンドドロップ:オブジェクトは、ドラッグアンドドロップの終了時にドラッグしたオブジェクトの位置にあります.
𕷌dragleaft:マウスがターゲットオブジェクトの上を離れると発生します.
89 dragend:ターゲットオブジェクトをドラッグしたときにマウスボタンを放したときに発生します.
イベントの利用
ドラッグしてドラッグの開始位置と終了位置の項目を変更してみます
HTML
<ul class="draggable-list" id="draggable-list"></ul>
CSS
.draggable-list li.over .draggable {
  background-color: #eaeaea;
}
JavaScript
JavaScriptでlistを動的に作成します.
const draggable_list = document.getElementById("draggable-list");

const richestPeople = [
  "Jeff Bezos",
  "Bill Gates",
  "Warren Buffett",
  "Bernard Arnault",
  "Carlos Slim Helu",
  "Amancio Ortega",
  "Larry Ellision",
  "Mark Zuckerberg",
  "Michael Bloomberg",
  "Larry Page",
];

// Store list items
const listItems = [];

createList();

function createList() {
  [...richestPeople]
    .map((a) => ({ value: a, sort: Math.random() }))
    .sort((a, b) => a.sort - b.sort)
    .map((a) => a.value)
    .forEach((person, index) => {
      const listItem = document.createElement("li");
      listItem.setAttribute("data-index", index);
      listItem.innerHTML = `
         <span class="number">${index + 1}</span> 
         <div class="draggable" draggable="true">
          <p class="person-name">${person}</p>
          <i class="fas fa-grip-lines"></i>
         </div>       `;

      listItems.push(listItem);
      draggable_list.appendChild(listItem);
    });

  addEventListeners();
}

function dragStart() {
  dragStartIndex = this.dataset.index;
}

function dragEnter() {
  this.classList.add("over");
}

function dragLeave() {
  this.classList.remove("over");
}
function dragOver(e) {
  e.preventDefault();
}
function dragDrop() {
  this.classList.remove("over");
  const dragEndIndex = this.dataset.index;

  swapItems(dragStartIndex, dragEndIndex);
}

function swapItems(fromIndex, toIndex) {
  const itemOne = listItems[fromIndex].querySelector(".draggable");
  const itemTwo = listItems[toIndex].querySelector(".draggable");

  listItems[fromIndex].appendChild(itemTwo);
  listItems[toIndex].appendChild(itemOne);
}


function addEventListeners() {
  const dragListItems = draggable_list.querySelectorAll("li");

  dragListItems.forEach((item) => {
    item.addEventListener("dragstart", dragStart);
    item.addEventListener("dragover", dragOver);
    item.addEventListener("drop", dragDrop);
    item.addEventListener("dragenter", dragEnter);
    item.addEventListener("dragleave", dragLeave);
  });
}
swapItems関数では、ドラッグを開始および終了する項目のインデックスと、終了したインデックスをパラメータとするswapItems関数のドラッグ内容を直接変更できます.
dragoverイベントはミリ秒ごとに発生するため、dragoverイベントを実行できるようにイベント機能がブロックされます.