我正在创建一个利用 HTML5 拖放 API 的网站。
但是,为了提高用户体验,我想在用户拖动不可拖动元素时防止出现重影。这可能吗?
此外,默认情况下,几乎每个元素都"可拖动"。人们可以单击然后快速拖动浏览器中的几乎任何元素,这会创建一个重影图像以及一个no-drop
光标。有什么办法可以防止这种行为吗?
draggable="false"
不起作用。user-select: none
不起作用。pointer-events: none
不起作用。mousedown
上的event.preventDefault()
不起作用。event.preventDefault()
也不起作用。
dragstart
上的 我已经没有主意了,到目前为止,事实证明在网上找到有关此问题的信息非常困难。我发现了以下thread ,但是,draggable="false"
似乎不适用于我的情况。
下面的屏幕截图表明它不起作用;当然,您在屏幕截图中看不到我的光标,但您可以看到我如何将数字拖动到左侧。
我认为该问题可能与其父级具有与其关联的 dragover
和 drop
事件有关。尽管如此,我还是一脸茫然。
HTML
...
<body>
...
<div id="backgammon-board-container">
<div class="column" id="left-column">
<div class="quadrant" id="third-quadrant">
<div class="point odd top-point" id="point-13-12"><text>13</text>
<div class="checker player-one-checker" id="checker-03" draggable="true"></div>
</div>
</div>
</div>
...
</div>
</body>
</html>
CSS
#backgammon-board-container {
height: 100vh;
width: 60vw;
position: absolute;
right: 0;
display: flex;
}
.column {
height: 100%;
display: flex;
flex-direction: column; /* column-reverse for player two perspective */
}
#left-column {
flex: 6;
}
.quadrant {
flex: 1;
display: flex;
}
.point {
flex: 1;
padding: 10px 0;
display: flex;
flex-direction: column;
align-items: center;
}
.checker {
z-index: 1;
width: 48px;
height: 48px;
border-radius: 50%;
}
text {
position: fixed;
font-family: impact;
font-size: 24px;
color: white;
display: flex;
justify-content: center;
align-items: center;
user-select: none;
pointer-events: none;
}
JS
const p1checkers = document.getElementsByClassName('player-one-checker');
const p2checkers = document.getElementsByClassName('player-two-checker');
const pointClass = document.getElementsByClassName('point');
function setTurn(player) {
if (player === 'p1') {
allowCheckerMovement = p1checkers;
disallowCheckerMovement = p2checkers;
} else {
allowCheckerMovement = p2checkers;
disallowCheckerMovement = p1checkers;
}
// enable checker control for player
for (var i = 0; i < allowCheckerMovement.length; i++) {
allowCheckerMovement[i].style.cursor = 'pointer';
allowCheckerMovement[i].setAttribute('draggable', true);
allowCheckerMovement[i].addEventListener('dragstart', start); // for drag-and-drop.js
allowCheckerMovement[i].addEventListener('dragend', stop); // for drag-and-drop.js
}
// disable checker control for player
for (var i = 0; i < disallowCheckerMovement.length; i++) {
disallowCheckerMovement[i].style.cursor = 'default';
disallowCheckerMovement[i].setAttribute('draggable', false);
disallowCheckerMovement[i].removeEventListener('dragstart', start); // for drag-and-drop.js
disallowCheckerMovement[i].removeEventListener('dragend', stop); // for drag-and-drop.js
}
// allow drag and drop
for (var i = 0; i < pointClass.length; i++) {
pointClass[i].addEventListener('dragover', allowDrop); // for drag-and-drop.js
pointClass[i].addEventListener('drop', droppedOn); // for drag-and-drop.js
}
}
function start(event) {
var checker = event.target;
event.dataTransfer.setData('text/plain', checker.id);
event.dataTransfer.effectAllowed = 'move';
window.requestAnimationFrame(function(){
checker.style.visibility = 'hidden';
});
}
function allowDrop(event) {
event.preventDefault();
}
function droppedOn(event) {
event.preventDefault();
var data = event.dataTransfer.getData('text/plain');
event.target.appendChild(document.getElementById(data));
}
function stop(event){
var element = event.srcElement;
window.requestAnimationFrame(function(){
element.style.visibility = 'visible';
});
}
最佳答案
这就是您正在寻找的解决方案。 ;)
对于任何需要可拖动的内容,只需添加“enable-drag”CSS 类即可。
$('*:not(".enable-drag")').on('dragstart', function (e) {
e.preventDefault();
return false;
});
关于javascript - 防止拖动不可拖动元素时出现重影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44149403/