Javascript ist Toll!

Javascript > 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;

Ähnliche Artikel

Comments (19)
12666 mal gelesen.

19 Comments

Einen Kommentar hinterlassen »

Kommentare

1. 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. 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. 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. 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. von l8a
Freitag 22.Juni 2007: 21:01

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

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

Wirklich genial - Herzlichen Dank!

7. 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. von Struppi
Mittwoch 28.Januar 2009: 17:50

Ja, kein Problem, es muss nur positioniert sein

9. 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. 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. von Struppi
Donnerstag 5.November 2009: 13:40

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

12. 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. 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. 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.

15. von Jochen
Donnerstag 28.April 2011: 13:14

es funktioniert in allen Browsern (FF, MISE, Safari, Opera) nur NICHT im Chrom`!!

woran kann das liegen?

16. von Struppi
Donnerstag 28.April 2011: 13:46

Kann ich leider mangels Chrome nicht sagen.

17. von Frank
Freitag 21.Oktober 2011: 14:21

Ist ein sehr cooles Script. Hab nur bemerkt, wenn ich auf die Grafik klicke wird sie jedesmal ein Stück größer gemacht, woran kann das liegen???

18. von Struppi
Samstag 22.Oktober 2011: 13:31

Hier auf der Seite? Ich hab's grad mal mit Firefox getestet, da ist das nicht so.

19. von jason
Sonntag 27.November 2011: 18:23

Hallo, sehr gutes Script, wie binde ich das mit einer image ein, das es auch mit userscripts läuft?

also greasemonkey kompatibel zu machen??

bitte mal beschreiben, was ich ändern muss und wo ich die img Datei einbinden muss!!

Einen Kommentar hinterlassen

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

Folgende HTML Tags sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>



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