Multi-column footer
Link columns, a brand block, a newsletter box and a legal line.
<footer class="site-foot">
<div class="inner">
<div class="brand">
<a class="mark" href="/"><span>A</span> Acme</a>
<p>Cloth you can trace back to the mill. Cut in Leeds since 1998.</p>
<ul class="social">
<li><a href="#" aria-label="Acme on Instagram">
<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="5"/><circle cx="12" cy="12" r="4"/><circle cx="17.5" cy="6.5" r="1" fill="currentColor" stroke="none"/></svg>
</a></li>
<li><a href="#" aria-label="Acme on LinkedIn">
<svg viewBox="0 0 24 24" aria-hidden="true" class="fill"><path d="M4.98 3.5A2.5 2.5 0 1 1 5 8.5a2.5 2.5 0 0 1 0-5zM3 9h4v12H3zM10 9h3.8v1.7h.05c.53-.95 1.83-1.95 3.77-1.95 4.03 0 4.78 2.5 4.78 5.76V21h-4v-5.6c0-1.34-.02-3.06-1.9-3.06-1.9 0-2.2 1.45-2.2 2.96V21h-4z"/></svg>
</a></li>
<li><a href="/feed.xml" aria-label="Acme journal feed">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16"/><circle cx="5" cy="19" r="1.5" fill="currentColor" stroke="none"/></svg>
</a></li>
</ul>
</div>
<nav aria-label="Shop">
<p class="col-title">Shop</p>
<ul>
<li><a href="/shirts/">Shirts</a></li>
<li><a href="/knitwear/">Knitwear</a></li>
<li><a href="/accessories/">Accessories</a></li>
<li><a href="/sale/">Sale</a></li>
</ul>
</nav>
<nav aria-label="Company">
<p class="col-title">Company</p>
<ul>
<li><a href="/studio/">The studio</a></li>
<li><a href="/mills/">Our mills</a></li>
<li><a href="/journal/">Journal</a></li>
<li><a href="/jobs/">Jobs <span class="tag">2 open</span></a></li>
</ul>
</nav>
<nav aria-label="Help">
<p class="col-title">Help</p>
<ul>
<li><a href="/delivery/">Delivery</a></li>
<li><a href="/returns/">Returns</a></li>
<li><a href="/sizing/">Size guide</a></li>
<li><a href="/contact/">Contact</a></li>
</ul>
</nav>
<div class="signup">
<p class="col-title">Monthly dispatch</p>
<p class="blurb">Notes on cloth and making. One email a month.</p>
<form novalidate>
<label class="sr" for="foot-email">Email address</label>
<input type="email" id="foot-email" name="email" placeholder="you@example.com" autocomplete="email">
<button type="submit">Join</button>
</form>
</div>
</div>
<div class="legal">
<p>© 2026 Acme Cloth Ltd. Registered in England, 04918822.</p>
<nav aria-label="Legal">
<a href="/privacy/">Privacy</a>
<a href="/terms/">Terms</a>
<a href="/cookies/">Cookies</a>
<a href="/accessibility/">Accessibility</a>
</nav>
</div>
</footer>* { box-sizing: border-box; margin: 0; }
body { font: 16px/1.6 system-ui, -apple-system, sans-serif; }
.site-foot {
background: #fff;
border-top: 1px solid #e2e7ef;
padding: 46px 24px 26px;
color: #5b6b83;
}
.inner {
max-width: 1140px;
margin: 0 auto;
display: grid;
gap: 34px;
grid-template-columns: 1.6fr repeat(3, 1fr) 1.4fr;
}
/* ---- brand ---- */
.mark { display: inline-flex; align-items: center; gap: 9px; font-weight: 700; font-size: 1.05rem;
color: #16202e; text-decoration: none; }
.mark span { width: 30px; height: 30px; display: grid; place-items: center; border-radius: 8px;
background: #3b4fe4; color: #fff; font-size: .95rem; }
.brand p { font-size: .88rem; margin-top: 12px; max-width: 30ch; }
.social { display: flex; gap: 8px; list-style: none; padding: 0; margin: 16px 0 0; }
.social a { display: grid; place-items: center; width: 34px; height: 34px;
border: 1px solid #e2e7ef; border-radius: 8px; color: #5b6b83; }
.social a:hover { border-color: #3b4fe4; color: #3b4fe4; background: #f7f8fe; }
.social svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8;
stroke-linecap: round; stroke-linejoin: round; }
.social svg.fill { fill: currentColor; stroke: none; }
/* ---- link columns ---- */
.col-title { font-size: .85rem; font-weight: 600; color: #16202e; margin-bottom: 12px; }
.site-foot nav ul { list-style: none; padding: 0; margin: 0; display: grid; gap: 9px; }
.site-foot nav a { font-size: .89rem; color: #5b6b83; text-decoration: none; }
.site-foot nav a:hover { color: #3b4fe4; text-decoration: underline; text-underline-offset: 3px; }
.tag { font-size: .68rem; background: #eaf7f1; color: #1a7a50; padding: 2px 7px;
border-radius: 999px; margin-left: 4px; }
/* ---- signup ---- */
.blurb { font-size: .85rem; margin-bottom: 12px; }
.signup form { display: flex; gap: 7px; }
.signup input {
flex: 1; min-width: 0; font: inherit; font-size: .88rem; padding: 9px 11px;
border: 1px solid #d9e0ea; border-radius: 8px; color: #16202e;
}
.signup input:focus { outline: 2px solid #3b4fe4; outline-offset: 1px; border-color: #3b4fe4; }
.signup button {
font: inherit; font-size: .88rem; font-weight: 500; padding: 9px 16px;
border: 0; border-radius: 8px; background: #3b4fe4; color: #fff; cursor: pointer;
}
.signup button:hover { background: #2a3abf; }
.sr { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
/* ---- legal ---- */
.legal {
max-width: 1140px;
margin: 36px auto 0;
padding-top: 18px;
border-top: 1px solid #eef1f6;
display: flex;
gap: 16px;
flex-wrap: wrap;
align-items: center;
font-size: .82rem;
color: #8593ab;
}
.legal nav { margin-left: auto; display: flex; gap: 16px; flex-wrap: wrap; }
.legal a { color: #8593ab; text-decoration: none; }
.legal a:hover { color: #3b4fe4; }
@media (max-width: 900px) {
.inner { grid-template-columns: repeat(2, 1fr); }
.brand, .signup { grid-column: 1 / -1; }
}
@media (max-width: 480px) {
.inner { grid-template-columns: 1fr; gap: 26px; }
.legal nav { margin-left: 0; }
.signup form { flex-direction: column; }
}How it works
Each link group is a nav with its own label. Four <nav> elements on a page with no labels give a screen reader user four identical "navigation" landmarks. aria-label="Shop" and so on makes the landmark list actually useful.
The column headings are paragraphs, not headings. "Shop", "Company" and "Help" label a navigation group; they are not sections of the document. Marking them as <h3> — which is common — injects four headings into your outline right at the end of every page, which is noise when a screen reader user pulls up the heading list.
The grid ratio is not equal. 1.6fr repeat(3, 1fr) 1.4fr gives the brand and the signup more room than the link columns need, which is how the proportions stay right without any fixed widths.
Two breakpoints, and the brand spans both times. At 900 pixels it becomes two columns with the brand and signup spanning the full width; at 480 everything stacks. grid-column: 1 / -1 does the spanning without knowing the column count.
Social links have labels. An icon-only link with no text has no accessible name at all. Each one names the network and the company, because "Instagram" alone tells a screen reader user nothing about whose account it is.
Accessibility notes
The footer is a real <footer> element, exposed as a contentinfo landmark, so screen reader users can jump straight to it.
The newsletter field has a real label, visually hidden with clip-path rather than display: none, which would hide it from assistive technology too. A placeholder is not a label.
Link text is 14 pixels here, which is about the floor. Footers are often set smaller than that and it is functional navigation, not fine print — do not go below it.
Making it yours
Four link columns is about the limit before a footer becomes a sitemap. If you genuinely need more, the minimal footer plus a real sitemap page is usually the better structure.
The 2 open tag on the jobs link is a small thing that measurably increases clicks. Keep it accurate or remove it — a stale count is worse than none.
Related templates
Minimal footer
One line, three variants — centred, split and with a status dot.
HTMLCSSHTML email boilerplate
A table-based email shell that survives Outlook and Gmail.
HTMLNewsletter signup
An inline email capture with validation and a success state, in three layouts.
HTMLCSSJavaScriptSticky footer
A footer that sits at the bottom of the viewport on short pages and below the content on long ones.
HTMLCSSJavaScriptCheck your version
Once you have edited this, the HTML validator will catch any tag you left unclosed, and the formatter will tidy the indentation. Both run in your browser.