Nel YUI 3 Galleria: Matt Taylor RaphaelJS Module
27 settembre 2010 alle 1:05 pm Matthew Taylor | In Development e YUI 3 galleria | 9 commenti
Matt Taylor ( @ rhyolight , blog ) lavora per Yahoo! in un interno del browser-side framework JavaScript. Gli piace lavorare con la grafica, e ha lavorato con i disegni e le animazioni prima di utilizzare Java2D librerie. Prima di trasferirsi in Silicon Valley a lavorare per Yahoo!, Matt ha lavorato nella zona di St. Louis, come un imprenditore del software. Ha anche lavorato a lungo con Groovy e Grails tecnologie per SpringSource. Era il capo programmatore originale del YUI2-based GrailsUI plugin per il web framework Grails.
RaphaelJS è una potente libreria JavaScript che gestisce SVG disegni e animazioni. Esso consente di creare facilmente tele SVG e disegnare forme di base e percorsi molto facilmente, anche loro raggruppamento in set e applicazione di trasformazioni a uno o molti vettori. È possibile disegnare forme, manipolare immagini, e animare tutto. RaphaelJS offre una bella API per creare e modificare gli elementi SVG con facilità.
Mentre la biblioteca è impressionante, ma ho trovato che posso aggiungere alcune caratteristiche importanti per gli elementi della libreria RaphaelJS con YUI3. Ho iniziato questi sforzi con il nuovo modulo Galleria RaphaelJS .
RaphaelJS caricamento lazy e Plugin
La prima caratteristica è il lazy-loading di non solo la libreria RaphaelJS, ma ogni RaphaelJS plugin potrebbe essere necessario. Il modulo Galleria RaphaelJS solo caricare questi file quando si dichiara ti verrà utilizzando all'interno di una sandbox YUI. Ad esempio:
YUI ({gallery: 'gallery-2010/9/22-20-15'}). Uso ('gallery-raphael', function (Y) { Y.Raphael (). Utilizzare (function (Raffaello) { / / Usa Raphael qui proprio come si farebbe fuori YUI var = Carta Raffaello ('myPaper', 500, 500); }); });
Se si utilizza plugin RaphaelJS, specificare i loro percorsi in un array e inviare che come primo parametro nella Y.Raphael () utilizzano () funzione.:
YUI ({gallery: 'gallery-2010/9/22-20-15'}). Uso ('gallery-raphael', function (Y) { myPlugins var = ['plugins / raphael.awesomePlugin.js', 'I plugins / raphael.wickedPlugin.js']; Y.Raphael (). Utilizzare (myPlugins, function (Raphael) { / / Usa Raphael qui proprio come si farebbe fuori YUI var = Carta Raffaello ('myPaper', 500, 500); / / La 'carta' avranno tutte le nuove funzioni aggiunte dai vostri plugin ora }); });
La biblioteca RaphaelJS viene caricato per primo, poi tutti i plugin specificati sono caricati prima della funzione di callback viene eseguita con l'oggetto Raphael come unico parametro.
Eventi personalizzati
Dopo aver creato uno spazio di disegno con l'oggetto Raphael, allora si può immediatamente scendere al disegno. Quando si chiama metodi come rect , circle , e path sullo spazio disegno, riceverete indietro gli oggetti che rappresentano i vettori SVG. Normalmente, avrete accesso ai loro corrispondenti elementi DOM attraverso il node della proprietà. Ad esempio:
var = Carta Raffaello ('myPaper', 500, 500); var = paper.rect quadrato (0, 0, 100, 100);
Questo crea un oggetto rettangolare vettoriale alle coordinate [0,0] con una larghezza e un'altezza di 100 pixel. È possibile accedere all'elemento sottostante DOM (che è un SVG rect elemento) in questo modo:
var = rectNode square.node; rectNode.onclick = function () { alert ('Congratulazioni, hai cliccato un quadrato!'); };
Se sei un utente appassionato di YUI, si sarebbe probabilmente piacerebbe qualcosa di più di questo. Che ne dite di un costruito in Y.Node come bene? Proprio come il node proprietà si riferisce al HTMLElement dietro l'oggetto in formato SVG, il $node proprietà si riferisce al Y.Node wrapper per tale elemento. Così si può fare cose come questa:
piazza. node.on $ ('mouseover', function () { alert ('Congratulazioni, è possibile spostare il mouse!'); });
Proviamo qualcosa di più complesso ora. L'interazione con un vettore deve essere in grado di causare altri vettori disegnati per aggiornare i loro stili, giusto? Che ne dici di creare delle barre che tutti rendono i loro colori dipende da dove uno con il mouse si trova su un cerchio sulla pagina:
var = Carta Raffaello ('rcanvas', 600, 800); . var circ = paper.circle (350, 200, 100) attr ({fill: 'rosa', l'ictus: 'nero'}); / / Premendo un gruppo di rettangoli in un array var i = 0; rettangoli = []; for (; i <10; i + +) { rectangles.push (paper.rect (0, 40 * i, 200, 20) attr ({fill: 'rosso', l'ictus: 'giallo'}.)); } / / Scorrendo i rettangoli, aggiungendo gestori specifici mouseMove cerchietto per ogni Y.Array.each (rettangoli, la funzione (rect, index) { var i = index + 1; circ. node.on $ ('mouseMove', function (evt) { / / Il colore di riempimento è dinamica, dipende dalla posizione di questo rettangolo / / Nella matrice e la posizione del mouse 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 + in alto, y = evt.clientY - top; rosso = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6, verde = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * I / 6), blu = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6; rect.attr ('riempire', 'rgb (' + rosso + ',' + verde + ',' + blu + ')'); }); });
Questo esempio è in esecuzione qui , ma come potete vedere nelle istantanee di sotto, il colore di ciascuna barra dipende dalla posizione del mouse sopra il cerchio così come l'ordine del bar.
A seconda di dove il cursore del mouse si trova sopra il cerchio, i colori delle barre cambiare individualmente.
Così si può vedere che $node è una scorciatoia utile, ma niente di spettacolare. Sarebbe veramente fantastico se ogni oggetto creato con SVG RaphaelJS poteva sparare eventi personalizzati . Ciò consentirebbe gli elementi di disegno individuali per generare eventi personalizzati, e tutto ciò che sulla pagina poteva ascoltare e rispondere. Ciò può essere utile in molti modi. Per cominciare, fornisce ricche interazioni fra i vostri disegni. Interazioni dell'utente con un vettore possono ora comunicare eventuali altri vettori dell'interazione on demand. Questo significa che è possibile generare eventi programatically dai tuoi disegni, quando siano soddisfatte determinate condizioni. Questo non solo consente di notificare i vostri disegni da altri vettori, ma qualcosa nella pagina può ascoltare dentro
var = Carta Raffaello ('rcanvas', 600, 800); . var circ = paper.circle (350, 200, 100) attr ({fill: 'rosa', l'ictus: 'nero'}); / / Making array di rettangoli e cerchi var i = 0, = [] rettangoli, cerchi = []; for (; i <10; i + +) { rectangles.push (paper.rect (0, 40 * i, 40 * i, 20) attr ({fill: 'rosso', l'ictus: 'giallo'}.)); circles.push (paper.circle (0,0,20) nascondere ().); } Y.Array.each (rettangoli, la funzione (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 + in alto, y = evt.clientY - top; newwidth = (((256 * x) / (2 * circ.attrs.r)) -1) * I / 6, rosso = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6, verde = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * I / 6), blu = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6; / / Questa volta, non solo cambiando il colore, ma anche la larghezza rettangolo rect.attr ({ larghezza: newwidth, fill: 'rgb (' + rosso + ',' + verde + ',' + blu + ')' }); / / Cottura evento personalizzato per notificare che la larghezza rettangolo è cambiato rect.fire ('width-cambiato', {width: newwidth, fonte: rect, nell'ordine: index}); }); / / Ogni rettangolo ottiene un listener che spara sulla larghezza cambiato rect.on ('width-cambiato', function (evt) { attrs var = evt.source.attrs; / / Ottiene il cerchio corrispondente e spostarlo verso l'estremità destra del rettangolo cerchi [evt.order]. attr ({ cx: attrs.x + attrs.width, CY: attrs.y, fill: 'cornflowerblue' .}) Show (); }); });
Date un'occhiata a questo esempio, in esecuzione qui . Si può anche vedere dalla snapshot qui sotto che i cerchi sono in fase di elaborazione sulle estremità destra del rettangolo. Questo sta avvenendo in risposta a cottura evento personalizzato ogni rettangolo individuo, essere catturati da un gestore che sposta il cerchio in una posizione relativa alle caratteristiche attuali del rettangolo.
Questo apre alcune interessanti per possiblities RaphaelJS all'interno YUI3. Per esempio, cosa succederebbe se potessimo creare un gruppo di forme vettoriali con il gruppo stesso sia l'entità che genera gli eventi al mondo esterno? Internamente, ogni disegno vettoriale in grado di comunicare con il suo contenitore tramite eventi personalizzati, e il contenitore sarebbe prendere decisioni su quali dati si spara al mondo esterno. Questo apre l'idea di completamente incapsulati, i controlli interattivi SVG.
Riassunto
Con l'ascesa di HTML5 e le sue tecnologie satellitari, ci sono opzioni in più tanti altri che Flash per le interazioni ricchi. Idealmente, tutti gli elementi vectored della pagina devono essere pienamente accessibili e standardizzato. Questo apre possiblities bello per noi creare accessibili, controlli web standard senza ricorrere a Flash. SVG è un'opzione attraente perchè ogni vettore tracciato sulla pagina è sostenuta da un nodo DOM che possiamo modificare con YUI come qualsiasi altro nodo DOM. Questo è ciò che consente al modulo Galleria RaphaelJS per aumentare tutti gli oggetti SVG essere creati da RaphaelJS, e che è una chiave per una ricca interazione con questi elments da altre parti della pagina.
Condividi ed estendere: Segnalibro con Del.icio.us | Digg it! | reddit!
9 commenti
Siamo spiacenti, il commento forma è chiusa in questo momento.

