Uma coleção de dicas para aumentar suas habilidades no CSS.
Dê uma olhada em mais algumas listas fantásticas mantidas por [@sindresorhus](https://github.com/sindresorhus/).
box-sizing
unset
em vez de redefinir todas as propriedades
:not()
para Aplicar/Remover Bordas
line-height
no body
:focus
para elementos de formulário
nth-child
Negativo
max-height
rem
para Definir Tamanhos Globais; Use
em
para Definir Tamanhos Locais
:root
para uma Tipografia Flexível
font-size
em Elementos de Formulário para uma
Melhor Experiência Mobile
display: none
em quebras de linha usadas como
espaçamento
Resetar o CSS vai te ajudar a manter a consistência de estilo em diferentes navegadores com um ponto de partida limpo para elementos de estilo. Você pode usar a biblioteca de reset CSS como Normalize, ou se preferir, usar uma abordagem mais simplificada.:
Agora os elementos estarão sem margens, preenchimento e
box-sizing
. Te permitindo gerenciar o layout com o seu CSS.
Nota: Se você seguir a dica
Herde o box-sizing abaixo você pode
optar por não incluir a propriedade box-sizing
em sua
redefinição de CSS.
box-sizing
Faça com que o box-sizing
seja herdado do html
:
Assim fica fácil de alterar o box-sizing
em plugins ou outros
componentes que tenham um comportamento diferente.
unset
em vez de redefinir todas as propriedades
Ao redefinir as propriedades de um elemento, não é necessário redefinir cada propriedade individual:
button {
background: none;
border: none;
color: inherit;
font: inherit;
outline: none;
padding: 0;
}
Você pode especificar todas as propriedades de um elemento usando a
abreviação all
. Definir o valor como
unset
altera as propriedades de um elemento para seus valores
iniciais:
Nota: a abreviação all
eunset
não é compatível com o IE11.
:not()
para Aplicar/Remover Bordas
Ao invés de colocar a borda…
…para então remover no último elemento…
…utilize a pseudo-classe :not()
para aplicar a borda
apenas nos elementos corretos:
O seletor CSS define a borda da maneira que um humano a descreveria.
Você pode verificar se uma fonte está instalada localmente antes de buscá-la remotamente, o que também é uma boa dica de desempenho.
@font-face {
font-family: "Dank Mono";
src:
/* Full name */
local("Dank Mono"),
/* Postscript name */
local("Dank Mono"),
/* Otherwise, download it! */
url("//...a.server/fonts/DankMono.woff");
}
code {
font-family: "Dank Mono", system-ui-monospace;
}
Dica de chapéu para Adam Argyle por compartilhar este protip e exemplo.
line-height
no body
Você não precisa adicionar o line-height
para cada
<p>
, <h*>
, et al.
separadamente. Apenas adicione ao body
:
Dessa maneira elementos de texto vão herdar o line-height
do
body
.
:focus
para elementos de formulário
Os usuários de teclado com visão dependem do foco para determinar onde os eventos de teclado vão na página. Faça com que os elementos do formulário se foquem e sejam consistentes com a implementação padrão do navegador:
a:focus,
button:focus,
input:focus,
select:focus,
textarea:focus {
box-shadow: none;
outline: #000 dotted 2px;
outline-offset: .05em;
}
Que bruxaria é essa? Não é bruxaria! Você realmente pode centralizar elementos verticalmente:
html,
body {
height: 100%;
margin: 0;
}
body {
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
display: -webkit-flex;
display: flex;
}
…e também com CSS Grid:
Isso não resolveu seu problema? O site CSS-Tricks tem um guia completo de como centralizar elementos com CSS.
Aviso: Fique atento com os bugs quando utilizar flexbox no IE11.
Transforme listas normais em listas separadas por vírgula:
Utilize a pseudo-classe :not()
para evitar que a
vírgula seja adicionada depois do último item.
Aviso: Se considerarmos acessibilidade essa dica pode não ser ideal, especialmente para usuários de leitores de tela. Além disso, copiar e/ou colar não funcionam em conteúdo criado com CSS. Proceda com cautela.
nth-child
Negativo
Utilize nth-child
negativo no CSS para selecionar itens de 1
a n.
Já que você aprendeu um pouquinho sobre como usar a
pseudo-classe
using :not()
, você pode tentar:
/* selecione todos os itens, exceto os primeiros 3 e exiba-os */
li:not(:nth-child(-n+3)) {
display: none;
}
Mais fácil que isso só dois disso.
Não tem porque você não usar ícones em SVG:
A vantagem do SVG é que o ícone fica bom em qualquer resolução, além de ter suporte amplo em todos os browsers desde o IE9. Agora você pode se desfazer dos seus arquivos .png, .jpg, ou ainda .gif-jif-qissomano.
Aviso: Se você tem botões feitos apenas com ícones SVG, a dica a seguir o ajudará a manter a acessibilidade:
O nome é super estranho (coruja lobotomizada), mas o uso do seletor
universal (*
) com o seletor adjacente (+
) pode
ser muito útil:
Nesse exemplo, todos os elementos acompanhados de outros elementos recebem
margin-top: 1.5em
.
Para mais exemplos utilizando o seletor “lobotomized owl”, leia o artigo escrito por Heydon Pickering no site A List Apart.
max-height
Crie sliders usando apenas CSS com max-height
e
overflow-y: hidden
:
.slider {
max-height: 200px;
overflow-y: hidden;
width: 300px;
}
.slider:hover {
max-height: 600px;
overflow-y: scroll;
}
O elemento se expandirá ao valor definido no max-height
no
hover e você terá um slider devido ao uso do overflow.
Não tem nada mais chato do que trabalhar com tabelas, mas você pode usar
table-layout: fixed
para manter as células do mesmo tamanho:
Tabelas sem dor de cabeça.
Quando definir o espaçamento entre as colunas, você pode deixar os
seletores nth-
, first-
, e
last-child
de lado e usar a propriedade
space-between
do flexbox:
Assim as colunas ficam espaçadas uniformemente.
Mostre links para tags <a>
vazias que possuem o
atributo href
:
Mão na roda.
Defina estilos para links “default”:
Dessa forma, links que são inseridos por CMS – que normalmente não possuem
o atributo class
– vão ser estilizados sem comprometer outros
links.
Para criar uma div com proporção de tela fixa, tudo que você precisa fazer
é adicionar padding
(top
ou bottom
)
a div pai:
.container {
height: 0;
padding-bottom: 20%;
position: relative;
}
.container div {
border: 2px dashed #ddd;
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
Se você usar 20% no padding
a altura da div vai ser igual a
20% de sua largura. Independente da largura do viewport, a div
filho vai sempre manter a proporção de tela (100% / 20% = 5:1).
Faça com que imagens quebradas fiquem esteticamente mais agradáveis com um pouquinho de CSS:
img {
display: block;
font-family: sans-serif;
font-weight: 300;
height: auto;
line-height: 2;
position: relative;
text-align: center;
width: 100%;
}
Agora adicione regras com pseudo-elementos para mostrar uma mensagem e a URL da imagem quebrada:
img::before {
content: "Desculpe, a imagem abaixo não pode ser carregada :(";
display: block;
margin-bottom: 10px;
}
img::after {
content: "(url: " attr(src) ")";
display: block;
font-size: 12px;
}
Leia mais sobre como estilizar imagens quebradas no artigo original por Ire Aderinokun.
rem
para Definir Tamanhos Globais; Use
em
para Definir Tamanhos Locais
Depois de definir o tamanho de fonte base na raíz (html { font-size: 100%; }
), defina o tamanho de fonte para elementos de texto utilizando
em
:
Então defina o tamanho da fonte de módulos utilizando rem
:
Assim fica mais fácil de estilizar e manter cada módulo, além de ser flexível.
Ótima dica para uma stylesheet personalizada. Evite sobrecarregar o usuário com som de vídeos em autoplay. Se o som não estiver no mudo, esconda o vídeo:
E aqui mais uma entre as muitas vantagens de usar a
pseudo-classe
:not()
.
:root
para uma Tipografia Flexível
O tamanho de fonte de um site responsivo deveria ser ajustável de
acordo com cada viewport. Você pode calcular o tamanho da fonte
baseado na largura e na altura do viewport usando
:root
:
Assim você pode utilizar a unidade de medida root em
baseada
no valor calculado por :root
:
font-size
em Elementos de Formulário para uma Melhor
Experiência Mobile
Para evitar zoom indesejado em elementos de formulários de navegadores
mobile (iOS Safari, et al) quando um
<select>
é selecionado, adicione
font-size
no seletor:
:dancer:
Eventos de ponteiro permitem que você especifique como o mouse interage com o elemento que está tocando. Para desativar o evento de ponteiro padrão em um botão, por exemplo:
É simples assim.
display: none
em quebras de linha usadas como
espaçamento
Como Harry Roberts apontou, isso pode ajudar a impedir que os usuários do CMS usem quebras de linha extras para espaçamento:
Versões atuais do Chrome, Firefox, Safari, Opera, Edge, e IE11.