SW Core
SW Core / CSS / Posição

Posição CSS

Colocar uma coisa em cima da outra: selo no canto do card, legenda sobre a foto, cabeçalho que gruda ao rolar — tudo com classes curtas.

O que é

São classes para tirar um elemento do lugar normal dele e prendê-lo onde você quer: no canto de um card ("Novo", "-20%"), cobrindo uma foto inteira (véu, legenda), no meio de uma caixa, grudado no topo enquanto a pessoa rola, ou preso na tela (botão do WhatsApp). Também tem as classes de rolagem (a caixa rola de lado ou para baixo) e de camada (quem fica por cima de quem).

É só CSS. A regra de ouro: o pai recebe rel (vira a "moldura") e o filho recebe abs + um pin-* dizendo em qual canto ou lado ele gruda. Sem o rel no pai, o filho procura a moldura mais acima — às vezes a página inteira — e vai parar no lugar errado.

Quando usar

  • Selo no canto de um card ou foto ("Novo", "Esgotado", "-20%"): pai rel, selo abs pin-t pin-r.
  • Camada cobrindo a foto inteira (véu escuro, legenda, botão "Ver fotos"): abs-fill.
  • Algo bem no meio de uma caixa (ícone de play sobre o vídeo): abs-mid.
  • Cabeçalho que gruda no topo enquanto a lista rola: stk (ou stk-nav para grudar logo abaixo do menu fixo).
  • Botão preso na tela (WhatsApp, voltar ao topo): fix pin-b pin-r.
  • Tabela larga no celular: envolva numa caixa ovx — ela rola de lado e não quebra a página.

Comece aqui

  1. 1

    Coloque o SW Core no <head>. As classes de posição estão no arquivo principal.

    <link rel="stylesheet" href="swcore/swcore.min.css">
  2. 2

    Marque o pai com rel e o filho com abs + o canto. Aqui, um selo no canto de cima à direita.

    Sapato socialNovo
    <div class="rel ar-16-9 r-m ov-hi">
      <img src="/sapato.jpg" alt="Sapato social" class="abs-fill media-fill">
      <span class="abs pin-t pin-r m-p" sw-badge="pri g">Novo</span>
    </div>

Todas as variações

Cada quadro abaixo é o componente de verdade, rodando. O código embaixo é exatamente o que está no quadro: copie e cole.

1. Selo nos 4 cantos

Pai com rel, filho com abs + um lado vertical (pin-t topo / pin-b baixo) + um lado horizontal (pin-l esquerda / pin-r direita). O m-p só dá um respiro da borda.

-20%
pin-t pin-l — topo, esquerda <div class="rel ar-16-9 w-fl bg-sur bd r-m"> <span class="abs pin-t pin-l m-p" sw-badge="err g">-20%</span> </div>
Novo
pin-t pin-r — topo, direita <div class="rel ar-16-9 w-fl bg-sur bd r-m"> <span class="abs pin-t pin-r m-p" sw-badge="pri g">Novo</span> </div>
Em estoque
pin-b pin-l — baixo, esquerda <div class="rel ar-16-9 w-fl bg-sur bd r-m"> <span class="abs pin-b pin-l m-p" sw-badge="suc g">Em estoque</span> </div>
3 fotos
pin-b pin-r — baixo, direita <div class="rel ar-16-9 w-fl bg-sur bd r-m"> <span class="abs pin-b pin-r m-p" sw-badge="drk g">3 fotos</span> </div>

2. Faixas, cobrir tudo e centro

pin-x estica de ponta a ponta na horizontal, pin-y de cima a baixo, pin cola nos 4 lados e pin-mid centraliza. Todos precisam do abs junto.

Frete grátis
pin-x pin-b — faixa embaixo <div class="rel ar-16-9 w-fl bg-sur bd r-m ov-hi"> <span class="abs pin-x pin-b bg-pri p-p t-ct t-p">Frete grátis</span> </div>
Últimas unidades
pin-x pin-t — faixa em cima <div class="rel ar-16-9 w-fl bg-sur bd r-m ov-hi"> <span class="abs pin-x pin-t bg-err p-p t-ct t-p">Últimas unidades</span> </div>
Top
pin-y pin-l — faixa na lateral <div class="rel ar-16-9 w-fl bg-sur bd r-m ov-hi"> <span class="abs pin-y pin-l bg-pri p-p flx alc t-p">Top</span> </div>
Cobre tudo
pin — cobre os 4 lados <div class="rel ar-16-9 w-fl bg-sur bd r-m ov-hi"> <span class="abs pin bg-pri-soft flx alc j-ct">Cobre tudo</span> </div>
No meio
pin-mid — centro exato <div class="rel ar-16-9 w-fl bg-sur bd r-m"><span class="abs pin-mid" sw-badge="pri g">No meio</span></div>

