Sticky Footer in GatsbyJS using Flexbox

Search for a command to run...

No comments yet. Be the first to comment.
I'm a big fan of a table of contents (ToC) on the side of a blog post page, especially if it is a long article. It helps me gauge the article's length and allows me to navigate between the sections quickly. In this article, I will show you how to cre...

This year I launched a free eBook with 27 helpful tips for Vue developers for subscribers of my weekly Vue newsletter. For marketing purposes, I showed a popup on the landing page of my portfolio page each time a user visited my site. I was aware tha...

My portfolio website is built with Nuxt 3 and Nuxt Content v2. An RSS feed with my latest five blog posts is available here. In this article, you'll learn how to add an RSS feed to your Nuxt website. Setup First, let's create a new Nuxt 3 project. As...

title: How to Create a Custom Code Block With Nuxt Content v2 published: true date: tags: nuxt, vue, nuxtjs, vuejs, webdev canonical_url: https://www.mokkapps.de/blog/how-to-create-a-custom-code-block-with-nuxt-content-v2/ cover_image: https://dev-t...

Code blocks are essential for blogs about software development. In this article, I want to show you how can define a custom code block component in Nuxt Content v2 with the following features: Custom styling for code blocks inside Markdown files Sho...

I have recently developed some static websites based on GatsbyJS which have a sticky footer. A sticky footer is always positioned on the bottom of the page, even for sparse content.
Unfortunately, I had some struggle to solve this and I, therefore, want to share my learnings with you.
In a traditional HTML, CSS, JavaScript application we can use different ways to implement such a fixed footer but I prefer the Flexbox solution of Philip Walton.
Flexbox provides a nice solution for the sticky footer problem. It can be used to layout content in horizontal and vertical direction. So we just need to wrap the vertical sections (header, content, footer) in a flex container and choose which one should expand. In our case, we want the content to automatically take up all the available space in the container.
Following, you can see his solution:
<body class="site">
<header>…</header>
<main class="site-content">…</main>
<footer>…</footer>
</body>
The corresponding CSS classes:
.site {
display: flex;
min-height: 100vh;
flex-direction: column;
}
.site-content {
flex: 1;
}
Take a look at the live demo.
GatsbyJS is based on React and we, therefore, have to think different.
The basic layout.js file from the official GatsbyJS default starter has a similar structure like the following example:
const Layout = ({ children }) => (
<StaticQuery
query={graphql`
query SiteTitleQuery {
site {
siteMetadata {
title
}
}
}
`}
render={data => (
<>
<Helmet
title={data.site.siteMetadata.title}
meta={[
{ name: 'description', content: 'Sample' },
{ name: 'keywords', content: 'sample, something' },
]}
>
<html lang="en" />
</Helmet>
<Header siteTitle={data.site.siteMetadata.title} />
<div>{children}</div>
<Footer />
</>
)}
/>
);
So if we would style <body></body> and the <div>{children}</div> as proposed in Philip Walton’s solution it would not work.
But why? Because it would mean that the <Footer/> component would be included in the <body></body>.
To solve the problem I added a new <div></div> tag which is the equivalent to the <body></body> tag of the above mentioned example.
So my layout.js looks this way:
const Layout = ({ children }) => (
<StaticQuery
query={graphql`
query SiteTitleQuery {
site {
siteMetadata {
title
}
}
}
`}
render={data => (
<>
<Helmet
title={data.site.siteMetadata.title}
meta={[
{ name: 'description', content: 'Sample' },
{ name: 'keywords', content: 'sample, something' },
]}
>
<html lang="en" />
</Helmet>
<div className="site">
<Header siteTitle={data.site.siteMetadata.title} />
<div className="site-content">{children}</div>
<Footer />
</div>
</>
)}
/>
);
export default Layout;
The CSS:
.site {
display: flex;
min-height: 100vh;
flex-direction: column;
}
.site-content {
flex-grow: 1;
}
You can see a working example on my GitHub Traffic Viewer website. The first page shows a spare content but the footer is stuck to the bottom. If you sign in and see the result list, the footer is also shown on the bottom of the page.

I hope this post is also helpful for you if you try to implement a sticky footer in a GatsbyJS website.
Happy Coding!
Originally published at www.mokkapps.de.