In der YUI 3 Gallery: Matt Taylor RaphaelJS Module
27. September 2010 um 13.05 Uhr von Matthew Taylor | In Entwicklung , YUI 3 Gallery | 9 Kommentare
Matt Taylor ( @ rhyolight , Blog ) arbeitet für Yahoo! auf eine interne Browser-Seite JavaScript-Framework. Er arbeitet gern mit Grafiken, und er ist mit Zeichnungen und Animationen, bevor Sie arbeitete Java2D Bibliotheken. Vor seinem Umzug nach Silicon Valley für Yahoo! arbeiten, arbeitete Matt in der St. Louis-Bereich als Software-Unternehmer. Er ist auch intensiv mit gearbeitet Groovy und Grails -Technologien für SpringSource. Er war der ursprüngliche Lead Programmer für die YUI2-based GrailsUI Plugin für das Grails Web-Framework.
RaphaelJS ist eine leistungsfähige JavaScript-Bibliothek, verwaltet SVG -Zeichnungen und Animationen. Es ermöglicht Ihnen die einfache Erstellung SVG Leinwände und ziehen Grundformen und Pfade sehr leicht, auch die Gruppierung sie in Sets und Anwenden von Transformationen auf einen oder mehrere Vektoren. Sie können Formen zeichnen, Bearbeiten von Bildern und animieren alles. RaphaelJS bietet eine schöne API zum Erstellen und Ändern von SVG-Elemente mit Leichtigkeit.
Während die Bibliothek ist beeindruckend, aber ich habe festgestellt, dass ich einige wichtige Funktionen, Elemente des RaphaelJS Bibliothek hinzufügen mit YUI3. Ich habe von diesen Anstrengungen mit der neuen begonnen RaphaelJS Gallery Module .
Lazy Loading RaphaelJS und Plugins
Das erste Merkmal ist die lazy-loading nicht nur der RaphaelJS Bibliothek, aber keine RaphaelJS Plugins die Sie benötigen. Die RaphaelJS Gallery Module werden nur diese Dateien laden, wenn Sie erklären, Sie werden mit ihnen in einer YUI Sandkasten. Zum Beispiel:
YUI ({gallery: "gallery-2010.09.22-20 bis 15 '}). Nutzung (" gallery-raphael', function (Y) { Y. Raphael (). Verwenden (function (Raphael) { / / Verwendung Raphael hier wie würden Sie außerhalb YUI var Papier = Raphael ("myPaper ', 500, 500); }); });
Wenn Sie RaphaelJS Plugins sind, geben Sie die Pfade in einem Array und senden diese als ersten Parameter in der Y. Raphael () ()-Funktion verwenden.:
YUI ({gallery: "gallery-2010.09.22-20 bis 15 '}). Nutzung (" gallery-raphael', function (Y) { var MyPlugins = ['plugins / raphael.awesomePlugin.js', 'plugins / raphael.wickedPlugin.js']; Y. Raphael (). Verwenden (MyPlugins, function (Raphael) { / / Verwendung Raphael hier wie würden Sie außerhalb YUI var Papier = Raphael ("myPaper ', 500, 500); / / Das "Papier" werden alle neuen Funktionen von Plugins nun hinzugefügt }); });
Die RaphaelJS Bibliothek das erste Mal geladen, dann ist jede angegebene Plugins werden geladen, bevor Sie Ihre Callback-Funktion mit dem Raphael-Objekt als einzigen Parameter ausgeführt wird.
Kundenspezifische Events
Sobald Sie eine Zeichenfläche mit der Raphael-Objekt erzeugt, dann können Sie sofort runter auf die Zeichnung. Wenn Sie Methoden wie Call rect , circle und path auf der Zeichenfläche, erhalten Sie wieder Objekte, die SVG-Vektoren. Normalerweise haben Sie Zugang zu den entsprechenden DOM-Elemente durch die node Eigentum. Zum Beispiel:
var Papier = Raphael ("myPaper ', 500, 500); var Quadrat = paper.rect (0, 0, 100, 100);
Dadurch entsteht ein rechteckiges Objekt Vector bei den Koordinaten [0,0] mit einer Breite und Höhe von 100 Pixel. Sie haben Zugriff auf die zugrunde liegende DOM-Element (das ist ein SVG rect -Element) in etwa so:
var rectNode = square.node; rectNode.onclick = function () { alert ('Herzlichen Glückwunsch, klickten Sie ein Quadrat'); };
Wenn Sie ein begeisterter YUI-Nutzer sind, würden Sie wahrscheinlich etwas mehr als gefallen. Wie wäre es mit einem eingebauten Y.Node als auch? Genau wie die node Eigenschaft bezieht sich auf die HTMLElement hinter dem SVG-Objekt, das $node verweist Eigenschaft, um die Y.Node -Wrapper für dieses Element. So kann man Dinge wie diese:
Quadrat. $ node.on ("mouseover", function () { alert ('Herzlichen Glückwunsch, Sie können eine Maus zu bewegen!'); });
Lasst uns versuchen, etwas komplexere jetzt. Eine Wechselwirkung mit einem Vektor der Lage sein sollten, um andere Ursache gezogen Vektoren, ihre Stile zu aktualisieren, oder? Wie wäre es schaffen wir einige Bars, die alle machen ihre Farben abhängig, wo ein mit der Maus befindet sich auf einem Kreis auf der Seite zu finden:
var Papier = Raphael ("rcanvas ', 600, 800); . var circ = paper.circle (350, 200, 100) attr ({fill: 'pink', Hub: 'black'}); / / Schieben ein paar Rechtecke in einem Array var i = 0; Rechtecke = []; for (; i <10; i + +) { . rectangles.push (paper.rect (0, 40 * i, 200, 20) attr ({fill: 'red', Hub: 'gelb'})); } / / Schleife durch die Rechtecke, Zugabe von bestimmten Kreis mousemove Handler für jeden Y.Array.each (Rechtecke, Funktion (rect, index) { var i = index + 1; circ. $ node.on ('mousemove', function (evt) { / / Die Füllfarbe ist dynamisch, abhängig von der Position dieses Rechtecks / / Im Array sowie die Position der Maus var lf = circ.attrs.cx - circ.attrs.r, rt = 2 * circ.attrs.r + lf, x = evt.clientX - lf, top = circ.attrs.cy - circ.attrs.r, BTM = 2 * circ.attrs.r + top, y = evt.clientY - top; rot = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6, grün = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6), blau = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6; rect.attr ('fill', 'rgb (' + rot + ',' + grün + ',' + blau +')'); }); });
Dieses Beispiel läuft hier , aber wie man in den Snapshots unten sehen können, ist die Farbe des Balkens hängt von der Mausposition über den Kreis sowie die Reihenfolge der bar.
Je nachdem, wo Sie den Mauszeiger über den Kreis befindet sich die Bar Farben individuell verändern.
So können Sie sehen, dass $node eine nützliche Abkürzung ist, aber nichts Spektakuläres. Es wäre wirklich fantastisch , wenn jeder SVG Objekt, das Sie mit RaphaelJS erstellen Feuer konnte benutzerdefinierte Ereignisse . Auf diese Weise könnten Sie Ihre individuelle Zeichnung Elemente, um benutzerdefinierte Ereignisse ausgelöst werden, und alles, was auf der Seite konnte zuhören und reagieren. Dies kann in vielerlei Hinsicht nützlich. Für den Anfang bietet es reiche Wechselwirkungen zwischen Ihren Zeichnungen. Benutzer-Interaktionen mit einem Vektor kann nun über jede andere Vektoren der Interaktion auf Anfrage. Das heißt, Sie können programatically Feuer Ereignisse aus Ihren Zeichnungen, wenn bestimmte Bedingungen erfüllt sind. Nicht nur, dass dies zu ermöglichen Ihren Zeichnungen auf andere Vektoren benachrichtigen, aber alles auf der Seite kann mithören
var Papier = Raphael ("rcanvas ', 600, 800); . var circ = paper.circle (350, 200, 100) attr ({fill: 'pink', Hub: 'black'}); / / Macht Arrays von Rechtecken und Kreisen var i = 0, Rechtecke = [], Kreise = []; for (; i <10; i + +) { . rectangles.push (paper.rect (0, 40 * i, 40 * i, 20) attr ({fill: 'red', Hub: 'gelb'})); circles.push (. paper.circle (0,0,20) zu verstecken ()); } Y.Array.each (Rechtecke, Funktion (rect, index) { var i = index + 1; circ. $ node.on ('mousemove', function (evt) { var lf = circ.attrs.cx - circ.attrs.r, rt = 2 * circ.attrs.r + lf, x = evt.clientX - lf, top = circ.attrs.cy - circ.attrs.r, BTM = 2 * circ.attrs.r + top, y = evt.clientY - top; NewWidth = (((256 * x) / (2 * circ.attrs.r)) -1) * i / 6, rot = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6, grün = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6), blau = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6; / / Dieser Zeit nicht nur das Ändern der Farbe, sondern auch das Rechteck Breite rect.attr ({ Breite: NewWidth, füllen: "rgb ('+ rot +', '+ grün +', '+ blau +') ' }); / / Brand benutzerdefinierte Ereignis zu benachrichtigen, dass dieses Rechteck Breite hat sich verändert rect.fire ('width-changed', {width: NewWidth, Quelle: rect, um: index}); }); / / Jedes Rechteck bekommt einen Listener, der auf der Breite verändert Feuer rect.on ('width-changed', function (evt) { var attrs = evt.source.attrs; / / Die entsprechenden Kreis und bewegen Sie ihn mit dem rechten Ende des Rechtecks Kreise [evt.order]. attr ({ cx: attrs.x + attrs.width, cy: attrs.y, füllen: "cornflowerblue" .}) Show (); }); });
Werfen Sie einen Blick auf diese laufen beispielsweise hier . Sie können auch aus dem Bild unten sehen, dass Kreise werden auf der rechten Enden der Rechtecke gezeichnet. Dies ist eine Reaktion auf jeden einzelnen Rechtecks benutzerdefinierte Ereignis Brennen auftritt, von einer Prozedur, die den Kreis bewegt sich in eine Position relativ zum aktuellen Attribute des Rechtecks gefangen.
Dies eröffnet einige interessante Möglichkeiten für RaphaelJS innerhalb YUI3. Zum Beispiel, was passiert, wenn wir eine Gruppe von Vektor-Formen mit der Gruppe selbst wird das Unternehmen, dass die Ereignisse Brände zur Außenwelt zu schaffen? Intern könnten jedes Vektor-Zeichenprogramm mit seinem Behälter über benutzerdefinierte Ereignisse kommunizieren, und der Behälter würden Entscheidungen darüber, welche Daten sie Feuer an die Außenwelt zu machen. Damit eröffnet sich die Idee der voll gekapselte, interaktive SVG steuert.
Zusammenfassung
Mit dem Aufstieg der HTML5 und seine Satelliten-Technologien, gibt es so viele andere Optionen als Flash für Rich-Interaktionen. Idealerweise sollte jede vectored Elemente auf der Seite voll zugänglich sein und standardisiert. Dies eröffnet wunderbare Möglichkeiten für uns zugänglich, Standard-Web-Steuerelemente, ohne auf Flash zu erstellen. SVG ist eine attraktive Option, da jeder Vektor auf der Seite erstellt wird durch einen DOM-Knoten, die wir mit YUI wie jede andere DOM-Knoten ändern können gesichert werden. Das ist, was erlaubt die RaphaelJS Gallery Module für alle SVG-Objekte, die von RaphaelJS erstellt erweitern, und das ist ein Schlüssel zu reichen Interaktion mit diesen elments von anderswo auf der Seite.
Share and erweitern: Lesezeichen mit del.icio.us | digg it! | reddit!
9 Kommentare
Leider ist die Kommentarfunktion für diesen Artikel geschlossen.

Copyright © 2006-2011 Yahoo! Inc. Alle Rechte vorbehalten. Datenschutzbestimmungen - Nutzungsbedingungen
Präsentiert von WordPress auf Yahoo! Web Hosting .



Wenn man sich die Interna von Raphael, ein bisschen mehr als ein Drittel des Codes befasst sich mit VML mit etwa den gleichen Betrag für SVG. Gibt es eine Chance zu bekommen YUI Das bedingte Laden, hier zu arbeiten oder gibt es licensing / Aufwand Barrieren in immer Raphael selbst gespalten aus und gehostet? (Nebeneffekt der Combo-Laden tatsächlich funktioniert)
Kommentar von Karl G - 27. September 2010 #
Zwei Dinge:
1) Raphael ist ein Wrapper für SVG * und * VML und enthält nur Dinge, die in beiden arbeiten. Wenn Sie Erweiterungen zu fördern, brauchen Sie nicht zu warnen Volk, das viele Male wird es in IE nicht. Wenn sie kein Interesse daran, fein, aber man sollte sie warnen.
2) Sie sind der Einladung zu einer Welt des Schmerzes, empfehle Zugriff auf die. Knoten. Eine Reihe von Operationen (was ändert sich mit jeder neuen Version und zwischen SVG / VML) verursachen den Knoten neu erstellt werden, so dass Ihr Event-Handler und Ihren Y. Knoten verloren gehen oder beziehen sich auf ein gelöschtes Objekt. . Schließlich die Inhalte der Knoten unterscheiden sich auf der Plattform und ist nicht nur ein einzelner Knoten - vor allem, wenn Sie Text zu betrachten, in dem Sie mindestens ein Objekt pro Charakter bekommen - und viele Male, Trigger Mausereignishandler nur auf Farbe, wenn Benutzer die Zelle zu erwarten aktiv zu sein.
Kommentar von Clifford Heath - 27. September 2010 #
Große writeup und Demos
Da Sie ein Y! 'er hacken auf Raphael Vielleicht kennen Sie einige Details über die neuesten auf Graphen / Diagrammen Anstrengungen für YUI?
Vielleicht etwas auf der Oberseite des Raphael gebaut?
Ich bin ein Fan von Raphael, aber ihre Charts-Bibliothek lässt ein wenig zu wünschen übrig, ebenso wie einige der Rohstoff-Chart Beispiele mit out-o-box Raphael erstellt werden weit mehr funktionelle / interactive
Würde gerne welche sehen Y! js Magie bestreut in diesem Bereich
Kommentar von Nate - 27. September 2010 #
Vielen Dank für das Feedback.
@ Karl: Wenn ich das richtig verstehe, für Ihre Idee zu arbeiten, müsste ich die raphael.js Datei in mehrere Teile von SVG und VML brechen. Ich plane nicht auf Berührung des RaphaelJS Bibliothek überhaupt, so ist es der Laden wird wohl bleiben wie sie ist.
@ Clifford: (1) Das ist ein guter Punkt, dass jemand erzogen auf dem Raphaeljs Mailing-Liste als gut. Ich bin nicht besonders über diese Galerie-Modul arbeitet in IE betrifft, aber das ist ein Luxus. Es muss noch Tests in IE (obwohl ich denke, es wird gut funktionieren). Ich werde laufen Tests in IE für dieses Modul nächste Woche, also werde ich sicher wissen. In der Zwischenzeit werde ich einen Warnhinweis auf dem Modul zu sehen. (2) Danke für das Heads-up. Ich frage mich, ob ich die Vorgänge, die den Knoten neu erstellt werden verursachen können erkennen und sicherzustellen, dass die neue $ node-Immobilie in Y. Knoten geschlungen ist. Ich werde tauchen viel tiefer in RaphaelJS sehr bald, also werde ich die Spuren dieses halten und hoffentlich in der Lage sein, die YUI Node-Eigenschaft auf jedem Knoten-clobbering Betrieb neu zu erstellen.
@ Nate: Ich weiß, einige Details, aber ich lasse die YUI-Team wickeln ihre Geschäfte dort. ;). Ich bin jedoch sehr interessant in Bestreuen einige YUI js Magie in der neuen HTML5-Grafik Spielplatz.
Kommentar von Matthew Taylor - 27. September 2010 #
Wissen Sie, ob diese Technik oder eine ähnliche Technik mit dem HTML 5 Canvas-Element funktioniert. Wenn ich eine html 5 die Leinwand zu bringen auf einer Webseite mit einem Rechteck in ihr, ist es möglich, auf Mausereignisse auf das Rechteck in der Leinwand zu hören.
Wenn mein HTML5-Seite enthält die folgenden.
Dieser Text wird angezeigt, wenn Ihr Browser nicht unterstützt HTML5 Canvas.
var Beispiel = document.getElementById ('Beispiel');
var context = example.getContext ('2 d ');
context.fillStyle = "rgb (255,0,0)";
context.fillRect (30, 30, 50, 50);
die ich von dieser Website übernahm:
http://en.wikipedia.org/wiki/Canvas_element
Ist es möglich, abholen Mausereignisse auf die verschiedenen Formen auf eine Leinwand mit YUI. Ist es möglich, so etwas wie ein Y. Node-Wrapper auf das Rechteck in der Leinwand ähnlich dem, was Sie mit den Elementen in RaphaelJS Dabei setzen.
Dank
Kommentar von John - 28. September 2010 #
Sie machen den Kommentar:
"
wenn jeder SVG Objekt, das Sie mit RaphaelJS schaffen könnte Feuer benutzerdefinierte Ereignisse.
"
Betrachten Sie das komplette Set von leicht vorbereiteten Veranstaltungen mit Raphael ...
http://www.irunmywebsite.com/raphael/additionalhelp.php?q=usingelementevents
Sie können diese Raphael Objects zuweisen ...
Kommentar von Charles - 28. September 2010 #
@ John: Zeichnen auf dem Canvas-Tag ist eine ganz andere Bewegung als mit Raphael und SVG (VML). Vektoren haben Staat und können verschoben werden animiert, und interagiert mit. Gestützt auf die Leinwand ist mehr wie Bitmap-Zeichnung. Sobald Sie etwas malen, ist es dort als Teil der Leinwand Hintergrund stecken, und ich bin mir nicht sicher, wie genau die Benutzer-Interaktionen zu arbeiten.
Kommentar von Matthew Taylor - 28. September 2010 #
@ Charles: Ja! Die Möglichkeit, die SVG-Knoten Zugriff ist schön für diese Art von Benutzer-Interaktionen, und meine Demos verwendet diese ziemlich viel. Die Art der benutzerdefinierten Ereignissen über die ich rede sind Ereignisse, die außerhalb des Anwendungsbereichs der normale DOM-Ereignisse.
In meinem letzten Beispiel oben sehen Sie, dass jedes Rechteck ein Feuer
width-changedEreignis, wenn sie geändert werden. Diese Ereignisse können durch nichts auf der Seite, für dieses Ereignis registriert gefangen werden. Das ist, wie jeder Kreis wird um die richtige Position gebracht, wie die Rechtecke der Größe verändert werden.Natürlich ist der Katalysator der all dies den
mousemoveFall, dass auf dem großen Kreis, der sie Art von Veranstaltung, die ich Sie sich beziehen denke auftritt. Bitte korrigieren Sie mich, wenn ich etwas verpasst haben.Kommentar von Matthew Taylor - 28. September 2010 #
@ John,
Es ist möglich, aber unordentlich. Sie haben auf einen Rekordwert (dh Hash) von Points of Interest zu halten, und dann haben Zuhörer an das Canvas-Element. Wenn Sie einen Termin zu bekommen, müssen Sie es xy Koordinaten zu nehmen und zu vergleichen, um Ihre Hash von Points of Interest, und dann wahrscheinlich Feuer ein benutzerdefiniertes Ereignis.
Ich habe das mit YUI2 getan, die Schaffung eines Radar-Diagramm, das Sie auf die Datenpunkte auf der Karte klicken, um Informationen zu bekommen, und fügen Sie Daten mit einem Klick auf die Skalenstriche auf den Achsen lässt. Mit excanvas das funktioniert auf IE, auch, und hat den Vorteil, für mich zu sein ein Bild (obwohl IE langsamer ist).
Allerdings ist dies alles mit Punkten, und eine ziemlich begrenzte Anzahl von Punkten an, dass, so überprüfen, ob die Maus irgendwo interessant ist nicht zu viel Arbeit. Aber mit den Regionen Ich vermute, dies würde zu sehr teuer, und Sie möchten sicher über einen Weg von nur Zuhören für "Mousein" (dh sie überqueren eine Linie) statt mouseover denken. Auch mit den Punkten, müssen Sie einige Scan zu tun, wie die Punkte Pixel und erwarten Benutzer werden Sie auf die pixelgenaue nicht für eine einfache Interaktion mit dem Benutzer zu machen!
Sie können "Animationen", eine Art, zu tun, aber das geht Neuzeichnen die Leinwand jedes Mal, sie sind also mehr Übergänge als Animationen. Ich habe eine einfache RenderStack für Dinge, die ich kenne nicht viel ändern (zB Achsen), die ich füllen mit Leinwand Zeichnung ruft, und dann Feuer den Stapel, so dass ich nicht zu tun haben, die Mathematik jeder Zeit. Aber ich bin nicht sicher, wie viel Unterschied das wirklich macht, ist es immer noch langsam in IE und schnell in alles andere!
Matt
Kommentar von Matt Parker - 29. September 2010 #