3. Atalhos prontos: abs-fill e abs-mid

Dois atalhos que já trazem o abs embutido — não precisa escrever abs nem pin-* junto. abs-fill = camada que cobre o pai inteiro. abs-mid = centralizado no pai.

Ver galeria
abs-fill — foto de fundo + véu por cima <div class="rel ar-16-9 r-m ov-hi"> <img src="/foto.jpg" alt="" class="abs-fill media-fill"> <span class="abs-fill scrim-f flx alc j-ct"> <span sw-badge="pri g">Ver galeria</span> </span> </div>
abs-mid — botão de play no meio da capa <div class="rel ar-16-9 r-m ov-hi"> <img src="/capa-video.jpg" alt="" class="abs-fill media-fill"> <span class="abs-mid"> <button sw-btn="glass rnd g" aria-label="Assistir"><i class="swi-play"></i></button> </span> </div>

4. Grudar ao rolar (sticky)

stk rola junto com o conteúdo até chegar no topo da caixa que rola — aí ele gruda. Role dentro dos quadros.

Março · 12 pedidos

Pedido #1041 — Maria

Pedido #1042 — João

Pedido #1043 — Ana

Pedido #1044 — Carlos

Pedido #1045 — Paula

Pedido #1046 — Lucas

Pedido #1047 — Bia

stk — cabeçalho que gruda no topo da caixa <div class="ar-4-3 ovy bd r-m"> <!-- caixa que rola, com altura --> <div class="stk bg-pri p-p fw6">Março · 12 pedidos</div> <p class="p-p m-0">Pedido #1041 — Maria</p> <p class="p-p m-0">Pedido #1042 — João</p> <!-- …mais pedidos… --> </div>
A

Ana

André

Antônio

B

Beatriz

Bruno

Bianca

C

Carla

César

stk em lista com vários grupos <div class="ar-4-3 ovy bd r-m"> <div class="stk bg-sur bd-b bd-mut p-p fw6">A</div> <p class="p-p m-0">Ana</p> <p class="p-p m-0">André</p> <div class="stk bg-sur bd-b bd-mut p-p fw6">B</div> <p class="p-p m-0">Beatriz</p> <!-- …um stk por letra… --> </div>

5. Rolagem dentro da caixa

Quando o conteúdo não cabe: ovx rola só de lado, ovy só para baixo, ov-hi corta o que sobra. Role dentro dos quadros.

SegundaTerçaQuartaQuintaSextaSábado
ovx — rola de lado (tabela larga no celular) <div class="ovx bd r-m"> <div class="flx gap-3 p-p w-min"> <span sw-badge="pri g">Segunda</span> <span sw-badge="pri g">Terça</span> <!-- …até Sábado… --> </div> </div>
Termos de uso. Ao contratar, você concorda com as condições abaixo. 1. O prazo começa na aprovação do layout. 2. Alterações depois da aprovação são orçadas à parte. 3. O pagamento pode ser feito no Pix ou no cartão. 4. O suporte é por WhatsApp, em dias úteis.
ovy — rola para baixo <div class="ar-16-9 ovy bd r-m p-p t-p">Termos de uso. Ao contratar…</div>
Esgotado
ov-hi — corta o que sai da caixa <div class="rel ar-16-9 bg-sur bd r-m ov-hi"> <span class="abs pin-t pin-r" sw-badge="err xg">Esgotado</span> </div>

Tabela de opções

PalavraO que fazExemplo
Posição (o tipo)
relFica no lugar normal, mas vira a "moldura" para os filhos abs.<div class="rel">
absSai do fluxo e se prende na moldura rel mais próxima. Use com um pin-*.<span class="abs pin-t pin-r">
fixPreso na tela: não sai do lugar quando a página rola.<a class="fix pin-b pin-r">
stkRola junto e gruda no topo da caixa que rola (topo = 0).<div class="stk">
stk-navIgual ao stk, mas gruda logo abaixo do menu fixo (usa a altura do menu, padrão 7rem).<aside class="stk-nav">
staVolta ao normal — desfaz a posição (útil para cancelar num tamanho de tela).<div class="sta">
Onde grudar (use junto com abs ou fix)
pin-tGruda no topo.class="abs pin-t pin-l"
pin-rGruda na direita.class="abs pin-t pin-r"
pin-bGruda embaixo.class="abs pin-b pin-l"
pin-lGruda na esquerda.class="abs pin-b pin-l"
pin-xEstica da esquerda até a direita.class="abs pin-x pin-b"
pin-yEstica de cima até embaixo.class="abs pin-y pin-l"
pinCola nos 4 lados (cobre o pai).class="abs pin"
pin-midCentraliza no meio exato.class="abs pin-mid"
Atalhos (já trazem o abs)
abs-fillCamada que cobre o pai inteiro. Não precisa de abs nem pin.<span class="abs-fill">
abs-midCentralizado no pai. Não precisa de abs nem pin.<span class="abs-mid">
Rolagem (overflow)
ovxRola só de lado; o que passa para baixo fica cortado.<div class="ovx">
ovyRola só para baixo; o que passa de lado fica cortado.<div class="ovy">
ov-hiCorta tudo que sair da caixa (sem rolagem).<div class="ov-hi">
ov-auMostra a barra de rolagem só se precisar, nas duas direções.<div class="ov-au">
ov-viDeixa o conteúdo vazar para fora (desfaz um corte).<div class="ov-vi">
ov-clCorta como o ov-hi, mas sem virar caixa de rolagem (não atrapalha o stk dos filhos).<div class="ov-cl">
Camada (quem fica por cima)
z-botAtrás de tudo (camada -1).<img class="abs-fill z-bot">
z-basCamada base (0).class="z-bas"
z-nvbNa altura do menu fixo (100).class="fix z-nvb"
z-mPor cima de tudo, nível de modal (10000).class="fix z-m"

