jul*_*bou 15 javascript html5 draggable html5-draggable
当开始使用HTML5 draggable属性拖动元素时,原始元素仍然可见,因此我最终得到两个可见的元素而不是一个.
如何只拖动可见的元素(原始元素应暂时隐藏).
<script>
function startDrag() {
// hide initial element
}
function endDrag() {
// reset initial element
}
</script>
<div class="draggable" draggable="true"
ondragstart="startDrag(event)"
ondragend="endDrag(event)"
></div>
Run Code Online (Sandbox Code Playgroud)
这是一个显示问题的jsfiddle https://jsfiddle.net/gjc5p4qp/
did*_*xga 16
这可以在没有以前答案中的技巧的情况下实现。
关键点是监听事件drag,而不是dragstart.
//listen to drag event, not dragstart!
document.querySelector(".draggable").addEventListener("drag", (e)=>{
e.target.classList.add("dragging");
});
document.querySelector(".draggable").addEventListener("dragend", (e)=>{
e.target.classList.remove("dragging");
});Run Code Online (Sandbox Code Playgroud)
.draggable {
width: 200px;
height: 30px;
background-color:#5856d6;
text-align:center;
line-height:30px;
}
.dragging {
background: transparent;
color: transparent;
border: 1px solid #5856d6;
}Run Code Online (Sandbox Code Playgroud)
<div draggable="true" class="draggable">Drag me!</div>Run Code Online (Sandbox Code Playgroud)
由于简单地设置visibility: hidden不起作用,因此我发现了另一个有点棘手的解决方案:visibility: hidden在拖动事件开始后的一毫秒内进行设置。
function startDrag(e) {
setTimeout(function() {
e.target.style.visibility = "hidden";
}, 1);
}
function endDrag(e) {
setTimeout(function() {
e.target.style.visibility = "";
}, 1);
}Run Code Online (Sandbox Code Playgroud)
body {
display: inline-block;
outline: 1px solid black;
}
.draggable {
border-radius: 4px;
background: #CC0000;
width: 40px;
height: 40px;
}Run Code Online (Sandbox Code Playgroud)
<div class="draggable" draggable="true" ondragstart="startDrag(event)" ondragend="endDrag(event)">
</div>Run Code Online (Sandbox Code Playgroud)
如果您想隐藏元素,可以使用 CSS 属性visibility:hidden或display:none.
我建议使用该visibility属性,因为它隐藏元素而不更改文档的布局。但是,如果您有子元素并且想要将它们隐藏,则需要visibility:inherit对每个子元素进行设置。
您使用该dragstart事件是正确的。但是由draggable属性创建的元素的克隆出现在事件的末尾dragstart。
因为 JavaScript 引擎是一个单线程解释器,如果您选择将其隐藏在这里,您的元素将被屏蔽为其克隆,该克隆将复制属性visibility:hidden。事实上,为了避免这种情况,您需要在Javascript callstack中创建克隆后将其隐藏。
为此,请使用该setTimout()函数并将其设置为 0 ms。这样,在创建其克隆之后,原始元素的掩码将被放置在堆栈的末尾。
拖动结束时,要使其重新出现,只需visibility:visible在dragend事件中调用将元素设置为可见即可。
以您为例,代码可能如下所示:
<div
class="draggable"
draggable="true"
ondragstart="startDrag(event)"
ondragend="endDrag(event)"
style="background: #e66465; color:white; width:80px; height:20px; text-align:center;">
Drag me
</div>
<script>
function startDrag(e) {
setTimeout(function(){
e.target.style.visibility = "hidden";
}, 0);
}
function endDrag(e){
e.target.style.visibility = "visible";
}
</script>Run Code Online (Sandbox Code Playgroud)