CSS (Cascading Style Sheets) é uma linguagem de folhas de estilo, usada para descrever a apresentação de documentos e aplicativos escritos em linguagens de marcação como, por exemplo, HTML, XML e SVG. O CSS foi desenvolvido para separar o conteúdo do documento da apresentação do documento, podendo definir cores, fontes e layout. Dessa forma, é possível criar uma apresentação para a tela e outra para a impressão, por exemplo.
Tipos de mídia
Existem atualmente 10 tipos de mídia válidos, sendo os 3 primeiros compatíveis com a maioria dos navegadores. Eles são:
Mídia | Descrição |
---|---|
all |
Todas as mídias (padrão) |
screen |
Telas de computadores |
print |
Páginas impressas |
handheld |
Dispositivos de mão, como celulares |
projection |
Projetores |
tv |
Televisores |
braille |
Dispositivos táteis de braille |
embossed |
Impressão em relevo de braille |
speech |
Dispositivos sintetizadores de voz |
tty |
Teletipos e dispositivos portáteis de capacidade limitada |
Aplicação
Há três formas de aplicar CSS a um documento HTML:
Ligando a um arquivo externo
Ligar a um arquivo externo é a forma preferível, por separar o conteúdo da apresentação.
…
<head>
<link type="stylesheet" href="assets/css/style.css">
<link type="stylesheet" href="assets/css/print.css" media="print">
</head>
…
O atributo “media” é opcional, e indica o tipo da mídia da apresentação.
Definindo no cabeçalho do documento
…
<head>
<style>
b,
strong {
color: red;
}
</style>
<style media="print">
b,
strong {
color: gray;
text-decoration: underline;
}
</style>
</head>
…
O tipo da mídia também pode ser especificado no CSS:
…
<head>
<style>
b,
strong {
color: red;
}
@media print {
b,
strong {
color: gray;
text-decoration: underline;
}
}
</style>
</head>
…
Definindo diretamente nos elementos (inline)
…
<body>
<p>
Diga <strong style="color: red">não</strong> à opressão.
</p>
</body>
…
Dessa forma não há como especificar o tipo da mídia, nem como reutilizar o estilo em outros elementos.
Seletores
Há diversas maneiras de especificar a quais elementos se está definindo a apresentação; são chamados de “seletores”, e são separados por vírgula. No exemplo abaixo, é aplicada a cor vermelha às tags de negrito (b
ou strong
), e a cor azul à tag b
com a classe .blue
.
…
<head>
<style>
b,
strong {
color: red;
}
b.blue {
color: blue;
}
</style>
</head>
<body>
<p>
Diga <strong>não</strong> à <b class="blue">opressão</b>.
</p>
</body>
…
Os seletores podem sem combinados para criar regras mais complexas. Segue os tipos mais comuns de seletores:
Sintaxe | Descrição |
---|---|
* |
Qualquer elemento |
tag |
Especifica uma tag |
.classe |
Especifica uma classe, que pode ser usada em vários elementos |
#id |
Especifica uma ID, que pode ser usada apenas em um elemento |
[atributo] |
Especifica a existência de um atributo |
[atributo="valor"] |
Especifica que o valor do atributo é igual a um determinado valor |
[atributo^="valor"] |
Especifica que o valor do atributo começa com um determinado valor |
[atributo$="valor"] |
Especifica que o valor do atributo termina com um determinado valor |
[atributo*="valor"] |
Especifica que o valor do atributo possui um determinado valor |
elemento1 elemento2 |
Especifica que um elemento está dentro de outro elemento |
elemento1 > elemento2 |
Especifica que um elemento está diretamente dentro de outro elemento |
:empty |
Pseudo-classe que especifica elementos vazios |
:first-child |
Pseudo-classe que especifica o primeiro elemento |
:last-child |
Pseudo-classe que especifica o último elemento |
:nth-child(an+b) |
Pseudo-classe que especifica o enésimo elemento, determinado por uma expressão. a especifica de quantos em quantos elementos, e b especifica o primeiro elemento da contagem. Por exemplo, para elementos pares, usa-se 2n ou even , e para ímpares, usa-se 2n+1 ou odd . |
:not(seletor) |
Pseudo-classe que especifica o inverso do seletor |
::first-letter |
Pseudo-elemento que representa a primeira letra do elemento |
::first-line |
Pseudo-elemento que representa a primeira linha do elemento |
::before |
Pseudo-elemento que representa o que vem antes do elemento |
::after |
Pseudo-elemento que representa o que vem depois do elemento |
Há diversos outros seletores; para saber mais, consulte: https://developer.mozilla.org/en-US/docs/Glossary/CSS_Selector (em inglês).
Propriedades
As propriedades são definidas usando a seguinte sintaxe:
propriedade: valor;Exemplo:
color: black;
Comentários
Tudo que estiver entre /*
e */
será ignorado pelo navegador; são os comentários. Servem para documentar o código.
Cores
As cores podem ser definidas de quatro formas diferentes: palavra-chave, valor hexadecimal, RGB(A), e HSL(A).
- Palavra-chave:
yellow
- Hexadecimal:
#FFFF00
-
RGB (Vermelho, Verde e Azul):
rgb(255, 255, 0)
ourgb(100%, 100%, 0)
- As três cores primárias vão de 0 a 255
-
HSL (Matiz, Saturação e Luminosidade):
hsl(60, 100%, 50%)
- Matiz é um grau de cor, que vai de 0 a 360 – 0 (ou 360) é vermelho, 120 é verde, e 240 é azul
- Saturação é uma porcentagem, onde 0 é um tom de cinza, e 100% é a cor completa
- Luminosidade é uma porcentagem, onde 0 é preto, e 100% é branco
É possível especificar a opacidade (Alpha) para cores em RGB e HSL, como o quarto parâmetro, que vai de 0.0 (totalmente transparente) a 1.0 (totalmente opaco):
- RGBA:
rgba(255, 255, 0, 0.5)
- HSLA:
hsla(60, 100%, 50%, 0.5)
Gradientes
O primeiro parâmetro especifica a direção do gradiente, e os demais (sem limite) as cores e ponto de início. Exemplo:
.rgb {
width: 100%;
height: 120px;
background-image: linear-gradient(to right, red 0%, green 50%, blue 100%);
}
Para gradientes diagonais, usa-se um valor em degraus no primeiro parâmetro. Exemplo: 130deg
. Também é possível criar gradientes radiais. Exemplo:
.rgb {
width: 100%;
height: 120px;
background-image: radial-gradient(ellipse at center, red 0%, green 50%, blue 100%);
}
Fontes
Há dois tipos de fontes: as com serifa (serif
), e as sem serifa (sans-serif
). Quando o navegador não encontra uma fonte especificada, ele tenta usar uma semelhante. É possível especificar também o estilo da fonte (normal, itálica, e oblíqua), e a espessura (normal e negrito).
i,
em {
font-family: "Arial", sans-serif; /* Na ausência da fonte, usar qualquer fonte sem serifa */
font-size: 16px; /* 16 pixels, 12 pontos, 1.0 em, ou 100% */
font-style: italic; /* Valores possíveis: normal, italic, oblique, e inherit */
font-weight: normal; /* Espessura da fonte. Permite valor numérico, de 100 a 900 */
}
Para o tamanho da fonte, é possível usar diversas unidades de medidas, sendo as mais comuns px
(pixels), pt
(pontos), em e %
(relativos ao tamanho da fonte do elemento pai).
Para a propriedade font-style
, é possível dar o valor inherit
, que significa que herdará o estilo do elemento pai. No caso da propriedade font-weight
, é possível dar um valor relativo ao elemento pai, lighter
(mais claro) e bolder
(mais negrito).
É possível usar fontes que não vêm instaladas no computador. Exemplo:
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
src: local('Open Sans'), /* Fonte instalada */
local('OpenSans'),
url(../fonts/OpenSans.woff2) format('woff2'), /* Formato preferível */
url(../fonts/OpenSans.woff) format('woff'); /* Formato de compatibilidade */
}
A Google oferece um serviço de diretório de fontes bacana, o Google Fonts, onde você pode escolher entre diversas fontes otimizadas para a web.
Layout
Display
Há diversos modos de layout suportados (e outros em desenvolvimento). No HTML, por padrão, o modo de layout é decidido por elemento (imagens são inline
, parágrafos são block
, etc). Para uma lista completa, consulte: https://developer.mozilla.org/en-US/docs/Web/CSS/display (em inglês).
Position
Há quatro formas de posicionamento atualmente suportadas:
- static
- fluxo normal. As propriedades
top
,right
,bottom
,left
ez-index
não têm efeito - relative
- fluxo relativo. As posições são calculadas a partir dos elementos adjacentes
- absolute
- o posicionamento é calculado a partir do topo da página
- fixed
- o posicionamento é calculado a partir do topo da página, mas é fixo independente da rolagem
Exemplo:
#chat {
position: fixed;
right: 0;
bottom: 0;
z-index: 9; /* Camada no qual o elemento se encontra. Permite sobrepor outros elementos */
}
Alinhamento
Para alinhar elementos inline
, como imagens e texto, é possível usar a propriedade text-align
(alinhamento horizontal) e vertical-align
(alinhamento vertical). Exemplo:
.h-center-inline {
text-align: center;
}
.v-center-inline {
vertical-align: middle;
}
Entretanto, para elementos block
é necessário alguns hacks:
/* Alinha a esquerda */
.align-left {
float: left;
}
/* Alinha a direita */
.align-right {
float: right;
}
/* Limpa o alinhamento */
.clearfix::before,
.clearfix::after {
content: " ";
display: table;
}
.clearfix::after {
clear: both;
}
O elemento pai precisa aplicar a propriedade clear: both
, ou o layout ficará comprometido. Exemplo:
…
<div class="clearfix">
<div class="align-left">
…
</div>
</div>
…
Para centralizar horizontalmente:
.h-center {
margin: 0 auto;
}
Para centralizar verticalmente, a coisa complica:
/* Centraliza verticalmente */
.v-center {
display: table;
}
.v-center .v-center-item {
display: table-cell;
vertical-align: middle;
}
E o código HTML:
…
<div class="v-center">
<div class="v-center-item">
…
</div>
</div>
…