gpt4 book ai didi

Javascript 高级可拖动问题

转载 作者:行者123 更新时间:2023-11-30 14:46:18 25 4
gpt4 key购买 nike

我正在为演示目的制作一个播放列表。我已经设置了一个嵌套有列表项的无序列表。 “draggable=true”处理程序使这些项目可拖动,效果很好。

这就是我卡住的地方;

一旦项目被点击,并准备拖动。我需要用户对用户放下元素的位置有强烈的视觉反馈。标准化不提供任何视觉反馈,只是将列表项放在其他列表项之间。我正在寻找一种方法,要么在视觉上将其他列表元素推到一边,要么至少在用户持有拖动项目的位置上突出显示边框。

解决此问题的最佳方法是什么?我在这里放了一些代码以防万一,但我正在寻找的是我编写的代码之外的内容。

HTML:

<ul>
<li draggable="true" ondragstart="dragStarted(event)" ondragover="draggingOver(event)" ondrop="dropped(event)" ondragenter="dragEnter(event)">
Item 1
</li>
<li draggable="true" ondragstart="dragStarted(event)" ondragover="draggingOver(event)" ondrop="dropped(event)" ondragenter="dragEnter(event)">
Item 2
</li>
<li draggable="true" ondragstart="dragStarted(event)" ondragover="draggingOver(event)" ondrop="dropped(event)" ondragenter="dragEnter(event)">
Item 3
</li>
</ul>

JS

var source; 

function dragStarted(e){
source = e.target;
e.dataTransfer.setData("text/plain", e.target.innerHTML);
e.dataTransfer.effectAllowed = "move";

}

function draggingOver(e){
e.preventDefault();
e.dataTransfer.dropEffect = "move";

}

function dropped(e){
e.preventDefault();
e.stopPropagation();
if (e.target.localName === 'li') {
source.innerHTML = e.target.innerHTML;
e.target.innerHTML = e.dataTransfer.getData("text/plain");
}
}

如何添加代码,以允许我以项目之间突出显示的边框形式设计视觉反馈。

最佳答案

检查这两个示例。

当某些东西被拖过时,首先只是突出显示悬停项目的边界。它使用 dragenterdragleave 事件来添加和删除 over css 类。

var source; 

var items = document.querySelectorAll('li');
for (item of items) {
item.addEventListener('dragstart', dragStarted, false);
item.addEventListener('drop', dropped, false);
item.addEventListener('dragover', draggingOver, false);
item.addEventListener('dragenter', dragEnter, false);
item.addEventListener('dragleave', dragLeave, false);
}
document.getElementById("list").addEventListener('mouseleave', dropped, false);

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

function dragLeave(e){
this.classList.remove('over');
}

function dragStarted(e){
source = e.target;
e.dataTransfer.setData("text/plain", e.target.innerHTML);
e.dataTransfer.effectAllowed = "move";
this.classList.add("over");
this.style.opacity = '0.4';
}

function draggingOver(e){
e.preventDefault();
e.dataTransfer.dropEffect = "move";
}

function dropped(e){
e.preventDefault();
e.stopPropagation();
source.style.opacity = '1.0';
if (e.target.localName === 'li') {
source.innerHTML = e.target.innerHTML;
e.target.innerHTML = e.dataTransfer.getData("text/plain");
}
this.classList.remove("over");
source.classList.remove("over");
}
ul { list-style-type: none; }

li {
border: 1px solid #000;
border-radius: 3px;
text-decoration: none;
padding: 2px 2px 2px 10px;
margin: 1px;
width: 300px;
transition: 0.2s ease-in-out;
}

li.over {
border: 1px dashed orange;
}
<ul id="list">
<li draggable="true">Sun Shining On The Moon</li>
<li draggable="true">Airglow</li>
<li draggable="true">Diffuse reflection</li>
<li draggable="true">Starlight</li>
</ul>

我认为第二个示例更接近您的需要。它使用 JavaScript 替换 dragenter 事件中的项目 insertBefore方法。

var source; 

var items = document.querySelectorAll('li');
for (item of items) {
item.addEventListener('dragstart', dragStarted, false);
item.addEventListener('drop', dropped, false);
item.addEventListener('dragover', draggingOver, false);
item.addEventListener('dragenter', dragEnter, false);
}
document.getElementById("list").addEventListener('mouseleave', dropped, false);

function isBefore(a, b) {
if (a.parentNode == b.parentNode) {
for (var cur = a; cur; cur = cur.previousSibling) {
if (cur === b) {
return true;
}
}
}
return false;
}

function dragEnter(e) {
if (isBefore(source, e.target)) {
e.target.parentNode.insertBefore(source, e.target);
}
else {
e.target.parentNode.insertBefore(source, e.target.nextSibling);
}
}

function dragStarted(e){
e.dataTransfer.setData("text/plain", e.target.innerHTML);
e.dataTransfer.effectAllowed = "move";
this.classList.add("over");
this.style.opacity = '0.4';
source = this;
}

function draggingOver(e){
e.preventDefault();
e.dataTransfer.dropEffect = "move";
}

function dropped(e){
source.style.opacity = '1.0';
source.classList.remove("over");
}
ul { list-style-type: none; }

li {
border: 1px solid #000;
border-radius: 3px;
text-decoration: none;
padding: 2px 2px 2px 10px;
margin: 1px;
width: 300px;
transition: 0.2s ease-in-out;
}

li.over {
border: 1px dashed orange;
transform: scale(0.97);
}
<ul id="list">
<li draggable="true">Sun Shining On The Moon</li>
<li draggable="true">Airglow</li>
<li draggable="true">Diffuse reflection</li>
<li draggable="true">Starlight</li>
</ul>

关于Javascript 高级可拖动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48872540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com