px
cm
, mm
, in
, pt
, pc
%
em
(letra M)rem
(letra M - root)ex
(letra x)ch
(número 0) vh
(1/100 altura)vw
(1/100 largura)vmin
(1/100 menor dim.)vmax
(1/100 maior dim.)
Cronologicamente:
Era 1 ~ Tabelas dentro de tabelas dentro de tabelas ➡️
Era 2
~ DIV e SPAN + display: table
Era 3
~ DIV e SPAN + float
e clear
Era 4
~ semânticas + float
e clear
Era 5 ~ Flexbox
Era 6 ~ Grid + flexbox
.container {
display: grid;
grid-template: auto 1fr auto
/ auto 1fr auto;
}
.container {
display: flex;
}
.sidebar {
width: 30%;
}
.content {
flex: 1;
overflow-y: auto;
}
.above-the-fold {
background-image: url('...');
background-size: cover;
background-repeat: no-repeat;
height: 100vh;
}
header {
position: sticky;
top: 0;
}
#menu {
position: absolute; left: -200px;
width: 200px; height: 100vh;
}
body.menu-open #menu {
left: 0;
}
body.menu-open .content {
left: 200px;
}
.container {
column-count: 3;
column-gap: 1rem;
width: 100%;
}
.item {
break-inside: avoid;
margin-bottom: 1rem;
}
inline
de um elemento:
.container {
text-align: center; 🤯
}
block
:
.elemento-centralizado {
margin-left: auto;
margin-right: auto;
}
position
absolute
ou fixed
.centraliza-position { left: calc(50% - LARGURA_ELEMENTO / 2); }
LARGURA_ELEMENTO
é a largura
conhecida do elemento que queremos centralizar.centraliza-position-fluid {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
.card-list {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 1rem;
}
.product {
min-width: 100px;
height: 150px;
flex: 1;
}
<div class="card-list">
<div class="product">...</div>
<div class="product">...</div>
<div class="product">...</div>
<div class="product">...</div>
<div class="product">...</div>
<div class="product">...</div>
</div>
.modal {
position: fixed;
left: 50%; top: 50%;
transform: translate(-50%, -50%);
z-index: 100;
opacity: 0;
pointer-events: none;
}
.modal.visible {
opacity: 1;
pointer-events: initial;
}
#mask {
position: fixed;
background-color: #0003;
inset: 0; z-index: 10;
opacity: 0;
pointer-events: none;
}
.modal.visible ~ #mask {
opacity: 1;
pointer-events: initial;
}
<body>
...
<div class="modal visible">
...
</div>
<div class="modal">
...
</div>
<div id="mask"></div>
</body>
:root {
--cor-de-destaque: #339966;
}
strong {
color: var(--cor-de-destaque);
}
Dar nome a valores
outro-seletor
deve descender de seletor
seletor {
--nome: valor;
}
outro-seletor {
propriedade: var(--nome);
}
--
var(nome)
no valor:root { /* ⬅️ escopo global */
--cor-texto: #333;
--cor-fundo: #fff;
--cor-texto-destaque: #396;
--largura-pagina: 800px;
--largura-produto: calc(
var(--largura-pagina) / var(--produtos-por-linha)
- var(--espaco-produtos)
);
--espaco-produtos: 2rem;
--produtos-por-linha: 4;
}
.container {
max-width: var(--largura-pagina);
display: flex; flex-wrap: wrap;
gap: var(--espaco-produtos);
}
.produto {
width: var(--largura-produto, 200px);
}
.produto
)body {
--background: white;
}
.sidebar {
--background: gray;
}
.module {
background: var(--background);
}
<body>
<main>
<div class="module">
Tenho fundo branco.
</div>
<main>
<aside class="sidebar">
<div class="module">
Tenho fundo cinza.
</div>
</aside>
</body>
O .module
terá cor diferente dependendo de onde aparece na árvore (cascata do CSS)
::: did-you-know . width: 520px; margin-left: 1rem; Tipos de dados válidos:
length
number
percentage
length-percentage
color
image
url
integer
angle
time
resolution
transform-list
transform-function
custom-ident
:::
@property
:
@property --x {
syntax: '<number>';
inherits: false;
initial-value: 42;
}
elemento.style.setProperty('--x', value);
line-height: 1em;
, mas qualquer valor de medida de tamanho
pode ser usado
.espacamento-simples { line-height: 1em; }
.espacamento-duplo { line-height: 2em; }
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mauris eros, fermentum eget dolor sit amet.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mauris eros, fermentum eget dolor sit amet.