← Back to Navigation

Navigation pattern

Responsive site footer

A structured footer with identity, useful links, contact details, and a narrow-screen layout.

Live example

See the pattern in isolation

The preview uses the same locked-down composition policy as the Agate IDE.

PreviewSandboxed

Canonical source

Copy it, change it, keep it plain

These exact files power the preview and the IDE handoff.

Source

HTML

<footer class="site-footer" id="about">
  <div class="site-footer__intro">
    <a class="site-footer__brand" href="#about">Northline Studio</a>
    <p>Clear websites for small organizations doing useful work.</p>
  </div>

  <nav class="site-footer__nav" aria-label="Footer navigation">
    <div>
      <h2>Explore</h2>
      <ul>
        <li id="work"><a href="#work">Selected work</a></li>
        <li id="services"><a href="#services">Services</a></li>
        <li><a href="#about">About the studio</a></li>
      </ul>
    </div>
    <div>
      <h2>Contact</h2>
      <ul>
        <li><a href="mailto:hello@example.com">Email the studio</a></li>
        <li id="accessibility"><a href="#accessibility">Accessibility</a></li>
        <li id="privacy"><a href="#privacy">Privacy</a></li>
      </ul>
    </div>
  </nav>

  <p class="site-footer__legal">© 2026 Northline Studio. Built with plain HTML and CSS.</p>
</footer>
Source

CSS

* {
  box-sizing: border-box;
}

body {
  display: grid;
  min-height: 100vh;
  margin: 0;
  background: #f7efe6;
  color: #2b151d;
  font-family: system-ui, sans-serif;
}

.site-footer {
  display: grid;
  grid-template-columns: minmax(14rem, 1.2fr) minmax(18rem, 1fr);
  gap: 3rem clamp(2rem, 7vw, 7rem);
  align-self: end;
  padding: clamp(2rem, 6vw, 5rem);
  border-block-start: 5px solid #d94f9d;
  background: #2b151d;
  color: #f7efe6;
}

.site-footer__brand {
  color: inherit;
  font-size: clamp(1.8rem, 5vw, 3.5rem);
  font-weight: 900;
  line-height: 1;
  text-decoration-thickness: 0.12em;
  text-underline-offset: 0.15em;
}

.site-footer__intro p {
  max-width: 32rem;
  margin: 1.25rem 0 0;
  color: #ead8ca;
  font-size: 1.05rem;
  line-height: 1.6;
}

.site-footer__nav {
  display: grid;
  grid-template-columns: repeat(2, minmax(9rem, 1fr));
  gap: 2rem;
}

.site-footer h2 {
  margin: 0 0 1rem;
  color: #f3a7c5;
  font-size: 0.78rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.site-footer ul {
  display: grid;
  gap: 0.75rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.site-footer a {
  color: inherit;
}

.site-footer__nav a {
  text-decoration-color: #d94f9d;
  text-decoration-thickness: 0.14em;
  text-underline-offset: 0.2em;
}

.site-footer a:hover {
  color: #f3a7c5;
}

.site-footer a:focus-visible {
  outline: 4px solid #70d6e8;
  outline-offset: 4px;
}

.site-footer__legal {
  grid-column: 1 / -1;
  margin: 0;
  padding-block-start: 1.5rem;
  border-block-start: 1px solid #8b6d77;
  color: #cdb8bf;
  font-size: 0.88rem;
}

@media (max-width: 42rem) {
  .site-footer {
    grid-template-columns: 1fr;
  }

  .site-footer__nav {
    grid-template-columns: 1fr;
  }
}

How it works

A small pattern with visible decisions

The footer uses separate identity, navigation, and legal regions so its structure remains clear even without CSS. Its navigation has its own accessible label rather than repeating the page’s primary navigation label.

Grid provides two useful columns at wider sizes and becomes one natural reading sequence on small screens. Lists group related links, while generous spacing and visible focus styles keep every destination easy to find.

Make it yours

Open both files in the workspace.

Agate will protect different saved work before loading this example.