Gráficos vetoriais escaláveis ​​em HTML5. Gráficos vetoriais escaláveis ​​(SVG) - Explorando tags gráficas

Os gráficos vetoriais são amplamente utilizados na impressão. Mas também podemos usá-lo para sites que usam SVG ( Gráfico vetorial escalável - gráficos vetoriais escaláveis). De acordo com a especificação W3.org, SVG é definido como:

Uma linguagem para descrever gráficos bidimensionais em XML. O SVG permite três tipos de objetos: gráficos vetoriais (como caminhos compostos por linhas retas e curvas), imagens e texto.

Embora o SVG tenha sido incluído nas recomendações do W3C desde agosto de 2011, esta tecnologia Praticamente não é utilizado em projetos web, embora apresente uma série de vantagens em relação às imagens raster. Nesta série de lições apresentaremos como trabalhar com elementos SVG em páginas web.

Vantagens do SVG

Independência de resolução

As imagens raster dependem da resolução. Os gráficos assumem uma aparência pouco apresentável quando redimensionados para uma determinada escala. Com os gráficos vetoriais, essa situação é a princípio impossível, pois tudo é representado por expressões matemáticas que são recalculadas automaticamente quando a escala é alterada e a qualidade é mantida em quaisquer condições.

Reduzindo o número de solicitações HTTP

O SVG pode ser incorporado diretamente em um documento HTML usando a tag svg, para que o navegador não precise fazer nenhuma solicitação para exibir os gráficos. Essa abordagem tem um bom efeito nas características de carregamento do site.

Estilos e scripts

A incorporação usando a tag svg também facilita a definição de estilos para gráficos com usando CSS. Você pode alterar as propriedades do objeto, como cor de fundo, transparência, bordas e assim por diante. Os gráficos podem ser manipulados de maneira semelhante usando JavaScript.

Fácil de editar e animar

Objetos SVG podem ser animados usando CSS ou JavaScript. Objetos SVG também podem ser modificados usando um editor de texto.

Tamanho de arquivo menor

SVG tem um tamanho de arquivo menor em comparação com gráficos raster.

Formas SVG básicas

De acordo com a especificação, podemos desenhar diversas formas básicas: linha, polilinha, retângulo, círculo, elipse. Todos os elementos devem ser inseridos na tag ... . Vejamos os elementos básicos em detalhes.

Linha

Para exibir uma linha em SVG, use o elemento . Ele desenha um segmento para o qual é necessário determinar dois pontos: o início e o fim.

O início do segmento é determinado pelos atributos x1 e y1 , e o ponto final é determinado pelas coordenadas nos atributos x2 e y2 .

Existem também outros dois atributos (traço e largura do traçado) que são usados ​​para definir a cor e a largura da linha, respectivamente.

Este objeto é semelhante a , mas usando o elemento Você pode desenhar várias linhas ao mesmo tempo.

Elemento Contém o atributo points, que é usado para especificar as coordenadas dos pontos.

O retângulo é desenhado usando o elemento . Você precisa determinar a largura e a altura.

Para exibir um círculo usamos o elemento . No exemplo a seguir, criamos um círculo com raio de 100, que é definido no atributo r:

Os dois primeiros atributos cx e cy definem as coordenadas do centro. No exemplo acima, definimos o valor como 102 para ambas as coordenadas. O valor padrão é 0.

Para exibir uma elipse usamos o elemento . Funciona da mesma forma que o círculo, mas podemos especificar especificamente os raios x e y usando os atributos rx e ry:

Elemento Exibe formas poliédricas, como triângulo, hexágono, etc. Por exemplo:

Usando um editor de gráficos vetoriais

A saída de objetos SVG simples para HTML é fácil. No entanto, à medida que a complexidade do objeto aumenta, esta prática pode levar a uma grande quantidade de trabalho necessário.

Mas você pode usar qualquer editor de gráficos vetoriais (por exemplo, Adobe Ilustrador ou Inkscape) para criar objetos. Se você tiver uma ferramenta como essa, desenhar os objetos necessários nelas é muito mais fácil do que codificar gráficos em uma tag HTML.

