Javascript ist Toll!

Skripte

11. Oktober 2005 - 10:16

Grafik ziehen und verschieben

Eine Spielerei die ich mal für jemanden in einem Forum (Hier der Link zum Thread) gemacht habe. Weil's so toll aussieht mach ich's mal öffentlich. Wie das Skript eingesetzt werden kann, muss sich jeder selbst überlegen.

Quellcode

Und hier der Quellcode, ich hab den nur im Firefox und IE getestet. Um ihn zu nutzen muss er in eine Seite kopiert werden und die Elemente die verschoben werden sollen müssen eine ID haben, die img enthält. Damit sie sich verschieben lassen müssen sie die Eigenschaft position:absolute haben

javascript: js/dragpull.js
var drag_obj = null;
var min_h = 10; // minimale Höhe
var min_w = 10; // minimale Breite
 
function mouseDownBody(ev){
    setDragElement(ev);
 
    if( !drag_obj ) return ;
 
    document.onmousemove = mouseMoveBody;
    mouseMoveBody(ev)
    return false;
}
function mouseUpBody(ev) {
    if( drag_obj) drag_obj.style.cursor = 'move';
    drag_obj = null;
    document.onmousemove = setDragElement;
    return false;
}
 
// Das Drag Element initialisieren
function setDragElement(e) {
    if(!e) e = window.event;
    drag_obj = e.target || e.srcElement;
 
    while(drag_obj) {
         if( drag_obj.id && drag_obj.id.indexOf('img') != -1 ) break;
         drag_obj = drag_obj.parentNode;
    }
    var mouse = mouse_pos(e);
    if(drag_obj) {
         var p = get_rect(drag_obj);
         drag_obj.startLeft = p.left - mouse.left;
         drag_obj.startTop = p.top - mouse.top;
         drag_obj.startW = p.width;
         drag_obj.startH = p.height;
         drag_obj.mouseTop = mouse.top;
         drag_obj.mouseLeft = mouse.left;
         // berechne Cursor-Type;
         drag_obj.drittelX = Math.floor( ( mouse.left - p.left ) * 3 / p.width);
         drag_obj.drittelY = Math.floor( ( mouse.top - p.top ) * 3 / p.height) ;
         if(cursor[drag_obj.drittelY] && cursor[drag_obj.drittelY][drag_obj.drittelX]  ) 
         drag_obj.style['cursor'] = cursor[drag_obj.drittelY][drag_obj.drittelX];
    }
    return mouse;
}
// Mausposition im Dokument bestimmen
function mouse_pos(e) {
    if(!e) e = window.event;
    var body = (window.document.compatMode && window.document.compatMode == "CSS1Compat") ?
    window.document.documentElement : window.document.body || null;
 
    var mouse = { left:0, top:0 };
    mouse.left = e.pageX ? e.pageX : e.clientX + body.scrollLeft;
    mouse.top = e.pageY ? e.pageY : e.clientY + body.scrollTop;
    return mouse;
}
var cursor = [
['nw-resize', 'n-resize', 'ne-resize'],
['w-resize', 'move', 'e-resize'],
['sw-resize', 's-resize', 'se-resize'],
];
 
function mouseMoveBody(ev) {
    if(!drag_obj) return ;
    var m = mouse_pos(ev);
    var h = drag_obj.startH;
    var w = drag_obj.startW;
    var top = drag_obj.startTop;
    var left = drag_obj.startLeft;
    if( drag_obj.drittelY == 1 && drag_obj.drittelX == 1){
        drag_obj.style.top = top + m.top + 'px';
        drag_obj.style.left = left + m.left + 'px';
    }
 
    if(drag_obj.drittelY == 0) {
        // Größe nach oben verändern
        h += drag_obj.mouseTop - m.top;
        if(h > min_h)  drag_obj.style.top = top + m.top + 'px';
 
    } else if(drag_obj.drittelY == 2) {
        // Größe nach unten verändern
         h -= drag_obj.mouseTop - m.top;
    }
    if(drag_obj.drittelX == 0){
        // Größe nach links verändern
        w +=  drag_obj.mouseLeft - m.left;
        if(w > min_w) drag_obj.style.left = left + m.left + 'px';
    } else if(drag_obj.drittelX == 2) {
        // Größe nach rechts verändern
         w -= drag_obj.mouseLeft - m.left;
    }
 
    if(h > min_h) drag_obj.style.height = h + 'px';
    if(w > min_w) drag_obj.style.width =  w + 'px';
 
    return false;
}
 
