No YUI 3 Gallery: Módulo Matt Taylor RaphaelJS
27 de setembro de 2010 às 01:05 por Matthew Taylor | Em Desenvolvimento , YUI 3 Galeria | 9 Comments
Matt Taylor ( @ rhyolight , blog ) trabalha para Yahoo! em um quadro interno JavaScript do lado do navegador. Ele gosta de trabalhar com gráficos, e ele trabalhou com desenhos e animações antes de usar Java2D bibliotecas. Antes de se mudar para o Vale do Silício para trabalhar para Yahoo!, Matt trabalhou na área de St. Louis como um empreiteiro software. Ele também trabalhou extensivamente com Groovy e Grails tecnologias para a SpringSource. Ele foi o principal programador original para o YUI2 baseado GrailsUI plugin para o framework web Grails.
RaphaelJS é uma biblioteca JavaScript poderosa que gerencia SVG desenhos e animações. Ele permite que você facilmente criar telas SVG e desenhar formas básicas e caminhos muito facilmente, mesmo agrupando-os em conjuntos e aplicar transformações a um ou vários vetores. Você pode desenhar formas, manipular imagens, e animar tudo. RaphaelJS fornece uma boa API para criar e modificar elementos SVG com facilidade.
Enquanto a biblioteca é impressionante, mas eu descobri que posso acrescentar algumas características importantes para os elementos da biblioteca RaphaelJS com YUI3. Eu comecei esses esforços com o novo Módulo Galeria RaphaelJS .
Lazy Loading RaphaelJS e Plugins
A primeira característica é o carregamento lento de não só a biblioteca do RaphaelJS, mas qualquer RaphaelJS plugins que você pode precisar. O Módulo Galeria RaphaelJS só vai carregar esses arquivos quando você declarar que vai usá-los dentro de uma sandbox YUI. Por exemplo:
YUI ({Galeria: 'galeria 2010/09/22-20-15'}). Utilizar a função ('galeria-raphael', (Y) { Y. Raphael (). Utilizar (function (Raphael) { / / Use Raphael aqui apenas como você faria fora YUI var = papel Raphael ("myPaper ', 500, 500); }); });
Se você estiver usando plugins RaphaelJS, especificar seus caminhos em uma matriz e enviar esse como o primeiro parâmetro na Raphael Y. () use () função.:
YUI ({Galeria: 'galeria 2010/09/22-20-15'}). Utilizar a função ('galeria-raphael', (Y) { myPlugins var = ['plugins / raphael.awesomePlugin.js', 'plugins / raphael.wickedPlugin.js']; Y. Raphael (). Utilizar (myPlugins, function (Raphael) { / / Use Raphael aqui apenas como você faria fora YUI var = papel Raphael ("myPaper ', 500, 500); / / O 'papel' terá quaisquer novas funções adicionadas por seus plugins agora }); });
A biblioteca RaphaelJS é carregado pela primeira vez, então qualquer plugins especificada são carregados antes sua função callback é executado com o objeto Raphael como o único parâmetro.
Eventos personalizado
Depois de criar um espaço de desenho com o objeto Raphael, então você pode começar imediatamente até o desenho. Quando você chamar métodos como rect , circle e path no espaço de desenho, você vai receber de volta os objetos que representam vetores SVG. Normalmente, você terá acesso aos seus elementos correspondentes DOM através do node propriedade. Por exemplo:
var = papel Raphael ("myPaper ', 500, 500); var quadrado = paper.rect (0, 0, 100, 100);
Isso cria um objeto vetor retangular nas coordenadas [0,0] com uma largura e uma altura de 100 pixels. Você tem acesso ao elemento DOM subjacente (que é um SVG rect elemento) assim:
var rectNode = square.node; rectNode.onclick = function () { alert ('Parabéns, você clicou em um quadrado!'); };
Se você é um ávido usuário de YUI, você provavelmente gostaria de algo mais do que isso. Como cerca de um construído em Y.Node também? Assim como o node de propriedade refere-se à HTMLElement atrás do objeto SVG, o $node de propriedade refere-se ao Y.Node wrapper para esse elemento. Assim, você pode fazer coisas como esta:
quadrados. node.on $ ('mouseover', function () { alert ('Parabéns, você pode mover um rato!'); });
Vamos tentar algo mais complexo agora. Uma interação com um vetor deve ser capaz de causar outros vetores atraídos para atualizar seus estilos, certo? Que tal criar alguns bares que todas as suas cores tornam dependentes de onde um o mouse está localizado em um círculo na página:
var = papel Raphael ("rcanvas ', 600, 800); . var circ = paper.circle (350, 200, 100) attr ({preenchimento: 'rosa', acidente vascular cerebral: 'black'}); / / Empurrando um monte de retângulos em um array var i = 0; retângulos = []; for (; i <10; i + +) { . rectangles.push (paper.rect (0, 40 * i, 200, 20) attr ({preenchimento: 'red', acidente vascular cerebral: 'amarelo'})); } / / Loop através dos retângulos, acrescentando manipuladores mousemove específicos para cada círculo Y.Array.each (retângulos função, (rect, index) { var i = índice + 1; circ. node.on $ ('mousemove', function (evt) { / / A cor de preenchimento é dinâmica, dependente da localização deste rectângulo / / Na matriz, bem como a localização do mouse var lf = circ.attrs.cx - circ.attrs.r, rt = 2 * circ.attrs.r + LF, x = evt.clientX - Se, top = circ.attrs.cy - circ.attrs.r, btm = 2 * circ.attrs.r top +, y = evt.clientY - top; vermelho = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6, verde = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6), azul = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6; rect.attr ('encher', 'rgb ("+ vermelho +', '+ verde +', '+ azul +')'); }); });
Este exemplo é executado aqui , mas como você pode ver nos instantâneos abaixo, a cor de cada barra depende da localização do mouse sobre o círculo, bem como a ordem do bar.
Dependendo de onde o cursor do mouse está localizado sobre o círculo, as cores barra de alteração individualmente.
Então você pode ver que $node é um atalho útil, mas nada espetacular. Seria realmente fantástico se cada objeto SVG que você cria com RaphaelJS podia disparar eventos personalizados . Isso permitiria que os seus elementos de desenho individuais para disparar eventos personalizados, e qualquer coisa na página pode ouvir e responder. Isto pode ser útil em muitas maneiras. Para começar, ele fornece interações ricas entre seus desenhos. Interações do usuário com um vetor agora pode notificar qualquer outros vetores da interação on demand. Isto significa que você pode programaticamente fogo eventos de seus desenhos quando certas condições são cumpridas. Não somente isto permite que os seus desenhos para notificar outros vetores, mas nada na página pode ouvir dentro
var = papel Raphael ("rcanvas ', 600, 800); . var circ = paper.circle (350, 200, 100) attr ({preenchimento: 'rosa', acidente vascular cerebral: 'black'}); / / Fazer arranjos de retângulos e círculos var i = 0, retângulos = [], círculos = []; for (; i <10; i + +) { . rectangles.push (paper.rect (0, 40 * i, i * 40, 20) attr ({preenchimento: 'red', acidente vascular cerebral: 'amarelo'})); circles.push (. paper.circle (0,0,20) hide ()); } Y.Array.each (retângulos função, (rect, index) { var i = índice + 1; circ. node.on $ ('mousemove', function (evt) { var lf = circ.attrs.cx - circ.attrs.r, rt = 2 * circ.attrs.r + LF, x = evt.clientX - Se, 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, vermelho = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6, verde = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6), azul = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6; / / Desta vez, não só mudando a cor, mas também a largura retângulo rect.attr ({ width: NewWidth, preenchimento: 'rgb ("+ vermelho +', '+ verde +', '+ azul +') ' }); / / Disparo de eventos personalizados para notificar que este rectângulo de largura mudou rect.fire ('width-changed', {width: NewWidth, fonte: rect, a ordem: índice}); }); / / Cada retângulo é um ouvinte que incêndios na largura mudado rect.on função ('width-changed', (evt) { var attrs = evt.source.attrs; / / Obtém o círculo correspondente e mova-o para a extremidade direita do retângulo círculos [evt.order]. attr ({ cx: attrs.x + attrs.width, cy: attrs.y, preenchimento: 'cornflowerblue' .}) Show (); }); });
Dê uma olhada neste exemplo rodando aqui . Você também pode ver na fotografia abaixo que círculos estão sendo traçadas nas extremidades direita dos retângulos. Isto está ocorrendo em resposta ao disparo cada retângulo indivíduo evento personalizado, sendo capturado por um manipulador que move o círculo para uma posição em relação aos atributos atuais do retângulo.
Isso abre algumas possibilidades interessantes para RaphaelJS dentro YUI3. Por exemplo, o que se poderia criar um grupo de formas vetoriais com o grupo em si é a entidade que dispara eventos para o mundo exterior? Internamente, cada desenho vetorial poderia se comunicar com seu recipiente através de eventos personalizados, eo recipiente se tomar decisões sobre quais dados ele é acionado para o mundo exterior. Isso abre a idéia de totalmente encapsulado, controles interativos SVG.
Sumário
Com a ascensão do HTML5 e suas tecnologias por satélite, há assim muitas mais opções do que outros Flash para interações ricos. Idealmente, todos os elementos vectored na página deve ser totalmente acessível e padronizado. Isso abre possibilidades maravilhoso para nós para criar acessível, controles web padrão, sem recorrer a Flash. SVG é uma opção atraente porque cada vetor desenhado na página é apoiada por um nó DOM que podemos modificar com YUI como qualquer outro nó DOM. Isso é o que permite que o módulo Gallery RaphaelJS para aumentar todos os objetos SVG sendo criado por RaphaelJS, e que é a chave para uma interação rica com esses elments de outro lugar na página.
Compartilhar e ampliar: Bookmark com del.icio.us | digg it! | reddit!
9 Comments »
RSS feed para comentários a este post.
Deixe um comentário

Copyright © 2006-2011 Yahoo! Inc. Todos os direitos reservados. Política de Privacidade - Termos de Serviço
Powered by WordPress em Yahoo! Web Hosting .



Se você olhar para o interior de Rafael, um pouco mais de um terço dos negócios com o código VML com aproximadamente a mesma quantidade de SVG. Existe alguma chance de carregamento condicional YUI para trabalhar aqui ou há licenciamento / quantidade de barreiras esforço na obtenção de Raphael se dividir para fora e hospedado? (Benefício lateral de carga combo realmente úteis)
Comentário por Karl G - 27 de setembro de 2010 #
Duas coisas:
1) Rafael é um invólucro para SVG * e * VML e inclui apenas as coisas que funcionam em ambos. Quando você incentivar extensões, você não avisar folk que muitas vezes ele irá falhar no IE. Se eles não se importam, tudo bem, mas você deve avisá-los.
2) Você está convidando as pessoas para um mundo de dor em recomendar o acesso ao nó.. Um número de operações (que muda a cada lançamento e entre SVG / VML) fazer com que o nó a ser recriado, de forma manipuladores de eventos e seu nó Y. serão perdidos ou se referir a um objeto excluído. . Finalmente, o conteúdo do nó diferem na plataforma e não é apenas um único nó - especialmente quando você considera o texto, onde você consegue pelo menos um objeto por personagem - e muitas vezes, os manipuladores de eventos mouse gatilho apenas tinta, quando os usuários esperam que a célula para ser ativo.
Comentário por Clifford Heath - 27 de setembro de 2010 #
Writeup grande e demos,
Desde que você está invadindo um Y! 'er afastado em Raphael talvez você conhecer alguns detalhes sobre o mais recente em gráficos / tabelas de esforços para YUI?
Talvez algo construído em cima do Raphael?
Eu sou um fã de Rafael, mas a sua biblioteca de gráficos deixa um pouco a desejar, bem como alguns dos exemplos gráfico criado com a prima-o-caixa de Raphael são a maneira mais funcional / interactive
Gostaria de ver alguns Y! js magia polvilhado nesta área
Comentário por Nate - 27 setembro de 2010 #
Obrigado pelo feedback.
@ Karl: Se eu entendi, para a sua idéia para o trabalho, eu teria que quebrar o arquivo em partes raphael.js para SVG e VML. Eu não estou pensando em tocar a biblioteca RaphaelJS em tudo, assim que a carga provavelmente irá ficar como está.
@ Clifford: (1) Isso é um bom ponto de que alguém educado na lista de discussão Raphaeljs também. Eu não estou particularmente preocupado com este módulo galeria de trabalhar no IE, mas isso é um luxo. Ele ainda precisa de testes no IE (embora eu acho que vai funcionar bem). Eu vou ser a execução de testes no IE para este módulo na próxima semana, então eu vou saber com certeza. Nesse meio tempo, vou colocar um aviso em cima da página do módulo. (2) Thanks for the heads-up. Faz-me pergunto se eu posso identificar as operações que causam a nós para ser recriada e garantir a nova propriedade $ node é envolto em Y. Node. Eu vou ser muito mais profundo mergulho no RaphaelJS muito em breve, por isso vou acompanhar esse e espero ser capaz de recriar a propriedade Node YUI em cada operação nó sobrepor.
@ Nate: Eu sei alguns detalhes, mas eu vou deixar a equipe YUI lidar com os seus negócios lá. ;). Estou, no entanto, muito interessante em alguns aspersão YUI js magia no novo playground gráficos HTML5.
Comentário por Matthew Taylor - 27 de setembro de 2010 #
Você sabe se esta técnica ou uma técnica semelhante irá trabalhar com o elemento de tela HTML 5. Se eu colocar uma tela de 5 html em uma página web com um retângulo nele, é possível ouvir os eventos do mouse no retângulo na tela.
Se a minha página html5 contém o seguinte.
Este texto é exibido se o seu browser não suporta Canvas HTML5.
var exemplo = document.getElementById ('exemplo');
var context = example.getContext ('2 d ');
context.fillStyle = "rgb (255,0,0)";
context.fillRect (30, 30, 50, 50);
que eu tirei de este site:
http://en.wikipedia.org/wiki/Canvas_element
É possível pegar eventos do mouse sobre as diferentes formas em uma tela usando YUI. É possível colocar algo como um invólucro nó Y. no retângulo na tela semelhante ao que você está fazendo com os elementos na RaphaelJS.
Obrigado
Comentário por John - 28 de setembro de 2010 #
Você faz o comentário:
"
se cada objeto SVG que você cria com RaphaelJS podia disparar eventos personalizados.
"
Rever rapidamente o conjunto completo de eventos facilmente preparado com Raphael ...
http://www.irunmywebsite.com/raphael/additionalhelp.php?q=usingelementevents
Você pode atribuí-los a Objetos Raphael ...
Comentário por Charles - 28 de setembro de 2010 #
@ John: Desenho sobre a tag Canvas é um exercício muito diferente do que com Raphael e SVG (VML). Vetores têm estado, e pode ser movido, animado e interagiu com. Desenho sobre a tela é mais parecido com desenho bitmap. Depois de pintar alguma coisa, ele está preso há como uma parte do fundo de lona, e eu não sei exatamente como o usuário trabalhar interações.
Comentário por Matthew Taylor - 28 de setembro de 2010 #
@ Charles: Sim! Ser capaz de acessar o nó SVG é bom para esses tipos de interações com o usuário, e os meus demos usa aqueles um pouco. O tipo de eventos personalizados que estou falando são eventos fora do âmbito normal de eventos DOM.
Em meu último exemplo acima, você pode ver que cada retângulo dispara uma
width-changedevento sempre que eles são redimensionados. Estes eventos podem ser capturados por qualquer coisa na página que registra para o evento. É assim que cada círculo está sendo movido para a posição correta como os retângulos são redimensionados.É claro, o catalisador de tudo isso é o
mousemoveevento que ocorre no grande círculo, o que é que tipo de evento eu acho que você está se referindo. Por favor me corrijam se eu perdi alguma coisa.Comentário por Matthew Taylor - 28 de setembro de 2010 #
@ João,
É possível, mas confuso. Você tem que manter um registro (ou seja, hash) de pontos de interesse, e depois ter ouvintes ligados ao elemento de tela. Quando você começa um evento, você precisa tomar coords é xy e comparar com o seu hash de pontos de interesse, e então, provavelmente, disparar um evento personalizado.
Eu fiz isso com YUI2, criando um gráfico de radar que permite clicar sobre os pontos de dados no gráfico para obter informações, e adicionar dados clicando no tickmarks nos eixos. Com excanvas isso funciona no IE, também, e tem a vantagem de ser para mim uma imagem (embora o IE é mais lento).
No entanto, tudo isso é com pontos, e um número bastante limitado de pontos em que, de modo a verificar se o mouse está em algum lugar interessante não é muito trabalho. Mas com regiões Eu suspeito que isso iria ficar muito caro, e você provavelmente vai querer pensar sobre uma maneira de apenas ouvindo "mousein" (isto é atravessar uma linha), em vez de mouseover. Mesmo com pontos, você tem que fazer alguma verificação, como os pontos são pixels e os usuários esperando para clicar no pixel preciso não fazer para interação com o usuário fácil!
Você pode fazer "animações", uma espécie de, também, mas que envolve redesenhar a tela a cada vez, assim que são as transições mais de animações. Eu criei um RenderStack simples para coisas que eu sei não vai mudar muito (eixos, por exemplo) que eu encher-se com chamadas de desenho de lona, e então o fogo a pilha, então eu não preciso fazer as contas de cada vez. Mas eu não tenho certeza quanta diferença isso realmente faz, ainda é lento no IE e rápido em tudo o mais!
Matt
Comentário por Matt Parker - 29 de setembro de 2010 #