HTML
<div>
<h1 style="text-align: center">課程表</h1>
<div class="container">
<div class="left" data-drop="move">
<!-- draggable="true"實(shí)現(xiàn)可拖拽 -->
<div data-effect="copy" draggable="true" class="color1 item">語文</div>
<div data-effect="copy" draggable="true" class="color2 item">數(shù)學(xué)</div>
<div data-effect="copy" draggable="true" class="color3 item">英語</div>
<div data-effect="copy" draggable="true" class="color4 item">政治</div>
<div data-effect="copy" draggable="true" class="color5 item">歷史</div>
<div data-effect="copy" draggable="true" class="color6 item">地理</div>
<div data-effect="copy" draggable="true" class="color7 item">物理</div>
</div>
<div class="right">
<table>
<tr>
<th>周一</th>
<th>周二</th>
<th>周三</th>
<th>周四</th>
<th>周五</th>
<th>周六</th>
<th>周日</th>
</tr>
<tr>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
</tr>
<tr>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
</tr>
<tr>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
</tr>
<tr>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
</tr>
<tr>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
</tr>
<tr>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
</tr>
</table>
</div>
</div>
</div>
CSS文章來源:http://www.zghlxwxcb.cn/news/detail-724675.html
.color1 {
background-color: pink;
}
.color2 {
background-color: greenyellow;
}
.color3 {
background-color: burlywood;
}
.color4 {
background-color: orangered;
}
.color5 {
background-color: orange;
}
.color6 {
background-color: purple;
}
.color7 {
background-color: peru;
}
.container {
display: flex;
margin: 50px;
}
.left {
background-color: rgba(223, 223, 216, 0.867);
padding: 30px 5px;
}
.item {
width: 60px;
height: 40px;
text-align: center;
line-height: 40px;
border: 1px solid #000;
margin: 5px 0;
}
.right {
margin-left: 50px;
box-sizing: border-box;
background-color: rgba(192, 192, 186, 0.867);
}
table {
border: 1px solid black;
}
th {
width: 60px;
height: 40px;
padding: 10px;
margin: 2px;
line-height: 40px;
border-radius: 2px;
}
td {
width: 60px;
height: 40px;
padding: 10px;
margin: 2px;
border-radius: 2px;
background-color: #fff;
}
.drop-over {
background-color: rgba(192, 192, 186, 0.867);
}
JS文章來源地址http://www.zghlxwxcb.cn/news/detail-724675.html
// 父級事件委托
const container = document.querySelector('.container')
// // 開始拖拽(只觸發(fā)一次)
// // e.target拖拽元素
// container.ondragstart = (e) => {
// console.log('start', e.target)
// }
// // 拖拽到了哪個元素上(頻繁觸發(fā)-350ms)
// // e.target拖拽到了哪個元素之上
// container.ondragover = (e) => {
// // console.log('over', e.target)
// }
// // 拖拽到了哪個元素上(拖拽到對應(yīng)元素只觸發(fā)一次)
// // e.target拖拽到了哪個元素之上
// container.ondragenter = (e) => {
// console.log('enter', e.target)
// }
// // 松開鼠標(biāo)時拖拽到哪個元素上
// // e.target拖拽到了哪個元素之上
// container.ondrop = (e) => {
// console.log('drop', e.target)
// }
// // 直接使用無法觸發(fā)該事件 因?yàn)闉g覽器默認(rèn)行為不支持拖拽到元素上
// // 因此要阻止默認(rèn)行為
// container.ondragover = (e) => {
// e.preventDefault()
// }
let source
// 功能實(shí)現(xiàn)
container.ondragstart = (e) => {
// 設(shè)置拖拽時鼠標(biāo)狀態(tài),取自定義屬性
e.dataTransfer.effectAllowed = e.target.dataset.effect
source = e.target
}
container.ondragover = (e) => {
e.preventDefault()
}
function clearDropStyle() {
document.querySelectorAll('.drop-over').forEach((node) => {
node.classList.remove('drop-over')
})
}
// 之前的代碼在實(shí)現(xiàn)的時候,只考慮了該元素拖拽到空白元素的場景
// 但是拖拽到同級元素,也要找到父元素進(jìn)行替換,直到找到存在drop
function getDropNode(node) {
while (node && !node.dataset?.drop) {
node = node.parentNode
}
return node
}
container.ondragenter = (e) => {
// 清除之前的樣式
clearDropStyle()
const dropNode = getDropNode(e.target)
// 當(dāng)目標(biāo)元素的自定義屬性drop等于目前拖動元素屬性時,代表該節(jié)點(diǎn)接受拖拽
if (dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed) {
// 當(dāng)拖拽元素移入時,添加陰影
dropNode.classList.add('drop-over')
}
}
container.ondrop = (e) => {
clearDropStyle()
const dropNode = getDropNode(e.target)
if (dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed) {
if (dropNode.dataset.drop === 'copy') {
dropNode.innerHTML = ''
const cloned = source.cloneNode(true)
// 復(fù)制過后的節(jié)點(diǎn)改為move屬性
cloned.dataset.effect = 'move'
dropNode.appendChild(cloned)
} else {
// 拖回去刪除該節(jié)點(diǎn)
source.remove()
}
}
}
到了這里,關(guān)于前端drag api課程表demo的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!