function get_rect(o) {
    var rect = {
    left: 0,
    top: 0,
    height: o.offsetHeight,
    width: o.offsetWidth
    }
    while (o) {
         rect.top += parseInt(o.offsetTop );
         rect.left += parseInt(o.offsetLeft );
         o = o.offsetParent;
    }
    return rect;
}
document.onmousedown = mouseDownBody;
document.onmouseup = mouseUpBody;
document.onmousemove = setDragElement;
Comments (14)
7947 mal gelesen.

14 Kommentare Einen Kommentar hinterlassen »

Kommentare

1. Kommentar von PLATZMEiSTER
Mittwoch 18.Januar 2006: 17:28

naja, trotz Deines Tests mit Firefox funzt das Skript mit meiner fuchs nicht. Hab Version 1.5 vielleicht liegts daran - kann ich mir aber nicht vorstellen. Wenn Du weist warum, kannst Du mir ja bescheid geben.

2. Kommentar von Struppi
Mittwoch 18.Januar 2006: 19:08

Kann ich nicht bestätigen, ich hab ebenfalls 1.5 und es klappt Problemlos. Übrigens auch im Opera 7 (mit kleinen Einschränkungen)

3. Kommentar von l8a
Mittwoch 20.Juni 2007: 16:59

Bei mir funktioniert es online, aber offline nicht..? Habe ich es wohl möglich nicht korekt eingebunden? Wie hast du es gemacht?

4. Kommentar von l8a
Freitag 22.Juni 2007: 19:26

Lag an ner lokalen sache, funktioniert jetzt soweit einwandfrei. Jedoch wird jedes element beim anklicken grundsätzlich sofort um nen px vergrössert, egal ob man es nun einfach anklickt, verschiebt, oder resized.

5. Kommentar von l8a
Freitag 22.Juni 2007: 21:01

Ok funktioniert nun einwandfrei, lag an ner unglücklichen css kombination

6. Kommentar von mArtin
Sonntag 22.Juni 2008: 12:11

Wirklich genial - Herzlichen Dank!

7. Kommentar von sven
Mittwoch 28.Januar 2009: 12:34

Klasse Script.
Ich hätte dazu aber eine frage.

Ist es auch möglich dieses Script auf ein Div anzuwenden?

8. Kommentar von Struppi
Mittwoch 28.Januar 2009: 17:50

Ja, kein Problem, es muss nur positioniert sein

9. Kommentar von sven
Mittwoch 4.Februar 2009: 11:50

Eine Frage zu dem Script hätte ich noch.
Wie muß das Script verändert werden, wenn ich nur die funktion zum größe-anpassen nutzen möchte. Ich versuche schon seit tagen dies zu lösen. Ich finde keinen einstieg.

10. Kommentar von schlaubi666
Mittwoch 4.November 2009: 22:54

Hi,

Respekt !!!

ich würde gern die "nur" das Verschieben nutzen, und das Strecken abschalten.

Wie mache ich das ?

11. Kommentar von Struppi
Donnerstag 5.November 2009: 13:40

Du meinst Drag&Drop?
http://javascript.jstruebig.de/javascript/67/

12. Kommentar von thomst
Freitag 14.Mai 2010: 17:07

Hi,
gelungene Sache, dieses Script. Ich arbeite zur Zeit auch an einer etwas speziellen Webanwendung. Es ist eine Navigation über eine Fläche durch bloßes Ziehen der Fläche, so wie man es google-maps gewohnt ist. Das Script funktioniert soweit, ich habe nur ein Problem: die "Fläche" wird durch Bilder aufgebaut. Wenn ich nun mit der Maus die Fläche greifen und ziehen will, kommt mir die Drag&Drop-Funktion des Browsers dazwischen; statt über mein Script die Fläche zu greifen, greife ich einzelne Bild. Auf diese Weise wird das Mausereignis immer wieder abgefangen und kann von meinem Script nicht richtig verarbeitet werden. Lässt sich das irgendwie vermeiden? Wieso kommt dir diese Funktion bei deinem Script nicht in die Quere? Ich wäre froh, wenn du mir helfen könntest...
Grüße, thomst

13. Kommentar von thomst
Samstag 15.Mai 2010: 10:20

ok. Ich habe mir dein Script noch mal genauer angeschaut und bin nun selbst drauf gekommen. Hat sich also erledigt. Jedenfalls besten Dank für das feine Script!

14. Kommentar von Struppi
Samstag 15.Mai 2010: 12:40

In dem Skript hier, ist es das return false in den Mauseventfunktionen. Zusätzlich kann es notwendig sein, ein event.preventDefault() aufzurufen.

Einen Kommentar hinterlassen

Name (erforderlich)
Mail (wird nicht angezeigt) (erforderlich)
Website


Powered by WordPress Stop Spam Harvesters, Join Project Honey Pot
rats-wonderful
rats-wonderful
rats-wonderful
rats-wonderful Browser-Statistiken