gpt4 book ai didi

javascript - 拖放的几个问题

转载 作者:太空狗 更新时间:2023-10-29 16:38:33 24 4
gpt4 key购买 nike

我有一些类似附加代码的东西,其中一些绿色 div 可以在列表元素之间拖放。

有两个问题我似乎无法解决:

1) 较大的“Take Me”div 中的“幽灵”拖动图像几乎不可见。用户对拖拽的内容知之甚少。这可以以某种方式改变吗?

2) 放置目标是鼠标指针下的目标。这是非常合乎逻辑的,但它让用户很难理解果岭将被丢弃的位置。如果它被拖到底部,那么当释放鼠标按钮时,绿色会向下跳一大步。有没有办法让重影图像的顶部与指针对齐?

在最终的应用程序中会有许多绿色 div,用户应该能够将它们放在一起而不重叠,因此清楚地知道正在拖动的内容和精确放置很重要。

我最好不要使用拖动事件并以老式的方式手动实现拖放(很可能使用某种库)吗?

我只需要对最新浏览器的支持,到目前为止我只在 Windows 上尝试过 Chrome 和 FF。

function initDragDrop(){

initDragDrop.dragged = null;

// Dragged
$('div')
.on('dragstart',
function(event) {

initDragDrop.dragged = this;
initDragDrop.dragged.style.opacity = 0.5;
event.originalEvent.dataTransfer.setData('text/plain', 'dummy');
})
.on('dragend', function( event ) {

event.target.style.opacity = '';
});

// Drop targets
$('li')
.on('dragenter', function(event) {

event.preventDefault();
})
.on('drop dragdrop', function(event){

event.preventDefault();
event.stopPropagation();

event.target.classList.remove('dragover');
if ( initDragDrop.dragged ) {

initDragDrop.dragged.style.opacity = '';
$(this).append($(initDragDrop.dragged));
initDragDrop.dragged = null;
}
})
.on('dragover', function(event) {

event.target.classList.add('dragover');
event.preventDefault();
})
.on('dragleave', function(event) {

event.target.classList.remove('dragover');
});
}

initDragDrop();
ul {
width: 30em;
display: block;
}
ul.small {
margin-top: 4em;
width: 10em;
}
li {
height: 2em;
border: 1px solid grey;
}
li.dragover {
background: #ddd;
}
div {
background-color: lightgreen;
border: 2px solid darkgreen;
position: relative;
margin: 0;
width: 90%;
height: 5em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li></li>
<li></li>
<li><div draggable="true">
Take Me
</div></li>
<li></li>
</ul>
<ul class="small">
<li></li>
<li></li>
<li><div draggable="true">
Take Me too
</div></li>
<li></li>
<li></li>
<li></li>
</ul>

最佳答案

您不能直接为拖动的元素设置样式。拖动一开始,它就是元素此时的样子的位图副本。

但是,您可以在拖动开始之前更改其样式(或类),并在拖动开始后立即将其还原。因此,我们应该能够在“屏幕截图”发生之前对其进行样式化以使其处于合适的位置。

这是一种样式有效但定位无效的尝试……我正在尝试弄清楚:

(function initDragDrop() {
initDragDrop.dragged = null;

// Dragged
$('div')
.on('dragstart', function(event) {

initDragDrop.dragged = this;
initDragDrop.dragged.classList.add('ghost');
event.originalEvent.dataTransfer.setData('text/plain', 'dummy');

// Set style for the element before dragging it
var elm = event.target;
elm.classList.add('dragged');
elm.style.top = (event.clientY) - 5 + 'px';
elm.style.left = (event.clientX) - 5 + 'px';

// Reset style after drag has started
setTimeout((function(elm) {
return function() {
elm.classList.remove('dragged');
elm.style.removeProperty('top');
elm.style.removeProperty('left');
}
})(elm), 1000);

})
.on('dragend', function(event) {
// event.target.style.opacity = ''; // Not used
});

// Drop targets
$('li')
.on('dragenter', function(event) {
event.preventDefault();
})
.on('drop dragdrop', function(event) {
event.preventDefault();
event.stopPropagation();
event.target.classList.remove('dragover');
if (initDragDrop.dragged) {
initDragDrop.dragged.classList.remove('ghost');
$(this).append($(initDragDrop.dragged));
initDragDrop.dragged = null;
}
})
.on('dragover', function(event) {
event.target.classList.add('dragover');
event.preventDefault();
})
.on('dragleave', function(event) {
event.target.classList.remove('dragover');
});
})();
ul {
width: 30em;
display: block;
}

ul.small {
margin-top: 4em;
width: 10em;
}

li {
height: 2em;
border: 1px solid grey;
}

li.dragover {
background: #ddd;
}

div {
background-color: lightgreen;
border: 2px solid darkgreen;
position: relative;
margin: 0;
width: 90%;
height: 5em;
}

.ghost {
opacity: 0.5;
}

.dragged {
display: block;
position: fixed;
background-color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li></li>
<li></li>
<li>
<div draggable="true">
Take Me
</div>
</li>
<li></li>
</ul>
<ul class="small">
<li></li>
<li></li>
<li>
<div draggable="true">
Take Me too
</div>
</li>
<li></li>
<li></li>
<li></li>
</ul>

关于javascript - 拖放的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53854291/

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