Mobile Safari にドラッグ アンド ドロップを実装しようとしています。
基本的に、ループする CSS アニメーションを再生しながら、タッチで div をドラッグしたいと考えています。また、いつドロップ ターゲットを超えたかを判断し、何か特別なことをしたいと考えています。
elementFromPointを使用して、div がtouchmoveイベントでドラッグされている要素を特定しています。ただし、ドラッグされた div は常に最上位の要素です。したがって、クエリを実行する前に、display: noneに設定しました。ただし、これには、タッチが移動するフレームごとにアニメーションをリセットする効果があります。
クエリを実行するたびに CSS アニメーションをリセットせずに、上にドラッグしているものを特定するにはどうすればよいですか?
WebKit でタッチ イベントを使用するJSFiddle 。
HTMLすべての touchmove で、ドラッグdiv を移動します。
<div id='drop'>Drop here</div>
<div id='drag'>Drag me</div>
JavaScript
var drag = document.getElementById('drag');
var drop = document.getElementById('drop');
drag.addEventListener('touchmove', move, true);
function move(e) {
var touch = e.changedTouches[0];
drag.style.left = touch.pageX - 25 + 'px';
drag.style.top = touch.pageY - 25 + 'px';
drag.style.display = 'none';
if (drop === document.elementFromPoint(touch.pageX, touch.pageY)) {
drag.classList.add('in-drop-zone');
} else {
drag.classList.remove('in-drop-zone');
}
drag.style.display = 'inline';
}
CSS
div {
position: absolute;
}
div#drag {
width: 50px;
height: 50px;
background-color: blue;
-webkit-transform-origin: 50% 50%;
-webkit-animation: sway 1s infinite alternate;
}
div#drop {
width: 100px;
height: 100px;
background-color: green;
left: 200px;
top: 200px;
}
div#drag.in-drop-zone {
background-color: yellow;
}
@-webkit-keyframes sway {
from {
-webkit-transform: rotate(-30deg);
}
to {
-webkit-transform: rotate(30deg);
}
}