Receitas prontas — usos reais

Situações que aparecem em quase todo site. Copie a que servir.

Card de produto com selo de desconto Ao vivo
Sapato -20%
Sapato social

R$ 239,00

Óculos Novo
Kit viagem

R$ 149,00

Relógio Esgotado
Relógio

Avise-me

<div sw-card>
  <div class="rel ar-4-3">
    <img src="/sapato.jpg" alt="Sapato" class="media-fill">
    <span class="abs pin-t pin-l m-p" sw-badge="err g">-20%</span>
  </div>
  <div class="sw-card-bdy">
    <strong>Sapato social</strong>
    <p class="m-0 t-mut">R$ 239,00</p>
  </div>
</div>
Faixa de aviso sobre a foto do imóvel Ao vivo
Fachada da casa Aberto para visitas neste sábado
<div class="rel ar-16-9 ov-hi">
  <img src="/casa.jpg" alt="Fachada da casa" class="abs-fill media-fill">
  <span class="abs pin-x pin-b bg-pri p-m t-ct fw6">Aberto para visitas neste sábado</span>
</div>
Tabela de preços que rola de lado no celular Ao vivo
PlanoPáginasE-mailsSuporteDomínioPreço
Básico52E-mailInclusoR$ 49/mês
LojaIlimitadas10WhatsAppInclusoR$ 129/mês
<div class="ovx">
  <table>
    <thead>…</thead>
    <tbody>…</tbody>
  </table>
</div>
Botão do WhatsApp preso no canto da tela Referência
<!-- fix = preso na tela · pin-b pin-r = canto de baixo à direita
     m-g = distância da borda · z-nvb = fica por cima do conteúdo -->
<a href="https://wa.me/5511999999999" class="fix pin-b pin-r m-g z-nvb"
   sw-btn="suc rnd g" aria-label="Falar no WhatsApp">
  <i class="swil-whatsapp"></i>
</a>
Menu lateral que acompanha a leitura Referência
<!-- stk-nav gruda logo abaixo do menu fixo do topo (desconta a altura dele) -->
<div class="l l-4 gap-4">
  <aside class="stk-nav">
    <a href="#precos">Preços</a>
    <a href="#duvidas">Dúvidas</a>
  </aside>
  <article>…texto longo…</article>
</div>

Precisa de quê

  • swcore.min.css — todas as classes desta página.

Cuidados — erros comuns

  • Esquecer o rel no pai: o abs vai parar no canto da página, não do card. Sempre rel no pai, abs no filho.
  • abs sozinho não sabe onde ficar. Diga o canto com pin-t/pin-r/pin-b/pin-l (ou use o atalho abs-fill/abs-mid).
  • Imagem com abs-fill precisa também de media-fill (ou w-fl h-fl of-cov). Sem isso ela fica no tamanho original dela e não cobre a caixa.
  • O pai de um abs precisa ter altura. Se ele só tem o filho abs dentro, ele fica com altura zero — dê altura com uma proporção (ar-16-9) ou com conteúdo.
  • stk "não gruda": algum pai tem overflow: hidden (ou ov-hi). Troque por ov-cl, que corta sem atrapalhar.
  • Não escreva z-index: 9999 na mão. Use a escala pronta: z-nvb para ficar junto do menu, z-m só para o que precisa ficar acima de tudo.

O que ele não faz

  • pin-mid e abs-mid centralizam com a propriedade translate, separada do transform: dá para usar direto num botão sw-btn (que sobe no hover), com zoom ou com animação — o centro não se perde. Só não escreva transform: translate(-50%, -50%) no seu CSS junto deles: aí desloca duas vezes.
  • Não há classes de distância livre (ex.: "12 px do topo"). Para afastar da borda use margem (m-p, m-m, m-g…).