Close Menu
Código Simples .NETCódigo Simples .NET
    Facebook X (Twitter) Instagram
    Trending
    • Context engineering: quando o problema deixa de ser prompt e vira arquitetura
    • Clean Code (2ª edição): o que mudou e o que continua valendo
    • Sunk Cost em Arquitetura de Software: como evitar que meses de investimento virem uma armadilha
    • Guia Profissional de Prompting – Domando um ChatGPT Preguiçoso: Como Obter Respostas Completas, Profundas e Confiáveis
    • A Anatomia de um Prompt: Como Falar com a IA Como um Profissional de Tecnologia
    • Conheça os tipos de registros DNS: o guia completo sobre A, AAAA, NS, CNAME, MX, PTR, SOA, TXT, SRV, SPF e muito mais
    • Cache além do básico: por que LRU e TTL precisam andar juntos
    • Quando usar arquitetura modular — e quando não usar
    Facebook X (Twitter) Instagram
    Código Simples .NETCódigo Simples .NET
    Código Simples .NETCódigo Simples .NET
    Home»Dicas»Como criar um diagrama de porcentagens com HTML5 e CSS3

    Como criar um diagrama de porcentagens com HTML5 e CSS3

    Jhonathan SoaresBy Jhonathan Soares13 de abril de 20142 Mins Read Dicas
    Share
    Facebook Twitter LinkedIn WhatsApp Copy Link

    Já não é novidade nenhuma falarmos de HTML5 quando o assunto é desenvolvimento Web. Dos 3 últimos anos pra cá, muitos desenvolvedores dedicam seu tempo a desenvolver cada vez mais componentes que geram algum valor ao cliente de maneira cada vez mais dinâmica.  Hoje vamos aprender a como criar um diagrama ou gráfico igual a este com CSS3 representando seus valores em porcentagem

     

    grafico css3

    Inicialmente vamos utilizar uma biblioteca de vetores bastante simples que nos ajudará a ‘imprimir’ os círculos de maneira ordenada na página. Você pode ver mais exemplos aqui na biblioteca do desenvolvedor também.

    Inicialmente vamos ao nosso arquivo HTML :

     <div id="skills" class="step">
            <div class="legend">
                <div class="skills">
                    <ul>
                        <li class="jq">SEO</li>
                        <li class="css">C#</li>
                        <li class="html">Asp.NET</li>
                        <li class="mvc">MVC</li>
                        <li class="php">SCRUM</li>
                        <li class="sql">SQL</li>
                    </ul>
                </div>
            </div>
            <div id="diagram"></div>
            <div class="get">
                <div class="arc">
                    <span class="text">SEO</span>
                    <input type="hidden" class="percent" value="97" />
                    <input type="hidden" class="color" value="#b72228" />
                </div>
                <div class="arc">
                    <span class="text">C#</span>
                    <input type="hidden" class="percent" value="89" />
                    <input type="hidden" class="color" value="#416587" />
                </div>
                <div class="arc">
                    <span class="text">Asp.NET</span>
                    <input type="hidden" class="percent" value="75" />
                    <input type="hidden" class="color" value="#6999C7" />
                </div>
                <div class="arc">
                    <span class="text">SCRUM</span>
                    <input type="hidden" class="percent" value="53" />
                    <input type="hidden" class="color" value="#9BCBF8" />
                </div>
                <div class="arc">
                    <span class="text">MVC</span>
                    <input type="hidden" class="percent" value="37" />
                    <input type="hidden" class="color" value="#7BABD9" />
                </div>
                <div class="arc">
                    <span class="text">SQL</span>
                    <input type="hidden" class="percent" value="31" />
                    <input type="hidden" class="color" value="#BEDBE9" />
                </div>
            </div>
        </div>
        

    Ela consiste nas seguintes partes:

    • Uma lista que será a legenda do nosso diagrama
    • Uma div que será a área impressa
    • Uma lista de divs que contem o texto, o valor, e a cor de cada círculo.

    Eu desenhei 6 itens contendo possíveis habilidades de um desenvolvedor.

    Assim, vamos deixá-lo dessa maneira por enquanto.

    Vamos trabalhar em um arquivo javascript que irá funcionar com as configurações do nosso diagrama :

        
    var o = {
        //inicia o gráfico
    	init: function(){
    		this.diagram();
    	},
    	//retorna os gráficos em posições aleatórias a cada carregamento da página
    	random: function(l, u){
    		return Math.floor((Math.random()*(u-l+1))+l);
    	},
    	//opções do diagrama
    	diagram: function(){
    	    //Raphael é o nome do plugin, e 600 é tamanho e altura
    		var r = Raphael('diagram', 600, 600),
    			rad = 73,
    			defaultText = 'Skills',
    			speed = 250;
    		
    		//círculo desenhado no interior do diagrama
    		r.circle(300, 300, 85).attr({ stroke: 'none', fill: '#363636' });
    		var title = r.text(300, 300, defaultText).attr({
    			font: '20px PTSansBold',
    			fill: '#fff'
    		}).toFront();
    		
    		//retorna as posições dos círculos de maneira que um 'encaixa' no outro
    		r.customAttributes.arc = function(value, color, rad){
    			var v = 3.6*value,
    				alpha = v == 360 ? 359.99 : v,
    				random = o.random(91, 240),
    				a = (random-alpha) * Math.PI/180,
    				b = random * Math.PI/180,
    				sx = 300 + rad * Math.cos(b),
    				sy = 300 - rad * Math.sin(b),
    				x = 300 + rad * Math.cos(a),
    				y = 300 - rad * Math.sin(a),
    				path = [['M', sx, sy], ['A', rad, rad, 0, +(alpha > 180), 1, x, y]];
    			return { path: path, stroke: color }
    		}
    		
    		//pega o valor do conteúdo da div( que está no html com a classe get  ) e lê todas as div's com a classe arc
    		$('.get').find('.arc').each(function(i){
    			var t = $(this), 
    				color = t.find('.color').val(),
    				value = t.find('.percent').val(),
    				text = t.find('.text').text();
    			
    			rad += 30;	
    			//desenha o círculo com as configurações
    			var z = r.path().attr({ arc: [value, color, rad], 'stroke-width': 26 });
    			
    			//função de zoom no mouse hover
    			z.mouseover(function(){
                    this.animate({ 'stroke-width': 50, opacity: .75 }, 1000, 'elastic');
                    if(Raphael.type != 'VML') //solves IE problem
    				this.toFront();
    				title.stop().animate({ opacity: 0 }, speed, '>', function(){
    					this.attr({ text: text + '\n' + value + '%' }).animate({ opacity: 1 }, speed, '<');
    				});
                }).mouseout(function(){
    				this.stop().animate({ 'stroke-width': 26, opacity: 1 }, speed*4, 'elastic');
    				title.stop().animate({ opacity: 0 }, speed, '>', function(){
    					title.attr({ text: defaultText }).animate({ opacity: 1 }, speed, '<');
    				});	
                });
    		});
    		
    	}
    }
    //instancia o gráfico
    $(function(){ o.init(); });
    
    

    O básico está pronto! Agora vamos conferir o arquivo CSS que gera o gráfico de maneira bacana :

    /* ================= SKILLS  ================== */
    
    #skills
    {
        width: 800px;
        height:600px;
        padding: 15px ;
        position: relative;
        border: 1px solid #ccc;
       
        -webkit-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.1);
        -moz-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.1);
        box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.1);
        background:#EEE;
    }
    
    #skills h2
    {
        text-align:center;
        margin-left:40px;
    	padding-top:10px;
    }
    .legend {
    	float:left;
    	width:100px;
    	-webkit-transform: rotate(1deg);
       -moz-transform: rotate(1deg);
       -o-transform: rotate(1deg);
       -ms-transform: rotate(1deg);
       transform: rotate(1deg);
       margin-left:1px;
    }
    #diagram {
    	float:left;
    	width:500px;
    	height:500px;
    	margin-top:50px;
    	margin-left:100px;
    	-webkit-transform: rotate(1deg);
       -moz-transform: rotate(1deg);
       -o-transform: rotate(1deg);
       -ms-transform: rotate(1deg);
       transform: rotate(1deg);
    }
    .skills ul, .skills li {
    	display:block;
    	list-style:none;
    	margin:0px;
    	padding-left:0px;
    	padding-top:10px;
    }
    .skills li
    {
        font-family: PTSans;
        font-size: 26px;
        float: left;
        clear: both;
        padding: 0px 15px 0px 45px;
        line-height: 54px;
        margin-top: 5px;
    	margin-bottom: 5px;
    	color:#fff;
    }
    .skills .seo {
    	background:#b72228;
    }
    .skills .csharp {
    	background:#416587;
    }
    .skills .asp {
    	background:#6999C7;
    }
    .skills .mvc {
    	background:#9BCBF8;
    }
    .skills .scrum {
    	background:#7BABD9;
    }
    
    .skills .sql {
    	background:#BEDBE9;
    }
    .get {
    	display:none;
    }
    

    Com isto está pronto! Não se esqueça de utilizar o Jquery anteriormente pois este script utiliza Jquery.

    Caso você queira fazer o download do projeto e brincar um pouco, sinta-se a vontade : Download Diagrama.

    Bom, por hoje é só, espero que gostem!

    Siga-nos na Fã page do Facebook  ;)

    Share. Facebook Twitter LinkedIn Telegram WhatsApp Copy Link
    Jhonathan Soares
    • Website
    • Facebook
    • X (Twitter)
    • LinkedIn

    Criador do blog Código Simples e com mais 15 anos de experiência em TI, com títulos de MVP Microsoft na área de Visual Studio Development, Neo4j Top 50 Certificate, Scrum Master e MongoDB Evangelist.

    Posts Relacionados

    Clean Code (2ª edição): o que mudou e o que continua valendo

    Dicas Gestão & Produtividade 12 de fevereiro de 20266 Mins Read

    Conheça os tipos de registros DNS: o guia completo sobre A, AAAA, NS, CNAME, MX, PTR, SOA, TXT, SRV, SPF e muito mais

    Dicas 8 de outubro de 20257 Mins Read

    Mais de 200 livros de programação gratuitos em português

    Cursos Dicas 16 de setembro de 202512 Mins Read
    Newsletter

    Digite seu endereço de e-mail para receber notificações de novas publicações por e-mail.

    Junte-se a 25mil outros assinantes
    Posts recentes
    • Context engineering: quando o problema deixa de ser prompt e vira arquitetura
    • Clean Code (2ª edição): o que mudou e o que continua valendo
    • Sunk Cost em Arquitetura de Software: como evitar que meses de investimento virem uma armadilha
    • Guia Profissional de Prompting – Domando um ChatGPT Preguiçoso: Como Obter Respostas Completas, Profundas e Confiáveis
    • A Anatomia de um Prompt: Como Falar com a IA Como um Profissional de Tecnologia
    Categorias
    • Arquitetura (31)
      • Microsserviços (3)
      • Testes (2)
    • Asp.net (120)
      • C# (89)
      • Mvc (13)
    • Banco de dados (93)
      • NoSql (60)
      • Sql (38)
    • Boas práticas (34)
      • Gestão & Produtividade (4)
      • Metodologias Ágeis (6)
    • Cursos (53)
    • Dicas (108)
    • Front-End (92)
    • IA (7)
    • Linux (6)
    • NodeJS (4)
    • Post do Leitor (9)
    • Python (5)
    • Seo (12)
    • Tecnologia (30)
      • ITIL (1)
      • Padrões de Projeto (4)
    • Testes (2)

    VEJA TAMBÉM

    Cursos
    12 de fevereiro de 20166 Mins Read

    1000 livros gratuitos sobre programação!

    Olha que dica bacana! A pagina só com livros sobre programação é mantida no GitHub…

    30 APIs Gratuitas para desenvolvedores

    Código Simples no Facebook
    Código Simples no Facebook
    • Popular
    • Recente

    1000 livros gratuitos sobre programação!

    12 de fevereiro de 2016

    Google lança versão “invisível” do reCAPTCHA!

    10 de março de 2017

    Mini curso de HTML5 oferecido pela Microsoft

    30 de janeiro de 2014

    O que significa ( !important ) na declaração do CSS ?

    5 de fevereiro de 2014

    Programa para supercompactar arquivos. KGB Archiver.

    6 de fevereiro de 2014

    Context engineering: quando o problema deixa de ser prompt e vira arquitetura

    16 de abril de 2026

    Clean Code (2ª edição): o que mudou e o que continua valendo

    12 de fevereiro de 2026

    Sunk Cost em Arquitetura de Software: como evitar que meses de investimento virem uma armadilha

    4 de fevereiro de 2026

    Guia Profissional de Prompting – Domando um ChatGPT Preguiçoso: Como Obter Respostas Completas, Profundas e Confiáveis

    30 de outubro de 2025

    A Anatomia de um Prompt: Como Falar com a IA Como um Profissional de Tecnologia

    30 de outubro de 2025
    Nosso Feed
    • RSS - Posts
    Fique por dentro

    Digite seu endereço de email para assinar este blog e receber notificações de novas publicações por email.

    Facebook X (Twitter) Instagram LinkedIn

    Type above and press Enter to search. Press Esc to cancel.

    Vá para versão mobile