Copyright © 2006-2012 Yahoo! Inc. Tutti i diritti riservati. Privacy Policy - Termini di servizio
Powered by WordPress su Yahoo! Web Hosting .


Se guardate l'interno di Raffaello, un po 'più di un terzo le offerte di codice con VML, con circa lo stesso importo per SVG. C'è qualche possibilità per ottenere il caricamento condizionale YUI a lavorare qui o c'è licensing / quantità di barriere sforzo nell'ottenere Raphael stesso diviso fuori e ospitato? (Vantaggio collaterale di combo realmente carico di lavoro)
Commento di Karl G - 27 Settembre 2010 #
Due cose:
1) Raphael è un wrapper per SVG * e * VML e include solo le cose che funzionano in entrambi. Quando si incoraggiano le estensioni, non si avvertono gente che molte volte si ottiene un errore in IE. Se a loro non importa, va bene, ma si dovrebbe mettere in guardia.
2) Stai invitando la gente a un mondo di dolore nel raccomandare l'accesso al. Nodo. Un certo numero di operazioni (che cambia ad ogni nuova versione e tra SVG / VML) sì che il nodo da ricreare, in modo che i gestori di eventi e la vostra Y.Node saranno persi o fare riferimento a un oggetto eliminato. . Infine, il contenuto del nodo differiscono sulla piattaforma e non è solo un singolo nodo - soprattutto se si considera il testo, in cui si ottiene almeno un oggetto per carattere - e molte volte, i gestori di eventi del mouse attivare solo l'inchiostro, quando gli utenti si aspettano la cella di essere attivo.
Commento di Clifford Heath - 27 settembre 2010 #
Writeup Grande e demo,
Dato che sei un Y! 'Er a smanettare sul Raphael magari conoscere qualche dettaglio riguardo l'ultima sulla grafica / tracciare gli sforzi per YUI?
Forse qualcosa di costruito sulla cima di Raphael?
Io sono un fan di Raffaello, ma la loro biblioteca classifiche lascia un po 'a desiderare, così come alcuni degli esempi grafico prime creati con out-o-box Raphael sono il modo più funzionale / interactive
Mi piacerebbe vedere qualche Y! js magica spruzzata in questo settore
Commento di Nate - 27 Settembre 2010 #
Grazie per il feedback.
@ Karl: Se ho capito bene, per la vostra idea di lavorare, avrei dovuto spezzare il file in più parti raphael.js per SVG e VML. Non ho intenzione di toccare la biblioteca RaphaelJS a tutti, in modo che il caricamento sarà probabilmente rimanere così com'è.
@ Clifford: (1) Questo è un buon punto che qualcuno ha portato sulla mailing list Raphaeljs pure. Non sono particolarmente preoccupato per questo modulo gallery di lavoro in IE, ma questo è un lusso. E 'ancora bisogno di essere testato in IE (anche se penso che andrà bene). Ho intenzione di eseguire test in IE per questo modulo la prossima settimana, così saprò per certo. Nel frattempo, metto un avviso sulla pagina del modulo. (2) Grazie per l'heads-up. Mi chiedo se riesco a individuare le operazioni che causano i nodi da ricreato e garantire la nuova proprietà $ nodo è avvolto in Y.Node. Sarò molto più in profondità in immersioni RaphaelJS molto presto, quindi dovrò tenere traccia di questo e speriamo di essere in grado di ricreare la proprietà Node YUI su tutti i nodi-rincara il funzionamento.
@ Nate: Io conosco alcuni dettagli, ma io lascerò la squadra YUI gestire le loro attività. ;). Sono, comunque, molto interessante in spruzzando qualche magia YUI js nel nuovo parco giochi HTML5 grafica.
Commento di Matthew Taylor - 27 settembre 2010 #
Sapete se questa tecnica o una tecnica simile lavorerà con il HTML 5 elemento canvas. Se ho messo un html 5 tela su una pagina web con un rettangolo in esso, è possibile ascoltare gli eventi del mouse sul rettangolo della tela.
Se la mia pagina HTML5 contiene quanto segue.
Questo testo viene visualizzato se il tuo browser non supporta HTML5 Canvas.
var esempio = document.getElementById ('esempio');
var context = example.getContext ('2 d ');
context.fillStyle = "rgb (255,0,0)";
context.fillRect (30, 30, 50, 50);
che ho preso da questo sito:
http://en.wikipedia.org/wiki/Canvas_element
E 'possibile ritirare gli eventi del mouse sulle forme diverse su una tela con YUI. E 'possibile mettere qualcosa come un wrapper Y.Node sul rettangolo della tela simile a quello che stai facendo con elementi in RaphaelJS.
Grazie
Commento di John - 28 Settembre, 2010 #
Tu fai il commento:
"
se ogni oggetto creato con SVG RaphaelJS potrebbe generare eventi personalizzati.
"
È possibile revisionare la serie completa di eventi facilmente preparati con Raphael ...
http://www.irunmywebsite.com/raphael/additionalhelp.php?q=usingelementevents
È possibile assegnarli agli oggetti di Raffaello ...
Commento di Carlo - 28 settembre 2010 #
@ Giovanni: Disegnare con la tag Canvas è un esercizio molto diverso da quello con Raffaello e SVG (VML). Vettori hanno stato, e può essere spostato, animato e interagito con. Disegnare sulla tela è più simile disegno bitmap. Una volta dipingere qualcosa, è bloccato lì come una parte dello sfondo tela, e io non so esattamente come funzionano le interazioni dell'utente.
Commento di Matthew Taylor - 28 Settembre 2010 #
@ Carlo: Sì! Essere in grado di accedere al nodo SVG è bello per questi tipi di interazioni da parte dell'utente, e le mie demo utilizza quelle un po '. Il tipo di eventi personalizzati di cui sto parlando sono eventi al di fuori della portata dei normali eventi DOM.
Nel mio ultimo esempio precedente, si può vedere che ogni rettangolo spara un
width-changedevento ogni volta che vengono ridimensionati. Questi eventi possono essere catturati da nulla sulla pagina che registra per l'evento. Ecco come ogni cerchio viene spostato nella posizione corretta, come i rettangoli vengono ridimensionati.Naturalmente, il catalizzatore di tutto questo è il
mousemoveevento che si verifica sul grande cerchio, che è che tipo di evento penso che si sta facendo riferimento. Per favore mi corregga se ho perso qualcosa.Commento di Matthew Taylor - 28 Settembre 2010 #
@ Giovanni,
E 'possibile, ma disordinato. Devi mantenere un record (hash ie) di punti di interesse, e quindi avere ascoltatori collegati all'elemento tela. Quando si riceve un evento, è necessario prendere le sue coordinate xy e confrontare hash al di punti di interesse, e quindi probabilmente generare un evento personalizzato.
Ho fatto questo con YUI2, creando un grafico radar che consente di fare clic sui punti dati del grafico per ottenere informazioni, e aggiungere i dati cliccando sui segni di graduazione sugli assi. Con excanvas questo funziona su IE, troppo, e ha il vantaggio di essere per me una immagine (anche se IE è più lento).
Tuttavia, questo è tutto con i punti, e un numero abbastanza limitato di punti a che, per verificare se il mouse è un luogo interessante non è troppo lavoro. Ma con le regioni Sospetto che questo sarebbe troppo costoso, e si sarebbe probabilmente vuole pensare a un modo di ascoltare solo per "mousein" (cioè che attraversano una linea) piuttosto che mouseover. Anche con i punti, devi fare un po 'di scansione, in quanto i punti sono i pixel e gli utenti si aspettano di fare clic sul pixel precise non fa per interazione con l'utente facile!
Si può fare "Animazioni", un po ', anche, ma che coinvolge ridisegnare la tela ogni volta, quindi sono più transizioni di animazioni. Ho creato un RenderStack semplice per cose che so non cambierà (assi per esempio) tanto che mi riempiono di chiamate di disegno, e poi il fuoco lo stack, quindi non c'è bisogno di fare la matematica ogni volta. Ma io non sono sicuro di quanto questa differenza fa davvero, è ancora lento in IE e veloce in tutto il resto!
Opaco
Commento di Matt Parker - 29 set 2010 #