Confio muito em CSS para um site em que estou trabalhando. No momento, todos os estilos CSS estão sendo aplicados por tag e, agora, estou tentando movê-lo para um estilo externo, para ajudar em futuras alterações.
Mas agora o problema é que notei que estou recebendo uma "Explosão CSS". Está ficando difícil para mim decidir como organizar e abstrair melhor os dados no arquivo CSS.
Estou usando um grande número de div
tags no site, saindo de um site fortemente baseado em tabela. Então, eu estou recebendo muitos seletores de CSS parecidos com este:
div.title {
background-color: blue;
color: white;
text-align: center;
}
div.footer {
/* Styles Here */
}
div.body {
/* Styles Here */
}
/* And many more */
Ainda não é tão ruim, mas como sou iniciante, fiquei pensando se poderiam ser feitas recomendações sobre a melhor forma de organizar as várias partes de um arquivo CSS. Não quero ter um atributo CSS separado para cada elemento do meu site e sempre quero que o arquivo CSS seja bastante intuitivo e fácil de ler.
Meu objetivo final é facilitar o uso dos arquivos CSS e demonstrar seu poder de aumentar a velocidade do desenvolvimento da web. Dessa forma, outras pessoas que possam trabalhar neste site no futuro também entrarão na prática do uso de boas práticas de codificação, em vez de precisarem aprender da maneira que eu fiz.
fonte
simplicity
,complexity
,maintenance
,structure
erefactoring
.Respostas:
Esta é uma pergunta muito boa. Em todos os lugares em que olho, os arquivos CSS tendem a ficar fora de controle depois de um tempo - especialmente, mas não apenas, quando se trabalha em equipe.
A seguir, estão as regras que eu mesmo estou tentando seguir (não que eu sempre consiga.)
Refatorar cedo, refatorar com freqüência. Limpe com freqüência os arquivos CSS, junte várias definições da mesma classe. Remova definições obsoletas imediatamente .
Ao adicionar CSS durante a correção de erros, deixe um comentário sobre o que a alteração faz ("Isso é para garantir que a caixa fique alinhada no IE <7")
Evite redundâncias, por exemplo, definindo a mesma coisa em
.classname
e.classname:hover
.Use comentários
/** Head **/
para criar uma estrutura clara.Use uma ferramenta de pré-modificação que ajude a manter um estilo constante. Eu uso o Polystyle , com o qual estou muito feliz (custa US $ 15, mas é dinheiro bem gasto). Existem outros gratuitos também (por exemplo, Code Beautifier baseado no CSS Tidy , uma ferramenta de código-fonte aberto).
Crie classes sensatas. Veja abaixo algumas notas sobre isso.
Use semântica, evite sopa DIV - use
<ul>
s para menus, por exemplo.Defina tudo no nível mais baixo possível (por exemplo, uma família de fontes padrão, cor e tamanho
body
) e use sempreinherit
que possívelSe você possui CSS muito complexo, talvez um pré-compilador CSS o ajude. Estou planejando analisar o xCSS pelo mesmo motivo em breve. Existem vários outros por aí.
Se estiver trabalhando em equipe, destaque também a necessidade de qualidade e padrões para arquivos CSS. Todo mundo gosta muito de padrões de codificação em sua (s) linguagem (s) de programação, mas há pouca consciência de que isso também é necessário para CSS.
Se trabalhar em uma equipe, não considerar o uso de controle de versão. Torna as coisas muito mais fáceis de rastrear e a edição de conflitos muito mais fáceis de resolver. Realmente vale a pena, mesmo se você é "apenas" em HTML e CSS.
Não trabalhe com
!important
. Não apenas porque o IE = <7 não pode lidar com isso. Em uma estrutura complexa, o uso de!important
muitas vezes é tentador para mudar um comportamento cuja fonte não pode ser encontrada, mas é veneno para manutenção a longo prazo.Construindo classes sensíveis
É assim que eu gosto de criar classes sensatas.
Aplico as configurações globais primeiro:
Depois, identifico as principais seções do layout da página - por exemplo, a área superior, o menu, o conteúdo e o rodapé. Se eu escrevi uma boa marcação, essas áreas serão idênticas à estrutura HTML.
Então, começo a criar classes CSS, especificando o máximo de ancestralidade possível, desde que seja sensato, e agrupando as classes relacionadas o mais próximo possível.
Pense em toda a estrutura CSS como uma árvore com definições cada vez mais específicas, mais distantes da raiz que você é. Você deseja manter o número de aulas o mais baixo possível e deseja repetir-se o mais raramente possível.
Por exemplo, digamos que você tenha três níveis de menus de navegação. Esses três menus parecem diferentes, mas também compartilham certas características. Por exemplo, são todos
<ul>
, todos têm o mesmo tamanho de fonte e os itens são todos próximos um do outro (em oposição à renderização padrão de umul
). Além disso, nenhum dos menus possui pontos de marcador (list-style-type
).Primeiro, defina as características comuns em uma classe chamada
menu
:em seguida, defina as características específicas de cada um dos três menus. O nível 1 tem 40 pixels de altura; níveis 2 e 3, 20 pixels.
Nota: você também pode usar várias classes para isso, mas o Internet Explorer 6 tem problemas com várias classes ; portanto, este exemplo usa
id
s.A marcação para o menu ficará assim:
Se você tiver elementos semanticamente semelhantes na página - como esses três menus - tente descobrir os pontos comuns primeiro e colocá-los em uma classe; depois, elabore as propriedades específicas e aplique-as às classes ou, se você precisar dar suporte aos IDs do Internet Explorer 6.
Dicas HTML diversas
Se possível, forneça uma classe única ao corpo de cada página:
<body class='contactpage'>
isso facilita a adição de ajustes específicos da página à folha de estilos:Ao criar menus automaticamente, adicione o máximo de contexto CSS possível para permitir um estilo extenso posteriormente. Por exemplo:
Dessa forma, todos os itens de menu podem ser acessados para estilizar de acordo com seu contexto semântico: se é o primeiro ou o último item da lista; Se é o item atualmente ativo; e por número.
fonte
font-weight: bold
ali .... disciplina é o único remédio :)id
mas com certeza soa como um. Talvez o conceito possa ser esclarecido?id
.Aqui estão apenas 4 exemplos:
Nos quatro, minha resposta incluiu o conselho de baixar e ler os PDF CSS Systems de Natalie Downe . (O PDF inclui várias notas que não estão nos slides, então leia o PDF!). Tome nota das sugestões dela para organização.
EDIT (2014/02/05) quatro anos depois, eu diria:
fonte
Não escreva títulos em CSS
Apenas divida as seções em arquivos. Qualquer comentário CSS, deve ser apenas isso, comentários.
Use um script para combiná-los em um; se necessário. Você também pode ter uma boa estrutura de diretórios e fazer com que seu script procure recursivamente
.css
arquivos.Se você precisar escrever títulos, tenha um sumário no início do arquivo
Os títulos no sumário devem ser perfeitamente iguais aos títulos que você escrever mais tarde. É doloroso procurar títulos. Para adicionar ao problema, como exatamente alguém deve saber que você tem outro cabeçalho após o primeiro cabeçalho? ps. não adicione documentos * (estrela) no início de cada linha ao escrever TOCs, apenas torna mais irritante selecionar o texto.
Escreva comentários com ou dentro das regras, fora do bloco
Primeiro, quando você edita o script, há uma chance de 50/50 de prestar atenção ao que está fora do bloco de regras (principalmente se for uma grande quantidade de texto;)). Em segundo lugar, não há (quase) nenhum caso em que você precise de um "comentário" do lado de fora. Se estiver fora, é 99% das vezes um título, então mantenha-o assim.
Dividir a página em componentes
Os componentes devem ter
position:relative
, nãopadding
e nãomargin
, na maioria das vezes. Isto simplifica% governa um monte, bem como permitindo muito mais simplesabsolute:position
'ing de elementos, uma vez que se há um recipiente posicionado absoluto o elemento posicionado absoluta usará o recipiente quando computaçãotop
,right
,bottom
,left
propriedades.A maioria dos DIVs em um documento HTML5 geralmente é um componente.
Um componente também é algo que pode ser considerado uma unidade independente na página. Em termos de leigos, tratam algo como um componente se faz sentido tratar algo como uma caixa preta .
Indo com o exemplo da página QA novamente:
Ao dividir a página em componentes, você divide seu trabalho em unidades gerenciáveis.
Coloque regras com efeito cumulativo na mesma linha.
Por exemplo
border
,margin
epadding
(mas nãooutline
), todos aumentam as dimensões e o tamanho do elemento que você está estilizando.Se eles não são tão legíveis em uma linha, pelo menos os coloque bem próximos:
Use taquigrafia quando possível:
Nunca repita um seletor
Se você tiver mais instâncias do mesmo seletor, é provável que você acabe inevitavelmente com várias instâncias das mesmas regras. Por exemplo:
Evite usar TAGs como seletores, quando você puder usar id / classes
Primeiro, as tags DIV e SPAN são a exceção: você nunca deve usá-las! ;) Use-os apenas para anexar uma classe / ID.
Este...
Deve ser escrito assim:
Como os DIVs pendentes extras não adicionam nada ao seletor. Eles também forçam uma regra de tag desnecessária. Se você mudasse, por exemplo,
.answer
de umdiv
para um,article
seu estilo seria quebrado.Ou se você preferir mais clareza:
A razão de ser a
border-collapse
propriedade é uma propriedade especial que só faz sentido quando aplicada a atable
. Se.statistics
não é umtable
, não deve ser aplicado.Regras genéricas são más!
Eles não economizam seu tempo, fazem sua cabeça explodir; além de tornar a manutenção um pesadelo. Ao escrever a regra, você pode saber onde elas se aplicam, no entanto, isso não garante que sua regra não irá mexer com você mais tarde.
Para adicionar a isso, regras genéricas são confusas e difíceis de ler, mesmo se você tiver alguma idéia do documento que está estilizando. Isso não quer dizer que você não deve escrever regras genéricas, apenas não as use, a menos que realmente pretenda que sejam genéricas, e mesmo elas adicionem o máximo possível de informações de escopo ao seletor.
Coisas assim ...
... tem o mesmo problema que o uso de variáveis globais em uma linguagem de programação. Você precisa dar a eles espaço!
Basicamente, lê-se como:
Gosto de usar IDs sempre que um componente que conheço é um singleton em uma página; suas necessidades podem ser diferentes.
Nota: Idealmente, você deve escrever apenas o suficiente. Mencionar mais componentes no seletor, no entanto, é o erro mais perdoador, comparado a mencionar menos componentes.
Vamos supor que você tenha um
pagination
componente. Você o usa em muitos lugares do seu site. Este seria um bom exemplo de quando você escreveria uma regra genérica. Digamos que você vinculedisplay:block
o número da página individual e forneça a eles um plano de fundo cinza escuro. Para que eles sejam visíveis, você precisa ter regras como esta:Agora, digamos que você use sua paginação para obter uma lista de respostas, você pode encontrar algo parecido com isto
Isso tornará os links brancos em preto, o que você não deseja.
A maneira incorreta de corrigi-lo é:
A maneira correta de corrigi-lo é:
Comentários "lógicos" complexos não funcionam :)
Se você escrever algo como: "esse valor depende de blá-blá combinado com a altura do blá-blá", é inevitável que você cometa um erro e tudo cairá como um castelo de cartas.
Mantenha seus comentários simples; se você precisar de "operações lógicas", considere uma dessas linguagens de modelagem CSS, como SASS ou LESS .
Como você escreve um palete de cores?
Deixe isso para o fim. Tenha um arquivo para todo o palete de cores. Sem esse arquivo, seu estilo ainda deve ter algumas paletas de cores utilizáveis nas regras. Seu palete de cores deve substituir. Você encadeia seletores usando um componente pai de nível muito alto (por exemplo
#page
) e depois escreve seu estilo como um bloco de regras auto-suficiente. Pode ser apenas cor ou algo mais.por exemplo.
A idéia é simples: seu palete de cores é uma folha de estilo independente do estilo base, no qual você cascata .
Menos nomes, requer menos memória, facilitando a leitura do código
Usar menos nomes é melhor. Idealmente, use palavras muito simples (e curtas!): Texto, corpo, cabeçalho.
Eu também acho que a combinação de palavras simples é mais fácil de entender do que tomar uma sopa longa de palavras "apropriadas": corpo de post, cabeçalho, informações do usuário etc.
Mantenha o vocabulário pequeno, dessa maneira, mesmo que algum estranho que esteja lendo sua sopa de estilo (como você depois de algumas semanas;)) precise entender apenas onde as palavras são usadas e onde todos os seletores são usados. Por exemplo, eu uso
.this
sempre que um elemento é supostamente "o item selecionado" ou "o item atual" etc.Limpe depois de si mesmo
Escrever CSS é como comer, às vezes você deixa uma bagunça para trás. Certifique-se de limpar a bagunça, ou o código do lixo ficará acumulado. Remova as classes / IDs que você não usa. Remova as regras CSS que você não usa. Verifique se tudo está bem e que você não tem regras conflitantes ou duplicadas.
Se você, como sugeri, tratou alguns contêineres como caixas-pretas (componentes) em seu estilo, usou esses componentes em seus seletores e manteve tudo em um arquivo dedicado (ou dividiu adequadamente um arquivo com um sumário e cabeçalhos), o trabalho é substancialmente mais fácil ...
Você pode usar uma ferramenta como a extensão do firefox Dust-Me Selectors (dica: aponte-o para o seu sitemap.xml) para ajudá-lo a encontrar alguns dos itens ocultos nos seus munições e bombas css.
Mantenha um
unsorted.css
arquivoDigamos que você esteja criando um site de controle de qualidade e já tenha uma folha de estilo para a "página de respostas", a qual chamaremos
answers.css
. Se você agora precisa adicionar muitos css novos, adicione-o àunsorted.css
folha de estilo e refatorá-loanswers.css
.Várias razões para isso:
fonte
Veja 1. SASS 2. Compass
fonte
A melhor maneira que eu já vi para combater o
CSS
inchaço é usar os princípios CSS orientados a objetos.Existe até uma estrutura OOCSS por aí que é muito boa.
Algumas das ideologias vão contra muito do que foi dito aqui nas respostas principais, mas depois que você souber como arquitetar
CSS
de maneira orientada a objetos, verá que realmente funcionará para manter o código enxuto e mesquinho.A principal coisa aqui é identificar 'Objetos' ou padrões de blocos de construção em seu site e arquitetar com eles.
O Facebook contratou a criadora do OOCSS, Nicole Sullivan, para obter muitas economias em seu código de front-end (HTML / CSS). Sim, você pode realmente obter economias não só no seu CSS, mas em seu HTML também, que pelo som dela, é muito possível para você como você menciona a conversão de um
table
layout com base em um monte dediv
'sOutra ótima abordagem é semelhante em alguns aspectos ao OOCSS, é planejar e escrever seu CSS para ser escalável e modular desde o início. Jonathan Snook fez um brilhante escrever e reservar / ebook sobre SMACSS - Arquitetura Modular e Escalável para CSS
Deixe-me ligar para você com alguns links:
5 erros de CSS maciço - (Vídeo)
5 erros de CSS maciço - (Slides)
CSS Bloat - (Slides)
fonte
Você também deve entender a cascata, o peso e como eles funcionam.
Percebo que você está usando apenas identificadores de classe (div.title). Você sabia que também pode usar IDs e que um ID tem mais peso que uma classe?
Por exemplo,
fará com que todos esses elementos compartilhem um tamanho de fonte, digamos, uma cor ou quaisquer que sejam suas regras. Você pode até fazer com que todos os DIVs descendentes de # página1 obtenham determinadas regras.
Quanto ao peso, lembre-se de que os eixos CSS passam do mais geral / mais leve para o mais específico / mais pesado. Ou seja, em um seletor CSS, um especificador de elemento é substituído por um especificador de classe, por um especificador de ID. Os números contam, portanto, um seletor com dois especificadores de elemento (ul li) terá mais peso do que um com apenas um único especificador (li).
Pense nisso como dígitos. Um 9 na coluna unidades ainda é menor que um na coluna dezenas. Um seletor com um especificador de ID, um especificador de classe e dois especificadores de elemento terá mais peso do que um seletor sem ID, 500 especificadores de classe e 1.000 especificadores de elemento. Este é um exemplo absurdo, é claro, mas você entendeu. O ponto é que a aplicação desse conceito ajuda a limpar muito CSS.
BTW, adicionar o especificador de elemento à classe (div.title) não é necessário, a menos que você esteja enfrentando conflitos com outros elementos que possuem class = "title". Não adicione peso desnecessário, pois pode ser necessário usá-lo mais tarde.
fonte
.myclass
, seleciona tudo com a classemyclass
. No CSS, as classes são idênticas aos IDs a esse respeito.Posso sugerir uma estrutura menos dinâmica do CSS
É semelhante ao SASS, como mencionado anteriormente.
Ajuda a manter o CSS por classe pai.
Por exemplo
O que isso faz: Aplica largura: 100% a # child1 e # child2.
Além disso, o CSS específico # child1 pertence a #parent.
Isso renderia a
fonte
Acho que o difícil é traduzir o design necessário para um site em uma série de regras. Se o design do site for claro e baseado em regras, os nomes das classes e a estrutura CSS poderão resultar disso. Mas se, com o tempo, as pessoas adicionam aleatoriamente pequenos bits ao site que não fazem muito sentido, não há muito o que fazer no CSS.
Costumo organizar meus arquivos CSS mais ou menos assim:
Redefinição de CSS, com base em Eric Meyer . (Porque, caso contrário, acho que, para a maioria dos elementos, tenho pelo menos uma ou duas regras que estão apenas redefinindo os estilos padrão do navegador - a maioria das minhas listas não se parece com o estilo HTML padrão das listas, por exemplo.)
CSS do sistema de grade, se o site solicitar. ( Baseio o meu em 960.gs )
Estilos para componentes que aparecem em todas as páginas (cabeçalhos, rodapés etc.)
Estilos para componentes usados em vários locais do site
Estilos relevantes apenas em páginas individuais
Como você pode ver, a maior parte disso depende do design do site. Se o design é claro e organizado, seu CSS pode ser. Caso contrário, você está ferrado.
fonte
Minha resposta é de alto nível para abordar as preocupações de alto nível que você levantou em sua pergunta. Pode haver truques organizacionais de baixo nível e ajustes que você pode fazer para torná-lo mais bonito, mas nenhum deles pode corrigir deficiências metodológicas. Há várias coisas que afetam a explosão do CSS. Obviamente, a complexidade geral do site, mas também coisas como semântica de nomes, desempenho de CSS, organização de arquivos CSS e testabilidade / aceitabilidade.
Você parece estar no caminho certo com a semântica de nomes, mas pode ser um passo adiante. Seções de HTML que aparecem repetidamente no site sem modificação estrutural (conhecidas como "módulos") podem ser consideradas raízes seletoras e, a partir daí, você pode definir o escopo do layout interno relativo a essa raiz. Esse é o princípio básico do CSS orientado a objetos , e você pode ler / assistir mais sobre isso nesta palestra por um engenheiro do Yahoo .
É importante observar que essa abordagem limpa pode ser oposta à preocupação com o desempenho, o que favorece seletores curtos com base no ID ou no nome da tag . Encontrar esse equilíbrio depende de você, mas, a menos que você tenha um site gigantesco, isso deve ser apenas um guia na parte de trás da sua cabeça, lembrando que você deve manter seus seletores curtos. Mais sobre desempenho aqui .
Por fim, você terá um único arquivo CSS para todo o site ou vários arquivos (um único arquivo base usado com arquivos por página ou por seção)? O arquivo único é melhor para o desempenho, mas pode ser mais difícil de entender / manter com vários membros da equipe e mais difícil de testar. Para testar, recomendo que você tenha uma única página de teste CSS que inclua todos os módulos CSS suportados para testar colisões e cascatas indesejadas.
Como alternativa, você pode ter uma abordagem de vários arquivos , para definir as regras de CSS para uma página ou seção. Isso requer que o navegador baixe vários arquivos, o que é um problema de desempenho. Você pode usar a programação do lado do servidor para especificar e agregar (e minificar) os arquivos CSS em um único arquivo dinamicamente. Porém, como esses arquivos são separados e os testes para eles seriam separados, você apresenta a possibilidade de aparência inconsistente nas páginas / seções. Assim, o teste se torna mais difícil.
Cabe a você analisar as necessidades específicas do cliente, equilibrar essas preocupações de acordo.
fonte
Como disse antes de mim: Entre no OOCSS. O Sass / Less / Compass é tentador de usar, mas até que o CSS vanilla seja usado da maneira certa, o Sass / Less / Compass só piorará as coisas.
Primeiro de tudo, leia sobre CSS eficiente. experimente o Google Page Speed e leia o que Souders escreveu sobre CSS eficiente.
Em seguida, insira OOCSS.
Ele vai revolucionar tudo sobre como escrever css. Estou totalmente renovado e adoro.
ATUALIZAÇÃO: O SMACSS é semelhante ao OOCSS, mas mais fácil de se adaptar em geral.
fonte
Os princípios básicos para CSS sensível, extraídos da refatoração de CSS: do CSS somente de anexo ao modular
fonte
Muitas vezes, vejo pessoas dividindo o arquivo em seções, com um comentário no cabeçalho entre as seções.
Algo como
Funciona muito bem e pode facilitar a volta mais tarde e encontrar o que você está trabalhando.
fonte
Você deve olhar para o BEM .
Teoria
O BEM é uma tentativa de fornecer um conjunto de instruções para organizar e nomear seletores de css, na tentativa de tornar as coisas mais reutilizáveis e modulares e evitar conflitos entre os seletores do tipo que geralmente leva a códigos de espaguete e dores de cabeça de especificidade.
Quando usado corretamente, na verdade tem alguns efeitos muito positivos.
O BEM funciona bem com o SASS para trazer um estilo quase orientado a objetos para CSS. Você pode criar arquivos modulares, que manipulam a exibição de um único elemento da interface do usuário e contêm variáveis, como cores e 'métodos', como a forma como os elementos internos são manipulados. Embora um programador hardcore de OO possa se opor a essa idéia, de fato, os conceitos aplicados trazem muitas partes mais agradáveis das estruturas de OO, como modularidade, acoplamento flexível e coesão rígida e reutilização sem contexto. Você pode até construir de uma maneira que se pareça com um objeto encapsulado usando Sass e o
&
operador .Um artigo mais detalhado da Smashing Magazine pode ser encontrado aqui ; e um de Harry Roberts, da CCS Wizardry (quem qualquer pessoa envolvida em CSS deveria ter lido) está aqui .
Na prática
Eu usei isso várias vezes, além de ter usado SMACSS e OOCSS, o que significa que também tenho algo para compará-los. Eu também trabalhei em algumas grandes bagunças, muitas vezes por minha própria criação, inexperiente.
Quando uso o BEM no mundo real, aprimoro a técnica com alguns princípios extras. Utilizo classes de utilidade - um bom exemplo é uma classe de wrapper:
E também confio um pouco na cascata e na especificidade. Aqui o módulo BEM seria
.primary-box
e.header
seria o contexto para uma substituição específica(Esforço-me ao máximo para tornar tudo o mais genérico e livre de contexto possível, o que significa que um bom projeto quase tudo está nos módulos que são reutilizáveis)
Um ponto final que eu colocaria aqui é que, por mais pequeno e complexo que o seu projeto possa parecer, você deve fazer isso desde o início, por dois motivos:
Componentes da Web
Em 2015, começamos a analisar os Web Components. Ainda não sei muito sobre isso, mas eles procuram reunir todas as funcionalidades do front-end em módulos independentes, tentando efetivamente aplicar os tipos de princípios do BEM ao front-end como um todo e componentes dispersos, mas totalmente acoplados elementos como fragmentos do DOM, Js (MVC) e CSS que constroem o mesmo widget da interface do usuário.
Ao fazer isso, eles abordarão alguns dos problemas originais que existem com o css, que tentamos resolver com coisas como o BEM, ao longo do caminho, tornando algumas das outras arquiteturas de front-end mais sãs.
Há algumas leituras adicionais aqui e também um quadro Polymer aqui que vale a pena dar uma olhada
Finalmente
Também acho que este é um excelente e moderno guia de práticas recomendadas em CSS - projetado especificamente para impedir que grandes projetos de CSS fiquem confusos. Eu tento seguir a maioria deles.
fonte
Eu recomendo que você analise a estrutura CSS "Compass Style" .
fonte
existe algum material excelente aqui e alguns levaram muito tempo para responder a essa pergunta, no entanto, quando se trata de folhas de estilo separadas ou individuais, eu usaria arquivos separados para desenvolvimento e depois passava a ter todos os seus css genéricos usados em todo o site mesclado em um único arquivo quando implantado.
Dessa forma, você tem o melhor dos dois mundos, aumenta o desempenho (menos solicitações de HTTP sendo solicitadas pelo navegador) e separa os problemas de código durante o desenvolvimento.
fonte