Close Menu
Código Simples .NETCódigo Simples .NET
    Facebook X (Twitter) Instagram
    Trending
    • Processamento Assíncrono: Os Desafios da Escalabilidade
    • NewSQL em 2025: O Estado Atual, Tendências e o Futuro dos Bancos de Dados Relacionais Escaláveis
    • 12 Regras Essenciais para Reduzir a Latência de Aplicações
    • Cache Hit Ratio: Como uma Simples Métrica Pode Revolucionar sua Arquitetura
    • Como a Uber calcula o tempo estimado de chegada
    • 30 APIs Gratuitas para desenvolvedores
    • Por que escalar escrita é tão mais difícil do que escalar leitura?
    • MongoDB Analyzer para .NET: Visualize e otimize suas consultas de forma simples
    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

    Happy Hour com Dados #17 – Azure vs AWS vs GCP

    Front-End 26 de maio de 20211 Min Read

    Happy Hour com Dados #16 – Java vs C#

    C# Dicas 22 de setembro de 20201 Min Read

    Happy Hour com Dados #15 – Aplicação de IA no Processamento de Imagem

    Dicas Tecnologia 22 de setembro de 20201 Min 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
    • Processamento Assíncrono: Os Desafios da Escalabilidade
    • NewSQL em 2025: O Estado Atual, Tendências e o Futuro dos Bancos de Dados Relacionais Escaláveis
    • 12 Regras Essenciais para Reduzir a Latência de Aplicações
    • Cache Hit Ratio: Como uma Simples Métrica Pode Revolucionar sua Arquitetura
    • Como a Uber calcula o tempo estimado de chegada
    Categorias
    • Arquitetura (15)
      • Testes (2)
    • Asp.net (120)
      • C# (89)
      • Mvc (13)
    • Banco de dados (90)
      • NoSql (58)
      • Sql (38)
    • Boas práticas (29)
      • Gestão & Produtividade (1)
      • Metodologias Ágeis (6)
    • Cursos (52)
    • Dicas (105)
    • Front-End (92)
    • IA (1)
    • 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

    Facebook X (Twitter) Instagram LinkedIn

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

    Vá para versão mobile