javascript - WebKit: How to determine what elements are under a touch while dragging an animating div -
i'm trying implement drag , drop mobile safari.
basically want drag div via touch while plays looping css animation. want determine when it's above drop target , special.
i'm using elementfrompoint determine elements div being dragged on over touchmove events. however, dragged div topmost element. before querying, set display: none. however, has effect of resetting animation every frame in touch moves.
how determine i'm dragging above without resetting css animation every time query?
jsfiddle using touch events in webkit.
html on every touchmove move drag 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 { { -webkit-transform: rotate(-30deg); } { -webkit-transform: rotate(30deg); } }
you set pointer-events: none , pointer-events: auto, seems pretty hacky. better option have intersection function:
var drag = document.getelementbyid('drag'); var drop = document.getelementbyid('drop'); var drop_bbox = drop.getboundingclientrect(); window.addeventlistener('touchmove', move, true); window.addeventlistener('mousemove', move, true); function move(e) { drag.style.left = e.clientx - 25 + 'px'; drag.style.top = e.clienty - 25 + 'px'; var drag_bbox = e.target.getboundingclientrect(); drag.classname = rectsintersect(drag_bbox, drop_bbox) ? "in-drop-zone" : null; } function rectsintersect(r1, r2) { if (!r1 || !r2) return false; return r2.left < (r1.left+r1.width) && (r2.left+r2.width) > r1.left && r2.top < (r1.top+r1.height) && (r2.top+r2.height) > r1.top; }; here jsfiddle http://jsfiddle.net/duopixel/svppw/
Comments
Post a Comment