descend./filho
~ p strong
: todo <strong>
descendente de <p>
(filho, neto etc.)
~ p > strong
: todo <strong>
filho direto de <p>
atributo
~ img[alt]
: toda <img>
que tem atributo alt="..."
~ a[href$=".html"]
: todo <a>
apontando para um .html
etc.
estado do link
~ a:link
, a:visited
, a:hover
, a:active
negação
~ img:not([alt])
: <img>
sem o atributo alt
<style>
h4 { color: black; }
h4 { color: white; }
</style>
<h4>Arthur Dent</h4> <!-- qual a cor de Arthur Dent? -->
<style>
.destaque { color: red; }
#titulo { color: green; }
h4 { color: blue; }
</style>
<h4 id="titulo" class="destaque">Ford Prefect</h4>
green
)</h4>Regra 1 ~ Cada seletor tem uma pontuação de especificidade
Regra 2 ~ Se dois seletores selecionam o mesmo elemento, mas com pontuações diferentes, ganha aquele com pontuação maior
Regra 3 ~ Se dois seletores selecionam o mesmo elemento e têm a mesma pontuação, ganha o que foi declarado por último
Regra 4 ~ Estilo Inline >> Arquivo Externo >> Incorporado
Regra 5 ~ ID >> classe >> atributo >> tag
A ~ Contar o número de IDs no seletor
B ~ Contar o número de classes, atributos e pseudo-classes no seletor
C ~ Contar o número de tags e pseudo-elementos no seletor
. ~ Concatenar os três números (ABC)
#posts-recentes .post.novidade > h2 {
/* id: 1, classes: 2, tag: 1 */
/* pontuação: 121 */
}
/* seletor { propriedades } abc */
li { } /* 001 */
.destaque { } /* 010 */
li.destaque { } /* 011 */
#rodape { } /* 100 */
#rodape #logo { } /* 200 */
a[href^="www"] { } /* 011 */
tr:hover { } /* 011 */
.curiosidade::before { } /* 011 */
ul li { } /* 002 */
ul > li { } /* 002 */
h1, h2 { } /* 001, 001 */
Qual é a cor do texto?
<style>
#a .b .c { color: red; }
.d .e .f { color: green; }
.g .h #i { color: blue; }
</style>
<p id="a" class="d g">
<strong class="b e h">
<em id="i" class="c f">Texto</em>
</strong>
</p>
block
inline
inline-block
none
table
table-row
table-cell
flex
e inline-flex
grid
e inline-grid
block
, para definir um elemento com comportamento block
inline
, similarmente, para inline
inline-block
, similar a block
, porém sem quebra de linhanone
, sem renderizaçãodiv { display: inline; }
span { display: block; }
a[href*="xxx"] { display: none; }
block
e a
possibilidade de ter um fluxo lateral (sem quebra de linha), como
inline
. Exemplo:
<div class="passo">Instalar</div>
<div class="passo">Aprender</div>
<div class="passo">Programar</div>
.passo {
display: inline-block;
width: 150px;
height: 150px; /* ... */
}
table
, table-cell
, table-column
, table-column-group
,
table-footer-group
, table-header-group
, table-row
,
table-row-group
, inline-table
Hoje em dia: preferimos flex ou grid ;)
row
) ou coluna (column
) com os filhosdisplay: flex
e display: inline-flex
, foram introduzidas outras propriedades. Exemplos:flex-direction
~ row
(padrão), column
, row-reverse
, column-reverse
~ dispõe filhos na horizontal (se row
) ou vertical (column
)
justify-content
~ flex-start
(padrão), center
, space-around
, space-between
…
~ define como distribuir o espaço que sobrou
align-items
~ stretch
(padrão), flex-start
, center
…
~ define posição dos elementos no “contraeixo”
ul.horizontal {
display: flex;
justify-content: space-around;
/* tirar coisas que vem na <ul> */
list-style-type: none;
padding-left: 0;
}
ul.horizontal > li {
flex: 1; /* crescer com peso 1 */
/* espacinho e centralização */
margin-right: 4px;
text-align: center;
}
row
) ou coluna (column
)display: grid
e display: inline-grid
criam layouts 2D grid-template-rows
grid-template-columns
~ determina os tamanhos das linhas ou colunas
~ ex: auto 1fr auto
(3 partes, do meio ocupando o que sobrar)
~ ex: 200px 10% 1fr
(3 partes, 1ª fixa, 2ª fluida e 3ª restante)
~ ex: 1fr 3fr
(2 partes, 1ª ocupando 1/4 e 2ª 3/4 do espaço)
grid-row
grid-column
~ propriedade de cada filho, define onde ficar nas linhas e colunas, ex: 1 / 3
, 1 / 2
grid
<main>
<header></header>
<nav></nav>
<section></section>
<footer></footer>
</main>
CSS (elemento pai)
main {
display: grid;
grid-template-rows: 200px 1fr auto;
grid-template-columns: 300px 1fr;
}
header {
grid-column: 1 / 3;
}
nav {
grid-column: 1 / 2;
grid-row: 2 / 3;
}
section {
grid-column: 2 / 3;
grid-row: 2 / 3;
}
footer {
grid-column: 1 / 3;
grid-row: 3 / 4;
}
::: result .full-width height: 250px; display: grid; grid-template-rows: 60px 1fr auto; grid-template-columns: 90px 1fr;
:::
position
z-index
Elementos block
~ Ocupam toda a largura disponível
~ Dispostos de cima para baixo
~ Quebram linha
Elementos inline
~ Ocupam o espaço necessário (não mais)
~ Dispostos da esquerda para direita
float
e clear
::: Flutuando o parágrafo à direita:
p#amazing {
width: 200px;
float: right;
}
block
: passam a ignorar o elemento flutuanteinline
: respeitam o flutuantefloat
e clear
não é possível fazer algumas coisas
position
position
permite definirmos se o navegador vai
dispor um elemento usando o fluxo padrão ou outro fluxoposition: static
(valor padrão, para o fluxo padrão)position: relative
position: absolute
position: fixed
position: sticky
<div class="estatico">Conteúdo</div>
.estatico {
position: static; /* este já é o valor padrão */
}
::: result .full-width.no-margin
:::
position: static
não altera nadatop
, right
, bottom
e left
<div class="relativo1">Comporta-se como static...</div>
<div class="relativo2">...Mas pode ter um deslocamento.</div>
<div>Mais uma divzinha.</div>
.relativo1 { position: relative; }
.relativo2 { position: relative; left: 30px; top: -10px; }
::: result .full-width.no-margin font-weight: lighter
static
...:::
position: relative
top
:arrow_up:, right
:arrow_right:, bottom
:arrow_down: e left
:arrow_left: ajustadas
inset
que é um atalho:
.item {
position: relative;
top: 10px; right: 20px;
bottom: 30px; left: 20px;
}
.item {
position: relative;
inset: 10px 20px 30px; 🤯
}
static
)position: relative
não
são ajustados para ocupar eventuais “buracos” na páginaposition: relative
(1/2)position: relative
(2/2)img {
position: relative;
}
img:active {
left: 3px;
top: 3px;
}
Também utilizamos position: relative
para definir um “plano de
referência” para os filhos que estiverem com position: absolute
(veremos mais adiante)
top
:arrow_up:, right
:arrow_right:, bottom
:arrow_down: e left
:arrow_left:, considerando como referência o ancestral
mais próximo que esteja posicionado não estaticamente (relative
, absolute
ou
fixed
)
<html>
<div class="relativo">Este é um recipiente relativo.
<div class="absoluto">Este é absoluto.</div>
</div>
.relativo {
position: relative;
}
.absoluto {
position: absolute;
width: 50%;
right: 30px;
bottom: 10px;
}
::: result .full-width.no-margin
:::
position: absolute
Criar “drop-downs” de opções que não “empurram” a página pra baixo (porque não ocupam espaço)
position: absolute
top
, right
, bottom
, left
relativo ao seu mais próximo antecessor-posicionado (não static)
top
,
right
, bottom
e left
, assim como absolute
, porém seu ponto de
partida é o canto superior esquerdo da janela <div class="fixo">Este é um elemento fixo.</div>
.fixo { position: fixed; right: 0; bottom: 10px; }
position: fixed
<div>
representado pelo quadrado pontilhado está como
position: relative
<div>
2 possui as propriedades:
top: -20px
e left: 30px
position |
Descrição | Exemplos de uso | top , right , bottom , left |
z-index |
---|---|---|---|---|
static |
Fluxo normal | Elementos que não requerem posicionamento especial | ignorados | ignorado |
relative |
Fluxo normal, deslocado | Elementos que podem se deslocar um pouco; elementos contextos para outros absolutamente posicionados | deslocamentos nas 4 direções | determina ordem |
absolute |
Removido do fluxo, posicionado em um (x,y) relativo a um contexto | Elementos que queremos determinar os valores (x,y) para posicioná-los exatamente em algum lugar | posições referentes às 4 direções | determina ordem |
fixed |
Removido do fluxo, posicionado em um (x,y) relativo à janela | Idem ao absolute , mas a posição é fixa na janela (e não na página) |
posições referentes às 4 direções | determina ordem |
::: result .flex-align-center
:::
position: absolute
ou position: fixed