2009-08-11 5 views
1

Ich weiß, dass jQuery und ähnliche Javascript-Frameworks Größe anpassen Funktionalität, aber ich möchte verstehen, wie es implementiert ist (wenn Sie nur mehr über Javascript erfahren).Wie kann ich die Größenänderung in Javascript implementieren?

Ich kann mir ein paar Wege vorstellen, wie es gemacht werden könnte, aber wie wird es in der Praxis umgesetzt? Das MouseOver-Ereignis wird auf ganze Elemente angewendet. Wie kann man also nur dann skalieren, wenn die Maus über die Kanten eines Elements bewegt wird?

Wenn es mehrere beliebte Möglichkeiten gibt, es zu implementieren, wie unterscheiden sie sich? Gibt es irgendwelche signifikanten Einschränkungen, dass Javascript vorläufig nicht funktionieren kann?

Antworten jeder Ebene des Details werden geschätzt. Auch wenn Sie mich zu relevanten Teilen des Framework-Quellcodes, in dem die "Magie" passiert, verweisen könnten, wäre das ebenfalls wünschenswert, aber nicht notwendig.

Antwort

1

Tatsächlich sind die Größenänderungskanten separate Elemente, die Mausereignisse für die Größenänderung verarbeiten.

Das Erstellen eines Größenänderungsbereichs mit einfachem altem JavaScript wäre mühsam und wir müssen mehr Code für die Effekte schreiben, die mit einem Framework erreicht werden können.

+0

OP erwähnt keine Bilder. Außerdem können Sie die Größe von Bildern clientseitig mit Javascript ändern. Es ist nur, dass es nur die Größe der Anzeige ändert. Es gibt Möglichkeiten zum Erstellen von Größenänderungsbereichen, ohne zusätzliche Elemente zu erstellen, wenn Sie nur ein wenig Mathematik verwenden. – Breton

+1

Für den zweiten Teil können Sie keinen Cursor nur für die Kante eines Elements haben. – rahul

+0

Der Cursor wird für das gesamte Element angewendet. Wenn Sie also den Cursor ändern müssen, um die Größe zu ändern, wenn Sie über die Kante schweben, müssen Sie ein separates Element dafür erstellen. – rahul

3

Ich nahm mir die Zeit, um ein Beispiel für Sie zu schreiben. Es ist hier:

http://blixt.org/js/resize.html

(. Hinweis: Dies wird wahrscheinlich nicht in allen Browsern funktionieren, da ich nicht die Zeit nehmen, hat, um sicherzustellen, war es Cross-Browser-kompatibel)

Im Grunde verwendet es das Ereignis mousemove, um zu überprüfen, wie weit der Cursor von den Kanten des Elements entfernt ist, und wenn es nahe genug an einer Kante ist, zeigen Sie einen Cursor für diese Kante an. Hier ist das JavaScript:

(Hinweis: In einem realen Projekt würden Sie dies sehr bzgl. Cross-Browser-Kompatibilität, Wartbarkeit und bessere Interaktion zwischen Bibliotheken codieren. Sie sollten ein Framework wie jQuery verwenden, da seine Entwickler haben dachte über all diese Dinge schon nach.)

var r = document.getElementById('resizable'); 
r.onmousemove = function (e) { 
    if (!e) e = window.event; 

    var 
    // Get the distances to all the edges. 
    // e.clientX is the X coordinate on the client area (window) of the mouse. 
    // r.offsetLeft is the horizontal offset from the page left. 
    // r.offsetWidth is the total width of the element. 
    left = e.clientX - r.offsetLeft, top = e.clientY - r.offsetTop, 
    bottom = r.offsetHeight - top, right = r.offsetWidth - left, 
    // Get the shortest distance to any of the edges. 
    min = Math.min(Math.min(Math.min(top, left), bottom), right); 

    // If the pointer is further than 5 pixels from an edge, do not display 
    // any resize cursor. 
    if (min > 5) { 
     r.style.cursor = 'default'; 
     return; 
    } 

    // Determine which cursor to display. 
    switch (min) { 
     case top: 
      r.style.cursor = 'n-resize'; 
      break; 
     case left: 
      r.style.cursor = 'w-resize'; 
      break; 
     case bottom: 
      r.style.cursor = 's-resize'; 
      break; 
     case right: 
      r.style.cursor = 'e-resize'; 
      break; 
    } 
} 
+0

Dies funktioniert nicht in Firefox 3.5 – rahul

+0

Funktioniert in 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv: 1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) 'für mich. Allerdings habe ich bemerkt, dass es etwas träge ist, den Cursor im Vergleich zu den anderen Browsern zu aktualisieren, was möglicherweise das Problem ist, das Sie sehen. Ansonsten ist es Betriebssystem-bezogen. Wie ich in meinem Beitrag schrieb, ist dies nicht die richtige Lösung; Es ist ein Proof of Concept und eine Möglichkeit zu erklären, wie Sie es mit nur einem Element tun würden. – Blixt