Você pode copiar comandos gráficos vetoriais de um arquivo para um documento HTML. Ou você pode incorporar o arquivo .svg usando um dos seguintes elementos: embed , iframe e object .

O resultado será o mesmo.

Suporte ao navegador

SVG tem bom suporte na maioria dos navegadores modernos, com exceção do IE versão 8 e anteriores. Mas o problema pode ser resolvido usando a biblioteca JavaScript. Para facilitar seu trabalho, você pode usar a ferramenta ReadySetRaphael.com para converter o código SVG para o formato Raphael.

Primeiro, baixamos e incluímos a biblioteca no documento HTML. Em seguida, carregamos o arquivo .svg, copiamos e colamos o código resultante na função após o carregamento:

Na tag body colocamos o seguinte elemento div com o identificador rsr .

E está tudo pronto.

No próximo tutorial da série, veremos como estilizar objetos SVG em CSS.

(Artigo de revisão após a conferência sobre desenvolvimento de software em Yekaterinburg e outras apresentações. Versão em vídeo do relatório em Yekaterinburgveja em techdays.ru )

O que são HTML5 Canvas e SVG?

Tela HTML5

– o elemento é uma tela para desenhar gráficos raster. Na verdade, é um bloco vazio dadas dimensões, no qual você pode desenhar usando APIs especiais para JavaScript.

A API inclui 45 métodos especiais e 21 atributos usados ​​para exibir primitivos gráficos, definir estilos, transformações, acessar pixels individuais e projetar imagens e vídeos.

Eu mesmo O elemento é definido diretamente na especificação HTML5. A API para isso é descrita em um documento separado - HTML Canvas 2D Context.

SVG

A música pode ser divertida

