一步教你使用原生JS快速實現目標實例效果與解析

原生JS快速實現目標實例效果與解析

放是很常見的一種相互作用效果,很多時候我們都會補充第三方的控件來實現,其實用原生js實現起來也非常的方便。然後我們就用原生js和css快速實現這樣的效果:
在這裏插入圖片描述

HTML的內容很簡單,就是五個空的容器和一個可以被拖拽的元素:

HTML


<body>
  <div class="droppable">
    <div class="draggable" draggable="true"></div>
  </div>
  <div class="droppable"></div>
  <div class="droppable"></div>
  <div class="droppable"></div>
  <div class="droppable"></div>
</body>

注意點:1. 容器的的class爲droppable,用於接收被拖拽的元素,可被拖拽的元素class爲draggable,同時設置draggable屬性爲true,表示該元素可以被拖拽。
2.大小 情況下,只有圖片,鏈接和被選中的文字能被拖拽,其他元素需要設置draggable爲true才能被拖拽。所以爲了凸顯draggable的用法,這裏使用
< div>而不是< image>來作爲被拖拽的元素。

CSS

在實現樣式的時候,除了實現靜態的樣式,一些過渡狀態也需要增加樣式以提升視覺體驗:

  1. 元素被預先的過程中增加框架等效果;
  2. 當元素被預期到容器上方時,容器也應增加樣式表明容器可以接收一個被拖拽的元素。

body {
  background-color: darksalmon;
}

.draggable {
  background-image: url('http://source.unsplash.com/random/150x150');
  position: relative;
  height: 150px;
  width: 150px;
  top: 5px;
  left: 5px;
  cursor: pointer;
}

.droppable {
  display: inline-block;
  height: 160px;
  width: 160px;
  margin: 10px;
  border: 3px salmon solid;
  background-color: white;
}

.dragging {
  border: 4px yellow solid;
}

.drag-over {
  background-color: #f4f4f4;
  border-style: dashed;
}

.invisible {
  display: none;
}

注意點:1. 圖片過濾https://source.unsplash.com/的隨機圖片;
2. .dragging爲draggable元素正在被預期的狀態,增加黃色邊框;
3. .drag-over爲draggable元素被預先到達容器上方時容器的狀態,增加灰色虛線邊框。

JS

最後,我們需要通過js監聽draggable和droppable的相關的事件。


// 查詢draggable和droppable
const draggable = document.querySelector('.draggable');
const droppables = document.querySelectorAll('.droppable');

// 監聽draggable的相關事件
draggable.addEventListener('dragstart', dragStart);
draggable.addEventListener('dragend', dragEnd);

function dragStart() {
  this.className += ' dragging';
  setTimeout(() => {
    this.className = 'invisible';
  }, 0);
}

function dragEnd() {
  this.className = 'draggable';
}

// 監聽droppable的相關事件
for (const droppable of droppables) {
  droppable.addEventListener('dragover', dragOver);
  droppable.addEventListener('dragleave', dragLeave);
  droppable.addEventListener('dragenter', dragEnter);
  droppable.addEventListener('drop', dragDrop);
}

function dragOver(e) {
  e.preventDefault();
}

function dragEnter(e) {
  e.preventDefault();
  this.className += ' drag-over';
}

function dragLeave(e) {
  this.className = 'droppable';
}

function dragDrop(e) {
  this.className = 'droppable';
  this.append(draggable);
}

注意點:1. 當可拖動元素被轉移時,原來容器中的可拖動元素並不會消失,需要我們手動將其隱藏(class設置爲invisible),如果同步操作會立馬觸發dragend事件導致效果消失,所以在setTimeout的至少中異步設置可確保預先操作開始後再隱藏draggable元素;
2. 在dragEnter和dragOver方法中我們需要通過preventDefault來取消事件以表明容器是一個合法的droppable元素,不然容器的drop事件將無法觸發,隨後的操作也將無法進行,詳細說明請參考 MDN DropTarget ;
3. 在dragDrop方法中直接使用append方法將draggable元素移動至當前容器下面。

後記

喜歡的小夥伴可以關注哦在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章