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')
}