Lindo jogo de visualização musical e gráfica (http://musiccanbefun.edankwan.com/).

Exemplos de diagramas em SVG

Diagrama do esqueleto humano, sistema periódico de elementos químicos e sistema respiratório (http://ie.microsoft.com/testdrive/Graphics/RealWorldDataAndDiagrams/Default.xhtml).

Mapas Yandex

Um exemplo mais próximo da vida real é desenhar rotas usando SVG (se o navegador suportar). Veja também a palestra “Mapas e SVG” do nosso HTML5 Camp.

Mais exemplos:

  • Beleza da Web http://www.beautyoftheweb.com/ – sites reais do mundo real
  • Dev: unplugged http://contest.beautyoftheweb.com/ – projetos participantes da competição de aplicativos HTML5

Diferença entre Canvas e SVG

Em vários cenários, tanto o Canvas quanto o SVG podem ser mais adequados para renderização dinâmica de gráficos - voltaremos a esse assunto no final. Por enquanto, vamos dar uma olhada nas principais diferenças entre um e outro:

Tela SVG
Formatar Raster Vetor
Dimensionamento
Acesso

Acesso individual a pixels (RGBA)

Acessando elementos individuais (DOM)

Indexabilidade e acessibilidade

Apenas o raster final é visível (você não pode selecionar formas, texto, etc.) - ruim para acessibilidade

Você pode visualizar a estrutura (por exemplo, retirar todo o texto)

Estilização

Os estilos visuais são definidos durante a renderização por meio da API

Os estilos visuais são definidos por atributos, você pode incluir CSS

Programação

API JS para trabalhar com primitivos

DOM para trabalhar com elementos

Atualizar

Para atualizar - redesenhar ou redesenhar completamente

É possível alterar elementos individuais

Eventos

Não existe uma maneira fácil de lidar com eventos do mouse. Os objetos sob o cursor devem ser definidos manualmente.

Os eventos do mouse são facilmente despachados através do DOM e processados ​​automaticamente.

Integração de código

Código JS separado do Canvas

Você pode incluir JS dentro

Essas diferenças devem ser levadas em consideração ao utilizar uma ou outra tecnologia para visualização de dados. Por exemplo, desenhar um gráfico de uma função pode ser mais fácil com o Canvas, enquanto exibir dicas de ferramentas (identificar o objeto sob o ponteiro do mouse) é mais fácil com o SVG.

Na prática, porém, já existem diversas bibliotecas prontas para visualização de dados que neutralizam parcialmente essas diferenças.

Não vou entrar no básico de como trabalhar com cada uma das tecnologias, como introdução recomendo o relatório de Vadim Makeev (Opera) do HTML5 Camp “Gráficos Dinâmicos: Canvas e SVG”.

Veja também os relatórios MIX 2011:

Processando imagens com Canvas

Uma das características notáveis ​​do Canvas é que esta tecnologia fornece acesso pixel por pixel aos dados exibidos e permite projetar vários elementos gráficos, incluindo vídeo, na tela.

Um bom exemplo de onde isso é necessário é uma tarefa de processamento/análise de imagem.

Processing.js oferece duas abordagens para descrever a visualização: código intermediário, que é posteriormente analisado pela própria biblioteca (em um arquivo separado ou dentro de uma página) e código JavaScript explícito.

Por exemplo, para desenhar um fractal do conjunto de Mandelbrot, você pode usar a opção indicada na página com o exemplo correspondente e o seguinte código JavaScript:

var xmín = -2,5; var ymin = -2; var wh = 4; função sketchProc (processamento) (processamento.setup = função () (processamento.size(200, 200); processamento.noLoop(); ); processamento.draw = função () (processamento.loadPixels(); var maxiterations = 200; var xmax = xmin + wh; var ymax = ymin + wh; var dx = (xmax - xmin) / (processing.width); var dy = (ymax - ymin) / (processing.height); var y = ymin; para (var j = 0; j< processing.height; j++) { var x = xmin; for (var i = 0; i < processing.width; i++) { var a = x; var b = y; var n = 0; while (n < maxiterations) { var aa = a * a; var bb = b * b; var twoab = 2.0 * a * b; a = aa - bb + x; b = twoab + y; if (aa + bb >16.0) ( quebra ; ) n++; ) if (n == maxiterações) processamento.pixels.setPixel(i+j*processing.width, 0); senão processamento.pixels.setPixel(i+j*processing.largura, processamento.color(n*16 % 255)); x += dx; ) y += dy; ) processamento.updatePixels(); ); ) var canvas = document.getElementById("myCanvas" ); var p = novo Processamento(canvas, sketchProc);

Você pode tentar aqui: http://silverbook.ru/projects/html5datavisualization/demo3-processingjs.htm (copie o código, cole-o no console e execute).

Kit de ferramentas JavaScript InfoVis (JIT)

Para exibir os dados, o JIT considera os valores brutos como JSON:

var json = ( "rótulo": ["rótulo A", "rótulo B", "rótulo C", "rótulo D"], "valores": [("rótulo": "data A", "valores":) , ( "rótulo" : "data B" , "valores" : ), ( "rótulo" : "data E" , "valores" : ), ( "rótulo" : "data F" , "valores" : ), ( "rótulo" : "data D" , "valores" : ), ( "rótulo" : "data C" , "valores" : )] ); var pieChart = new $jit.PieChart(( injectInto: "infovis" , animate: true , offset: 30, sliceOffset: 0, labelOffset: 20, type: "stacked:gradient" , showLabels:true , resizeLabels: 7, Label: ( tipo: "Native" , tamanho: 20, família: "Arial" , cor: "branco" ), Dicas: ( enable: true , onShow: function (tip, elem) ( tip.innerHTML = " " + elemento.nome + ": " + elem.valor; ) ) ));

basta chamar a renderização:

PieChart.loadJSON(json);

Minigráficos jQuery

Visualização em um mapa usando SVG

Vamos passar para SVG e começar com um exemplo simples. Imagine que você precisa exibir alguns dados em um mapa de regiões, qual a maneira mais fácil de fazer isso?

Se você tiver um mapa pronto no formato SVG (peguei o mapa da Rússia no site da Wikipedia), isso é feito de maneira muito simples - basta que cada região tenha seu próprio id exclusivo dentro do documento SVG, então insira o mapa como um SVG embutido e pinte-o com um código simples na cor desejada:

var SverdlovskOblast = document.getElementById("SverdlovskOblast"); SverdlovskOblast.style.fill = "#fe3300" ;

Se você fizer a mesma coisa em loop, poderá colorir não apenas uma área, mas uma região inteira ou até mesmo um país inteiro:

var data = [(id: "KurganOblast" , valor: 30), (id: "SverdlovskOblast" , valor: 200), (id: "TyumenOblast" , valor: 75), (id: "KhantiaMansia" , valor: 100 ), (id: "YamaloNenetsAutDistrict" , valor: 20), (id: "ChelyabinskOblast" , valor: 150)]; para (var eu = 0; eu< data.length; i++) { var item = data[i]; var region = document.getElementById(item.id); region.style.fill = RGBtoHex(item.value, 0, 0); }

Bibliotecas para visualização de dados usando SVG

Como já disse, tanto o Canvas quanto o SVG são adequados para resolver o problema tradicional de visualização de dados numéricos na forma de gráficos e tabelas. Em ambos os casos, isso pode ser feito facilmente usando as bibliotecas apropriadas.

Já vimos exemplos com Canvas, vamos agora dar uma olhada em várias bibliotecas para trabalhar com SVG. (Esta também não é uma lista exaustiva, mas soluções populares e de alta qualidade.)

Rafael

Para adicionar um simples gráfico de pizza O seguinte código é suficiente:

var r = Rafael("gráfico", 640, 480); var pizza = rgpiechart(320, 240, 100, );

Com algumas etapas adicionais, você pode adicionar uma legenda, legendas de gráficos e dicas de ferramentas interativas:

var r = Rafael("gráfico", 640, 480); r.g.txtattr.font = "12px "Fontin Sans", Fontin-Sans, sem serifa"; rgtext(320, 100, "Gráfico de pizza interativo").attr(("tamanho da fonte": 20)); var torta = rgpiechart(320, 240, 100, ,
(legenda: ["%%.%% – Usuários Corporativos" , "Usuários IE" ], legendpos: "west" ,
href: ["http://raphaeljs.com" , http://g.raphaeljs.com]});
pie.hover (função () (este .sector.stop(); este .sector.scale(1.1, 1.1, este .cx, este .cy); if (este .label) (este .label.stop(); this .label.scale(1.5); this .label.attr(("font-weight" : 800)); ) ), function () ( this .sector.animate((scale: ), 500, "bounce" ) ; if (this .label) ( this .label.animate((escala: 1), 500, "bounce" ); this .label.attr(("peso da fonte" : 400)); ) ));

Outros tipos de gráficos podem ser produzidos de forma semelhante, utilizando métodos apropriados. Veja exemplos diretamente no site da extensão http://g.raphaeljs.com/

Highcharts JS

A API da biblioteca facilita bastante a geração de um gráfico usando dados em JSON:

var chart1 = new Highcharts.Chart(( gráfico: ( renderTo: "charts" , defaultSeriesType: "bar" ), título: ( texto: "Consumo de Frutas" ), xAxis: (categorias: ["Maçãs" , "Bananas" , "Laranjas" ]), yEixo: ( título: ( texto: "Fruta comida" ) ), série: [( nome: "Jane" , dados: ), ( nome: "John" , dados: )] ));

Com um script um pouco mais complexo, você pode especificar detalhes adicionais, por exemplo, exibir uma legenda, configurar dicas de ferramentas:

var gráfico = new Highcharts.Chart(( gráfico: ( renderTo: "charts" , defaultSeriesType: "area" , spacingBottom: 30 ), título: ( texto: "Consumo de frutas *" ), subtítulo: ( texto: "* O consumo de banana de Jane é desconhecido", flutuante: true , alinhar: "direita" , verticalAlign: "bottom" , y: 15 ), legenda: ( layout: "vertical" , alinhar: "esquerda" , verticalAlign: "topo" , x: 150, y: 100 , flutuante: true , borderWidth: 1, backgroundColor: "#FFFFFF" ), xAxis: (categorias: ["Maçãs" , "Peras" , "Laranjas" , "Bananas" , "Uvas" , "Ameixas" , "Morangos" , "Raspberries" ] ), yAxis: ( title: ( text: "Y-Axis" ), rótulos: ( formatador: function () ( return this .value; ) ) ), dica de ferramenta: ( formatador: function () ( return " "+este.série.nome+"
" + this .x +": " + this .y; ) ), plotOptions: ( area: ( fillOpacity: 0.5 ) ), série: [( nome: "John" , dados: ), ( nome: "Jane" , dados: )] ));

Se necessário, você pode substituir os estilos padrão pelos seus próprios.

Você deve escolher Canvas ou SVG?

Como pode ser visto nos exemplos acima, ambas as tecnologias são frequentemente adequadas para tarefas de visualização de dados. Muitas coisas são feitas de maneira semelhante. Nos casos em que a saída pixel por pixel é necessária, o Canvas é obviamente mais adequado. Onde o diagrama se divide em objetos individuais nos quais você precisa manter a interatividade, o SVG é mais adequado.

A tela é melhor
  • Edição de gráficos raster
  • Adicionando efeitos a gráficos/vídeo
  • Geração de gráficos raster (visualização de dados, fractais, gráficos de funções)
  • Análise de imagem
  • Gráficos do jogo (sprites, plano de fundo, etc.)
SVG é melhor
  • Interfaces escaláveis
  • Interfaces interativas
  • Diagramas, esquemas
  • Edição de imagens vetoriais

Na forma gráfica isso pode ser representado da seguinte forma:

Por fim, outro aspecto importante que também é importante considerar na hora de escolher uma tecnologia é o desempenho de renderização ao utilizar Canvas e SVG:

Na prática, o Canvas funciona melhor quando a área de desenho é pequena e em um grande número de objetos; o SVG é mais adequado quando é necessário dimensionar ou exibir em uma tela grande e não muito grande. grandes quantidades objetos exibidos por vez.

Esta conclusão decorre do relatório do presidente do conselho da Bashneft, divulgado à assembleia geral de acionistas da empresa, cuja cópia foi recebida pelos editores.

Resulta do documento que, como resultado da exploração geológica, foram descobertas em 2018 81 jazidas produtivas com reservas de 19 milhões de toneladas.

Ao mesmo tempo, a utilização de medidas geológicas e técnicas altamente eficazes e a introdução de tecnologias modernas para a recuperação melhorada de petróleo permitiram manter a produção de petróleo em campos maduros na Bashkiria ao nível de 2017 - 15 milhões de toneladas. O volume total de produção neste período foi de 17,3 milhões de toneladas de petróleo.

O relatório observa ainda que a criação de uma cadeia produtiva única com o complexo de produção e refino da Rosneft aumentou a eficiência das refinarias de Ufa e levou à redução dos custos operacionais e logísticos. Em particular, a produção de gasolina Euro-6 foi dominada e a produção industrial de betume rodoviário foi iniciada de acordo com o novo GOST.

O volume de vendas no varejo nos postos de gasolina Bashneft durante os 11 meses de 2018 aumentou 13,2% em comparação com o mesmo período do ano passado e atingiu 1,7 milhão de toneladas.

Para implementar a estratégia petroquímica, a produção petroquímica está a ser modernizada. Assim, em maio de 2018, a Ufaorgsintez colocou em operação nova instalação produção de cumeno - matéria-prima para a produção de tintas, solventes, polímeros diversos utilizados na indústria automotiva, médica e farmacológica. O próximo passo é a reconstrução do complexo de produção de aromáticos em Ufaneftekhim e a construção de novas fábricas de produção de olefinas em Ufaorgsintez.

O lucro operacional consolidado dos nove meses de 2018 aumentou 22,6% em comparação com o mesmo período de 2017 e totalizou 135,5 bilhões de rublos. O lucro líquido da Bashneft atingiu 74,6 bilhões de rublos, 73,5% maior que no ano passado.

Durante o terceiro trimestre, a Bashneft pagou aos acionistas dividendos anunciados na assembleia anual de junho de 2018 no valor de 28,2 bilhões de rublos, e o volume total de dividendos pagos desde o início do ano foi de 43 bilhões de rublos.

Ao mesmo tempo, o nível de dívida líquida da empresa diminuiu e em 30 de setembro de 2018 era de 40,1 bilhões de rublos (na mesma data de 2017, esse valor era de 104,7 bilhões de rublos).

Ao mesmo tempo, durante o período do relatório, as contribuições fiscais para o orçamento do Bascortostão, tendo em conta o pagamento único do imposto sobre o rendimento, aumentaram 1,5 vezes em comparação com o mesmo período do ano passado e ascenderam a 50,5 mil milhões de rublos.

Existe uma tag para incluir uma imagem em um local específico da página. . Esta tag possui um parâmetro obrigatório: SRC="", e vários parâmetros opcionais. O parâmetro SRC="" informa ao navegador onde procurar o gráfico e deve ter como valor a URL do recurso onde o arquivo gráfico está localizado. No caso mais simples, este arquivo será colocado no diretório raiz ou na pasta IMG do seu site. Parâmetros opcionais:

O parâmetro ALT="" contém como valor uma inscrição informando sobre o conteúdo da imagem para aqueles visitantes cujos navegadores não suportam gráficos ou trabalham em modo gráfico desabilitado. A mesma inscrição aparece quando você passa o mouse sobre a imagem.

Os parâmetros WIDTH="" HEIGHT="" têm como valores as dimensões da imagem em largura e altura em pixels. É aconselhável especificar esses parâmetros no código da página para que o navegador deixe espaço para a imagem com antecedência, assim, ao carregar, a página “se contorcerá” menos. Além disso, esses parâmetros podem ser usados ​​para ajustar o tamanho da imagem na janela do navegador.

O parâmetro BORDER="" desenha uma borda ao redor da imagem. O valor é um número que indica a largura do quadro em pixels.

O parâmetro ALIGN= determina a posição da imagem na página, podendo assumir os valores TOP - alinha a borda superior da imagem ao elemento mais alto da linha atual, TEXTTOP - alinha a borda superior da imagem ao elemento de texto mais alto da linha atual, MIDDLE - alinha o meio da imagem com a linha base da linha atual, ABSMIDDLE - alinha o meio da imagem com o meio da linha atual. BASELINE ou BOTTOM - alinha a borda inferior da imagem com a linha de base da linha atual, ABSBOTTOM - alinha a borda inferior da imagem com a borda inferior da linha atual, HSPACE= - determina o recuo horizontal, VSPACE= - determina o recuo vertical.

Sintaxe da etiqueta:

Relógio

A linha em execução é especificada pela tag .

Os atributos desta tag são bgcolor - cor de fundo da linha em execução, altura - altura da linha, largura - largura da linha.

Direção - define a direção do movimento da linha rastejante - direção = "esquerda" (direita, para cima, para baixo) - movimento para a esquerda (direita, para cima, para baixo).

Comportamento - comportamento da linha - behavior="scroll" (slide, alternativo). Rolagem - rolagem normal (você não precisa especificá-la, é o padrão)



Slide - rolando com uma parada, a linha vai até a borda e para. Se você usar o parâmetro loop simultaneamente com behavor="slide", a linha rolará o número definido de vezes e parará na borda. Alternar - a linha se moverá de ponta a ponta.
Scrollamount - velocidade de movimento da linha, scrollamount="1". Pode assumir valores de 1 a 10. 1 é o movimento mais lento, 10 é o mais rápido.

Sintaxe da etiqueta: texto

Os navegadores modernos podem reproduzir arquivos de vídeo e áudio em vários formatos. Para fazer isso, eles usam players integrados (plug-in, controles ActiveX) ou programas de player externos. Você pode inserir som ou vídeo em um documento HTML usando várias tags:

- para inserir som de fundo;

- inserir vídeo em formato AVI;

- para inserção de arquivos de áudio e vídeo;

- para inserir arquivos de áudio e vídeo.

Ao decidir inserir áudio e/ou vídeo em um documento HTML, tenha em mente que os arquivos correspondentes são bastante grandes. Os arquivos mais populares na Internet agora são MP3, WMA, AIFF, AU, RealAudio (com extensões ra e ram), MP4, arquivos de áudio MIDI e formatos de vídeo MPEG, MOV. O formato de áudio WAV e o formato de vídeo AVI raramente são usados ​​na Internet.