2015-02-10 12 views
5

Wenn das Papier zu groß für das Div ist, in dem es gezeigt wird, möchte ich das Papier ziehbar machen.Wie man ein Papier ziehbar macht

Ich habe versucht, die Papiere leer: Zeiger-und Mauszeiger-Ereignisse, war aber nicht in der Lage, nur die Mausbewegung folgen. Ich habe auch versucht, das Element des Papiers ziehbar über jquery, aber nichts scheint den Trick zu tun ...

Gibt es eine Möglichkeit, dies zu tun?

Antwort

4

Ich schlage vor, die folgenden:

  1. einen Handler für das Papier registrieren blank:pointerdown event, die das Papier ziehen (Speichern eines Flag initiiert, die Sie in Ihrem mousemove Handler verwenden werden, das Papier in der „Panning zu erkennen " Zustand).
  2. Legen Sie das große Papier in einen <div> Container mit CSS overflow: auto. Diese <div> wird Ihr kleines Fenster zum großen Papier sein.
  3. registrieren Sie einen Handler für Dokumentkörper mousemove Ereignis (weil Sie höchstwahrscheinlich möchten, dass das Papier gezogen wird, selbst wenn der Mauszeiger den Papierbereich verlässt?). In diesem Handler werden Sie die Eigenschaften scrollLeft und scrollTop Ihres <div> Containers so einstellen, dass das Papier "schwenkt". Zum Anpassen der Eigenschaften scrollLeft und scrollTop verwenden Sie die Eigenschaften clientX und clientY des Ereignisobjekts zusammen mit denselben Eigenschaften, die Sie zuvor in Ihrem Handler blank:pointerdown gespeichert haben. (mit anderen Worten, Sie benötigen diese, um den Versatz des Schwenkens von der letzten mousemove/blank:pointerdown zu finden).
  4. einen Handler für Dokumentkörper mouseup und in diesem Handler registrieren, löschen Sie Papier Ziehen Flagge, die Sie 1.
+0

Das funktioniert wunderbar! Danke vielmals! – Maria

+1

Das ist pures Genie. Ich habe nicht verstanden, wie ich es machen soll. Vielen Dank. JointJS ist einfach genial. – Karl

11

in Schritt stelle ich weiß, das ist ein etwas alten Thread, aber ich wurde für ein mit diesem fest während und über eine saubere Lösung mit der SVG Pan und Zoom-Bibliothek. Git hub link here

EDIT - habe ich eine Plunker der Schritte unter (plus einige Extras) hier: SVG panning with Jointjs

Erster Schritt nach dem Papier zu schaffen ist SVG Pan und Zoom zu initialisieren:

panAndZoom = svgPanZoom(targetElement.childNodes[0], 
     { 
      viewportSelector: targetElement.childNodes[0].childNodes[0], 
      fit: false, 
      zoomScaleSensitivity: 0.4, 
      panEnabled: false 
     }); 

Wobei targetElement das div ist, in das das jointjs-Papier gegangen ist. Jointjs wird darin ein SVG-Element erzeugen (daher die childNodes [0]) und innerhalb dieses Elements ist das erste Element das Viewport-Tag (daher childNodes [0] .childNodes [0] im Viewportselektor). In diesem Stadium ist die Pan-Funktion deaktiviert, da sie in meinem Anwendungsfall mit Drag-and-Drop-Elementen auf dem Papier interagiert. Stattdessen, was ich tue, ist eine Referenz auf das Objekt panAndZoom halten und wechseln Sie dann schwenken und Ausschalten auf den Rohling: pointerdown und leer: pointerup Ereignisse:

paper.on('blank:pointerdown', function (evt, x, y) { 
     panAndZoom.enablePan(); 
    }); 
paper.on('cell:pointerup blank:pointerup', function(cellView, event) { 
      panAndZoom.disablePan(); 

});

Nur ein weiterer Weg, um das Problem anzugehen ich denke, aber ich fand es ein wenig einfacher, und es gibt Sie heran zu und Sie können die Empfindlichkeit einstellen usw.

+0

Hallo Luke, vielen Dank für die Verbindung. Ich kämpfe es aber zum Laufen zu bringen, wahrscheinlich wegen des Zielelements;) wenn ich Papier = new joint.dia.Paper ({el: $ (‚# myid‘) haben, Sollte ich verwenden . var panAndZoom = svgPanZoom ($ ('# myid') childnodes [0] Wenn ja, ich den Fehler "Typeerror: Kann lesen Eigenschaft nicht '0' undefinierter" bekommen? – jmls

+0

ein jsfiddle, wie Sie‘ Das wäre _really_ hilfreich;) – jmls

+0

Hey jmls im moment weg aber ich sollte in der Lage sein, dich mit einem jsfiddle am Montagabend zu sortieren.In der Zwischenzeit, wenn du svgpanzoom einrichtest, musst du es dem svg Element erzählen Wenn #myid dir die ID des Svg-Elements gibt, brauchst du die childnodes pa nicht rt. Wenn #myid dir das Div über der SVG gibt, brauchst du den childnodes Teil. Ich empfehle, das Fenster chroft devtools zu verwenden, um durch den HTML-Code zu sehen, wie Sie das SVG-Element erhalten. –

11

Dies kann mit einer Kombination von JointJS Ereignissen erreicht werden und Ereignisse dokumentieren.Der Grafik-Display ist in einem div gekapselt:

<div id='diagram'></div> 

dann die Event-Handler für JointJS hinzufügen, zuerst das pointerdown Ereignis, bei dem wir die Startposition des Schlepp speichern:

paper.on('blank:pointerdown', 
    function(event, x, y) { 
     dragStartPosition = { x: x, y: y}; 
    } 
); 

Dann wird das Ende der drag (pointerup), wenn wir die Variable wir die Position speichern, löschen in (es wirkt auch als ein flag, ob es einen aktiven Widerstand im Gange ist):

paper.on('cell:pointerup blank:pointerup', function(cellView, x, y) { 
    delete dragStartPosition; 
}); 

Da JointJS kein Ereignis "Papierzeigerbewegung" darstellt, müssen wir das Dokumentereignis mousemove verwenden. Zum Beispiel mit JQuery:

$("#diagram") 
    .mousemove(function(event) { 
     if (dragStartPosition) 
      paper.translate(
       event.offsetX - dragStartPosition.x, 
       event.offsetY - dragStartPosition.y); 
    }); 

Wir bekommen die Drag-Koordinaten und die aktuelle Zeigerposition starten und die Papierposition aktualisieren, um den paper.translate() Anruf mit.

WARNUNG:, wenn Sie das Papier (mit paper.scale()) skalieren, müssen Sie auch die Startposition des Schlepp skalieren:

var scale = V(paper.viewport).scale(); 
dragStartPosition = { x: x * scale.sx, y: y * scale.sy}; 

Die Anrufe paper.translate() wird dann in die richtige Position aktualisieren.

+0

Das funktionierte sehr gut (zusammen mit der Skalierung), auch keine zusätzlichen Bibliotheken. Danke vielmals. – pootzko

+0

In jointjs v1.1 wurde paper.setOrigin (x, y) zugunsten von paper.translate (x, y) abgelehnt. http://resources.jointjs.com/docs/jointjs/v1.1/joint.html –

+0

Ausgezeichnete Sachen, danke. Wäre jedoch viel schneller gewesen, wenn Sie den ganzen Code in einem Block gepostet hätten, weil ich Schwierigkeiten hatte, ihn richtig zusammenzusetzen. :) – Sam

Verwandte Themen