JSFiddle - React, Tailwind, and code Playground

by annndrewww

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="styles.css" />
    <title>Drag & Drop | Проект 2</title>
  </head>
  <body>
    <div>
      <div class="row">
          <div class="col-header start">Naruto</div>
          <div class="col-header progress">Sasuke</div>
          <div class="col-header done">Sakura</div>
      </div>

      <div class="row">
        <div class="placeholder">
          <div class="item" draggable="true">
            <p class="item-grab">Me</p>
          </div>
        </div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
      </div>
      
    </div>

    <script src="app.js"></script>
  </body>
</html>

CSS

@import url('https://fonts.googleapis.com/css?family=Roboto&display=swap');

* {
  box-sizing: border-box;
}

body {
  font-family: 'Roboto', sans-serif;
  background-color: #ececec;
  display: flex;
  padding-top: 5rem;
  justify-content: center;
  overflow: hidden;
  margin: 0;
}

.row {
  display: flex;
  width: 600px;
  justify-content: space-between;
  margin-bottom: 1rem;
}

.col-header {
  width: 150px;
  box-shadow: 4px 4px 9px rgba(198, 198, 198, 0.36);
  border-radius: 20px;
  padding: 0.8rem 1rem;
  color: #fff;
}

.item {
  width: 150px;
  height: 66px;
  border: 1px solid #eee;
  box-shadow: 4px 4px 9px rgba(198, 198, 198, 0.36);
  border-radius: 20px;
  background: #f7f6f7;
  padding: 0.8rem 1rem;
  color: #828282;
  text-align: center;
  cursor: grab;
}

.item:active {
  cursor: grabbing;
}

.placeholder {
  width: 150px;
  height: 66px;
}

.start {
  background: rgb(2,0,36);
  background: linear-gradient(90deg, rgba(2,0,36,1) 0%, rgba(240,141,54,1) 0%, rgba(176,20,20,1) 100%);
}

.progress {
  background: rgb(2,0,36);
  background: linear-gradient(90deg, rgba(2,0,36,1) 0%, rgba(34,32,34,1) 0%, rgba(176,41,176,1) 100%);
}

.done {
  background: rgb(2,0,36);
  background: linear-gradient(90deg, rgba(2,0,36,1) 0%, rgba(235,213,223,1) 0%, rgba(217,102,157,1) 100%);
}

.hold {
  border: 8px solid rgb(177, 119, 192);
}

.hide {
  display: none;
}

.hovered {
  border-top: 2px solid #d381e4;
  border-bottom: 2px solid #d381e4;
}

JavaScript

const item = document.querySelector('.item');
const placeholders = document.querySelectorAll('.placeholder');

item.addEventListener('dragstart', dragstart);
item.addEventListener('dragend', dragend);

for(const placeholder of placeholders) {
    placeholder.addEventListener('dragover', dragover);
    placeholder.addEventListener('dragenter', dragenter);
    placeholder.addEventListener('dragleave', dragleave);
    placeholder.addEventListener('drop', dragdrop);
}

function dragstart(event) {
    event.target.classList.add('hold');
    setTimeout(() => event.target.classList.add('hide'), 0)
}

function dragend(event) {
    event.target.classList.remove('hold', 'hide');
}

function dragover(event) {
    event.preventDefault()
    console.log('drag over')
}

function dragenter(event) {
    event.target.classList.add('hovered');
    console.log('drag enter')
}

function dragleave(event) {
    event.target.classList.remove('hovered')
    console.log('drag leave')
}

function dragdrop(event) {
    event.target.classList.remove('hovered')
    event.target.append(item)
    console.log('drag drop')
}