O que é o CSS Anchor Positioning?
É a especificação nativa da W3C que permite grudar magneticamente um cartão ou balão flutuante a qualquer elemento da página (como um botão/marcador sobre uma imagem), sem depender de scripts ou bibliotecas de terceiros.
anchor-name
Declara o nome da âncora (inicia sempre com --):
#ponto-1 {
anchor-name: --ancora-1;
}
position-anchor
Amadurece a conexão apontando para a âncora:
#card-1 {
position-anchor: --ancora-1;
}
position-area
Define o quadrante de acoplamento (top, bottom, left, right):
#card-1 {
position-area: bottom center;
margin-top: 10px;
}
position-try-fallbacks
Inverte o card se faltar espaço na borda da tela:
#card-1 {
position-try-fallbacks: flip-block;
}
Como Fazer a Atividade em 4 Passos
Siga as instruções abaixo para concluir seu projeto com sucesso.
Consulte seu Tema
Localize na seção As 32 Temáticas o cartão do seu número de chamada (Aluno Nº 01 a 32). Copie o prompt pronto da imagem.
Gere a Imagem em 16:9
Gere 1 imagem no formato horizontal (16:9) na IA (Copilot, ChatGPT, Gemini, Midjourney) com os 5 elementos nas posições indicadas. Salve como imagem.jpg.
Preencha o CSS das Âncoras
Abra o style.css do template e complete as regras de anchor-name, position-anchor e position-area para cada um dos 5 pontos (#ponto-1 a #ponto-5).
Publique no GitHub Pages
Crie um repositório público no GitHub, envie seus arquivos e ative o GitHub Pages para entregar o link funcional do site ao professor.
Atenção Crucial: A Proporção da Imagem Impacta Diretamente nos Pinos!
Sim! Se a imagem for gerada quadrada (1:1) ou vertical (9:16), os marcadores numerados posicionados por porcentagem não coincidirão com os elementos visuais.
Por isso, o template CSS trava o cenário na proporção horizontal aspect-ratio: 16 / 9; com object-fit: cover.
Exija sempre da IA o formato widescreen / paisagem (16:9) para que a arte preencha 100% da moldura sem cortes!
Template Pronto para Alunos
Copie o código abaixo. O HTML, a proporção 16:9 e os 5 marcadores sobre a imagem já estão configurados!
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Atividade Prática: CSS Anchor Positioning</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header class="topo">
<span class="badge">CSS Anchor Positioning • Imagem IA (16:9) com 5 Elementos</span>
<h1>Tema: [Nome da Sua Temática Aqui]</h1>
<p>Aluno(a): [Seu Nome] • Chamada: Aluno Nº [Seu Número]</p>
</header>
<main class="container-infografico">
<div class="cenario-imagem">
<!-- 1 Única Imagem Widescreen (16:9) Gerada na IA -->
<img id="foto-cenario" src="imagem.jpg" alt="Cenário Temático Widescreen 16:9">
<!-- PONTO 1: Superior Esquerdo -->
<button type="button" id="ponto-1" class="pin-hotspot pin-top-left" popovertarget="card-1">1</button>
<div id="card-1" class="card-ancorado" popover>
<h3>1. [Nome do Elemento 1]</h3>
<p>Descrição técnica do elemento localizado no canto superior esquerdo.</p>
</div>
<!-- PONTO 2: Superior Direito -->
<button type="button" id="ponto-2" class="pin-hotspot pin-top-right" popovertarget="card-2">2</button>
<div id="card-2" class="card-ancorado" popover>
<h3>2. [Nome do Elemento 2]</h3>
<p>Descrição técnica do elemento localizado no canto superior direito.</p>
</div>
<!-- PONTO 3: Centro -->
<button type="button" id="ponto-3" class="pin-hotspot pin-center" popovertarget="card-3">3</button>
<div id="card-3" class="card-ancorado" popover>
<h3>3. [Nome do Elemento 3]</h3>
<p>Descrição técnica do elemento localizado no centro da imagem.</p>
</div>
<!-- PONTO 4: Inferior Esquerdo -->
<button type="button" id="ponto-4" class="pin-hotspot pin-bottom-left" popovertarget="card-4">4</button>
<div id="card-4" class="card-ancorado" popover>
<h3>4. [Nome do Elemento 4]</h3>
<p>Descrição técnica do elemento localizado no canto inferior esquerdo.</p>
</div>
<!-- PONTO 5: Inferior Direito -->
<button type="button" id="ponto-5" class="pin-hotspot pin-bottom-right" popovertarget="card-5">5</button>
<div id="card-5" class="card-ancorado" popover>
<h3>5. [Nome do Elemento 5]</h3>
<p>Descrição técnica do elemento localizado no canto inferior direito.</p>
</div>
</div>
</main>
<footer class="rodape">
<p>Material Pedagógico • Prof. Esp. Leandro Gaudio Rosa • Entrega no GitHub Pages</p>
</footer>
</body>
</html>
/* ==========================================================================
CSS ANCHOR POSITIONING: TEMPLATE PARA O ALUNO (PROPORÇÃO 16:9 TRAVADA)
Prof. Esp. Leandro Gaudio Rosa
Instruções: O layout, proporção 16:9 e os pinos já estão prontos.
Complete apenas a seção "DESAFIO DO ALUNO" no final!
========================================================================== */
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: system-ui, -apple-system, sans-serif;
background-color: #0b0f19;
color: #f8fafc;
min-height: 100vh;
padding: 2rem 1rem;
display: flex;
flex-direction: column;
align-items: center;
}
.topo { text-align: center; margin-bottom: 2rem; }
.badge {
display: inline-block;
background: rgba(56, 189, 248, 0.15);
color: #38bdf8;
font-size: 0.8rem;
font-weight: 700;
padding: 0.3rem 0.8rem;
border-radius: 999px;
margin-bottom: 0.5rem;
}
.topo h1 { font-size: 1.8rem; margin-bottom: 0.3rem; color: #fff; }
.topo p { color: #94a3b8; }
.container-infografico {
width: 100%;
max-width: 960px;
display: flex;
justify-content: center;
}
/* Cenário com Proporção 16:9 Fixa para Alinhamento Perfeito dos Pinos */
.cenario-imagem {
position: relative;
width: 100%;
aspect-ratio: 16 / 9; /* Garante que a proporção não distorça os pinos */
border-radius: 16px;
overflow: hidden;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6);
border: 1px solid rgba(255, 255, 255, 0.15);
background: #111827;
}
.cenario-imagem img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
/* Estilo dos 5 Pinos Marcadores */
.pin-hotspot {
position: absolute;
width: 36px;
height: 36px;
border-radius: 50%;
background: linear-gradient(135deg, #0284c7 0%, #38bdf8 100%);
color: #07090e;
border: 2px solid #ffffff;
font-weight: 900;
font-size: 0.95rem;
cursor: pointer;
box-shadow: 0 0 15px rgba(56, 189, 248, 0.7);
transition: transform 0.2s;
z-index: 10;
}
.pin-hotspot:hover { transform: scale(1.2); }
/* Posições relativas dos 5 Pinos na Proporção 16:9 */
.pin-top-left { top: 18%; left: 18%; }
.pin-top-right { top: 18%; right: 18%; }
.pin-center { top: 50%; left: 50%; transform: translate(-50%, -50%); }
.pin-bottom-left { bottom: 18%; left: 18%; }
.pin-bottom-right { bottom: 18%; right: 18%; }
/* Reset básico do Popover nativo */
.card-ancorado {
border: none;
inset: auto;
margin: 0;
background: #1e293b;
color: #ffffff;
border: 1px solid #38bdf8;
border-radius: 10px;
padding: 1rem 1.25rem;
width: 250px;
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.8);
}
.card-ancorado h3 { font-size: 0.95rem; color: #38bdf8; margin-bottom: 0.3rem; }
.card-ancorado p { font-size: 0.82rem; color: #cbd5e1; line-height: 1.4; }
.rodape { margin-top: 3.5rem; color: #64748b; font-size: 0.85rem; text-align: center; }
/* ==========================================================================
👇 DESAFIO DO ALUNO: COMPLETE AS REGRAS ABAIXO COM CSS ANCHOR 👇
========================================================================== */
/* --- PONTO 1 (Superior Esquerdo) --- */
#ponto-1 {
anchor-name: --ancora-1;
}
#card-1 {
position-anchor: --ancora-1;
position-area: bottom center; /* Ajuste conforme pedido no seu tema */
margin-top: 10px;
position-try-fallbacks: flip-block;
}
/* --- PONTO 2 (Superior Direito) --- */
#ponto-2 {
anchor-name: --ancora-2;
}
#card-2 {
position-anchor: --ancora-2;
position-area: bottom center;
margin-top: 10px;
position-try-fallbacks: flip-block;
}
/* --- PONTO 3 (Centro) --- */
#ponto-3 {
anchor-name: --ancora-3;
}
#card-3 {
position-anchor: --ancora-3;
position-area: top center;
margin-bottom: 10px;
position-try-fallbacks: flip-block;
}
/* --- PONTO 4 (Inferior Esquerdo) --- */
#ponto-4 {
anchor-name: --ancora-4;
}
#card-4 {
position-anchor: --ancora-4;
position-area: top center;
margin-bottom: 10px;
position-try-fallbacks: flip-block;
}
/* --- PONTO 5 (Inferior Direito) --- */
#ponto-5 {
anchor-name: --ancora-5;
}
#card-5 {
position-anchor: --ancora-5;
position-area: top center;
margin-bottom: 10px;
position-try-fallbacks: flip-block;
}
As 32 Temáticas (1 Imagem em 16:9 com 5 Elementos)
Localize o cartão com seu número de chamada (Aluno 01 a 32), copie o prompt widescreen para a IA e confira as 5 posições.
Como Entregar no GitHub Pages
Hospede sua página gratuitamente no GitHub para avaliação pelo professor.
Guia Passo a Passo para o Aluno
O GitHub Pages transforma o seu repositório de código em um site público acessível por qualquer pessoa na internet.
Criar Repositório Público
Acesse o GitHub, clique em New Repository, dê um nome (ex: anchor-positioning-aluno-01) e marque como Public.
Fazer Upload dos Arquivos
Suba os 3 arquivos fundamentais para a raiz do repositório: index.html, style.css e a sua imagem.jpg (16:9).
Ativar o GitHub Pages
Vá na aba Settings do repositório > menu lateral Pages. Em Branch, escolha main (ou master), pasta / (root) e clique em Save.
Enviar os Links ao Professor
Aguarde 1 minuto. O GitHub exibirá o link público do seu site: https://seu-usuario.github.io/nome-do-repo/. Envie este link e o link do repositório!