Avatar billede dmdisco Nybegynder
10. april 2013 - 00:17 Der er 6 kommentarer og
1 løsning

drag/drop med snap til grid

Jeg sidder og arbejder med en opgave hvor jeg skal kunne sætte 2 billeder sammen, men de må kun kunne sættes sammen i et grid på 10px, og når det er gjort skal jeg bruge koordinaterne for hvor de 2 billeder er droppet.

men jeg kan ikke rigtig udtænke en model til at lave et grid constraint hvor dragimage bliver constraint (så man visuelt kan se at den snapper), min første tanke var at få fat i koordinatet på det element der blev dragget for så at banke det på plads men jo mere jeg tænker over det mener jeg at det er den forkerte vinkel og kan også kun få fat på udgangspunktet eller slutpunktet.

men grid delen er den vigtigste lige pt. så skal jeg nok klare resten selv.

p.s det hele skal klares uden 3rd party frameworks.
Avatar billede olebole Juniormester
10. april 2013 - 02:46 #1
<ole>

En hurtig kode til inspiration:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled Document</title>
<style type="text/css">
#dragArea {
    position: relative;
    width: 600px;
    height: 400px;
    border: 1px solid #000;
}
.drag-item {
    position: absolute;
    width: 100px;
    height: 80px;
    cursor: move;
}
.red {
    background: red;
}
.blue {
    background: blue;
    left: 220px;
    top: 170px;
}
</style>
<script type="text/javascript">
// X-Browser Event handler objekt
var Evnt = (function(){
    return (document.addEventListener ? {
        add: function(obj, type, fn) {
            obj.addEventListener(type, fn, false);
        },
        rem: function(obj, type, fn) {
            obj.removeEventListener(type, fn, false);
        }
    } : {
        add: function(obj, type, fn) {
            obj.attachEvent("on"+type, fn);
        },
        rem: function(obj, type, fn) {
            obj.detachEvent("on"+type, fn);
        }
    });
})();

var objCont = null, objDrag = null, pointClick = null;
function mDown(evnt, elm) {
    objDrag = document.elementFromPoint(evnt.clientX, evnt.clientY);
    if (objDrag.className.indexOf("drag-item")<0) return objDrag = null;
    objDrag = {
        elm: objDrag,
        w: objDrag.offsetWidth,
        h: objDrag.offsetHeight
    };
    objCont = {
        elm: elm,
        w: elm.clientWidth,
        h: elm.clientHeight
    };
    pointClick = {x:evnt.clientX-objDrag.elm.offsetLeft, y:evnt.clientY-objDrag.elm.offsetTop};
   
    if (evnt.preventDefault) evnt.preventDefault();
    evnt.returnValue = false;
}
function mMove(evnt) {
    if (!objDrag) return;
    evnt = evnt ? evnt : event;
    var css = objDrag.elm.style,
    nX = evnt.clientX-pointClick.x,
    nY = evnt.clientY-pointClick.y,
    oX = objDrag.elm.offsetLeft,
    oY = objDrag.elm.offsetTop;
   
    if (Math.abs(oX-nX)>10) {
        nX = Math.round(nX/10)*10;
        if (nX>=0 && nX+objDrag.w<=objCont.w) css.left = nX + "px";
    }
    if (Math.abs(oY-nY)>10) {
        nY = Math.round(nY/10)*10;
        if (nY>=0 && nY+objDrag.h<=objCont.h) css.top = nY + "px";
    }
}
function mUp(evnt) {
    objDrag = objCont = null;
}
function initDrag() {
    Evnt.add(document, "mousemove", mMove);
    Evnt.add(document, "mouseup", mUp);
    Evnt.rem(window, "load", initDrag);
}

Evnt.add(window, "load", initDrag);
</script>
</head>
<body>
<div style="padding:200px">

<div id="dragArea" onmousedown="mDown(event, this)">
    <div class="drag-item red"></div>
    <div class="drag-item blue"></div>
</div>

</div>
</body>
</html>

/mvh
</bole>
Avatar billede olebole Juniormester
10. april 2013 - 02:51 #2
- og du bør nok rette til:

    if (Math.abs(oX-nX)>=10) {
        nX = Math.round(nX/10)*10;
        if (nX>=0 && nX+objDrag.w<=objCont.w) css.left = nX + "px";
    }
    if (Math.abs(oY-nY)>=10) {
        nY = Math.round(nY/10)*10;
        if (nY>=0 && nY+objDrag.h<=objCont.h) css.top = nY + "px";
    }
Avatar billede dmdisco Nybegynder
10. april 2013 - 19:28 #3
fedt det ser ud til at være noget i den stil, prøver lige at porte det til html5 native drag og drop
Avatar billede olebole Juniormester
10. april 2013 - 19:55 #4
Det giver næppe mening at forsøge at kombinere det med HTML5 drag/drop
Avatar billede dmdisco Nybegynder
10. april 2013 - 20:08 #5
nej det fandt jeg hurtigt ud af, html5 drag/drop er ikke rigtigt til den slags ser det ud til.

laver bare det hele med javascript det er nok lettere, som i dit eksempel.

takker Ole, læg et svar
Avatar billede olebole Juniormester
13. april 2013 - 20:55 #6
Ellers tak, jeg samler ikke point. Bare læg et svar selv og accepter det, så tråden lukkes  =)
Avatar billede dmdisco Nybegynder
16. april 2013 - 10:03 #7
nuvel, men ihvertfald tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester