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.

1. No Marcador / Botão

anchor-name

Declara o nome da âncora (inicia sempre com --):

#ponto-1 {
  anchor-name: --ancora-1;
}
2. No Card Flutuante

position-anchor

Amadurece a conexão apontando para a âncora:

#card-1 {
  position-anchor: --ancora-1;
}
3. Lado de Ancoragem

position-area

Define o quadrante de acoplamento (top, bottom, left, right):

#card-1 {
  position-area: bottom center;
  margin-top: 10px;
}
4. Inversão Automática

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.

1

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.

2

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.

3

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).

4

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!

⚠️
Regra de Ouro: É proibido o uso de JavaScript. A abertura dos cartões funciona nativamente através do atributo HTML5 popover e a ancoragem é 100% calculada pelo CSS.

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.

🔍
Localize seu número de chamada (1 a 32):

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.

Passo 1

Criar Repositório Público

Acesse o GitHub, clique em New Repository, dê um nome (ex: anchor-positioning-aluno-01) e marque como Public.

Passo 2

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).

Passo 3

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.

Passo 4

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!