Logo do siteSilhueta da face do Maujor seguida do texto Maujor o dinossauro das CSS

Menu hamburger Três barras horizontais na cor laranja destinadas a ser clicada para abrir o menu menu do site

Suporte para canvas no IE

Publicado em: 2009-12-17 — 29.610 visualizacoes

Nesta matéria vou mostrar como obter um gráfico tipo pizza a partir de uma tabela de dados.

Vamos usar o elemento canvas da HTML 5 e um código JavaScript para atingir nosso propósito. É sabido que o Internet Explorer, versões atuais, não suportam o elemento canvas, mas a novidade nesta matéria é apresentar um script denominado Explorer Canvas que faz o IE suportar o elemento canvas.

Observe na figura a seguir um screenshot da renderização do que iremos obter no final da matéria.

grafico de pizza e tabela

Visite uma página demonstração para a técnica descrita.

E aqui estão os ingredientes da receita:

  1. Um elemento canvas;
  2. Uma tabela de dados;
  3. JavaScript para extrair os dados da tabela;
  4. JavaScript para plotar os dados em canvas.

Elemento canvas

1.  
2.  
3.<canvas id="canvas" width="300" height="300"></canvas>

Tabela de dados

01.<table id="mydata">     
02. <thead>
03.  <tr>
04.    <th>Linguagem</th>
05.    <th>Valor</th>
06.  </tr>
07. </thead>
08. 
09. <tbody>   
10.  <tr>
11.    <td>JavaScript</td
12.    <td>100</td>
13.  </tr>     
14.  <tr>
15.    <td>CSS</td
16.    <td>200</td
17.  </tr>     
18.  <tr>
19.    <td>HTML</td
20.    <td>300</td
21.  </tr>     
22.  <tr>
23.    <td>PHP</td
24.    <td>50</td
25.  </tr>     
26.  <tr>
27.    <td>MySQL</td
28.    <td>30</td
29.  </tr>     
30.  <tr>
31.    <td>Apache</td
32.    <td>10</td
33.  </tr>     
34.    <tr><td>Linux</td
35.    <td>30</td
36.  </tr>
37. </tbody
38.</table>

JavaScript para extrair os dados da tabela

Vamos começar com algumas configurações. Iremos informar ao script qual é o id da tabela de dados, o id do elemento canvas e a coluna que contém os dados:

1.  
2.  
3.// a tabela e o elemento canvas na marcação HTML  
4.var data_table = document.getElementById('mydata'); 
5.var canvas = document.getElementById('canvas'); 
6.var td_index = 1; // qual td comtém os dados

A seguir vamos selecionar todas a linhas da tabela (tr’s) e criar um loop por elas selecionando suas células (td’s). Continuando adicionaremos os dados da tabela em um array e obteremos o total de dados na coluna. Criamos um array de cores randômicas. Colorimos cada uma das linhas da tabela com uma cor randômica selecionada (veremos a função para selecionar a cor, denominada getColor(), logo adiante)

01.  
02.  
03.var tds, data = [], color, colors = [], value = 0, total = 0; 
04.var trs = data_table.getElementsByTagName('tr'); // todas as tr's  
05.for (var i = 0; i < trs.length; i++) {     
06.tds = trs[i].getElementsByTagName('td'); // todas as td's
07.          
08.if (tds.length === 0) continue; //  não há td's, vá em frente
09.          
10.// extrair o valor da td e atualizar o total      
11.value  = parseFloat(tds[td_index].innerHTML);     
12.data[data.length] = value;     
13.total += value;
14.         
15.// cor randômica      
16.color = getColor();     
17.colors[colors.length] = color; // armazena      
18.trs[i].style.backgroundColor = color; // colorir a tr  
19.}

JavaScript para plotar os dados em canvas

Chegou a hora da parte divertida, desenhar! Primeiro precisamos criar o objeto contexto para canvas. A seguir estabelecer o raio e o centro do gráfico de pizza, tudo isto tendo em vista as dimensões de canvas:

1.  
2.  
3.// estabelecer contexto e definir raio e centro  
4.var ctx = canvas.getContext('2d'); 
5.var canvas_size = [canvas.width, canvas.height]; 
6.var radius = Math.min(canvas_size[0], canvas_size[1]) / 2; 
7.var center = [canvas_size[0]/2, canvas_size[1]/2];

A seguir vamos criar um loop pelos dados da tabela e colorir os segmentos do gráfico. Para desenhar um segmento usaremos os seguintes métodos do objeto contexto:

  • beginPath() – inicia um setor;
  • moveTo() – coloca o ponteiro de desenho no centro;
  • arc() – desenha um arco de círculo;
  • lineTo() – termina o setor desenhando uma linha de volta ao centro;
  • closePath() e fill() fecha o setor e preenche com uma cor já selecionada.

Observe a seguir o código para o desenho:

01.  
02.  
03.var sofar = 0; // monitora o andamento do script  
04.// loop por data[]  
05.for (var piece in data) {       
06.var thisvalue = data[piece] / total;       
07.ctx.beginPath();     
08.ctx.moveTo(center[0], center[1]);
09.// centro do gráfico      
10.ctx.arc(  // desenha próximo arco          
11.center[0],         
12.center[1],         
13.radius,        
14. Math.PI * (- 0.5 + 2 * sofar), // -0.5 define o início no topo          
15.Math.PI * (- 0.5 + 2 * (sofar + thisvalue)),          false      );       
16.ctx.lineTo(center[0], center[1]); // linha de retorno ao centro     
17. ctx.closePath();     
18.ctx.fillStyle = colors[piece];    // cor      
19.ctx.fill();       
20.sofar += thisvalue; // incrementa o andamento do script  
21.}

Função utilitária

O script da função para definir uma cor randômica é mostrado a seguir:

1.// gera uma cor randômica      
2.function getColor() {         
3.var rgb = [];         
4.for (var i = 0; i < 3; i++) {             
5.rgb[i] = Math.round(100 * Math.random() + 155) ; // [155-255] = lighter colors          
6.}         
7.return 'rgb(' + rgb.join(',') + ')';     
8.}

Isto é tudo! Divirta-se com seu gráfico de pizza 😀

Créditos:
Author: Stoyan Stefanov
URL do artigo original: http://www.phpied.com/canvas-pie/

Desenvolvimento com Padrões Web? Adquira os livros do Maujor
Visite o site dos livros.

Esta matéria foi publicada em: 2009-12-17 (quinta-feira). Subscreva o feed RSS 2.0 para comentários.
Comente abaixo, ou link para https://www.maujor.com/blog/2009/12/17/suporte-para-canvas-no-ie/trackback no seu site.

11 comentários na matéria: “Suporte para canvas no IE”

  1. Casa do Escritório Curitiba-KettyNo Gravatar disse:

    Otimo trabalho

  2. Ana LuizaNo Gravatar disse:

    Obrigada por compartilhar seu conhecimento , parabéns pelo blog

  3. marcelo portoesNo Gravatar disse:

    digo ‘automaticamente’

  4. marcelo portoesNo Gravatar disse:

    function getColor() Muito interessante esta função de cores mas não entendi onde ela busca os arquivos de cores automático

  5. BalançaNo Gravatar disse:

    Obrigado pela dica, valeu. Como sempre nota 1000 seu blog
    Julia

  6. MicoxNo Gravatar disse:

    Ótimo tuto maujor. Valeu.

  7. Carla CamposNo Gravatar disse:

    Parabéns pelo post.

  8. EmersonNo Gravatar disse:

    Obrigado pela dica.

  9. Ramon SamudioNo Gravatar disse:

    Obrigado pela dica.

  10. tixturismoNo Gravatar disse:

    Parabéns pelo blog!

  11. SérgioNo Gravatar disse:

    Isso é ótimo!
    Pena que ainda é arriscado usar isso para sites atuais =/

Comentário:





Teclar "Enter" cria um novo parágrafo. Teclar "Shift + Enter" causa uma quebra de linha.

Subscribe without commenting

topo