Gatsby is a static web site framework that’s based on React.
We can use it to create static websites from external data sources and more.
In this article, we’ll look at how to create a site with Gatsby.
Get and Display a Single Image
We can get and display a single image with Gatsby.
We use the gatsby-image to get and add an image.
To install the packages required packages, we run:
npm i gatsby-plugin-sharp gatsby-transformer-sharp
To do this, we write:
gatsby-config.js
const path = require('path');
module.exports = {
plugins: [
{
resolve: `gatsby-source-filesystem`,
options: {
name: `images`,
path: path.join(__dirname, `src`, `images`),
},
},
`gatsby-plugin-sharp`,
`gatsby-transformer-sharp`,
],
}
Then we can get the image on our page by writing:
src/pages/index.js
import React from "react"
import { useStaticQuery, graphql } from "gatsby"
import Img from "gatsby-image"
const IndexPage = () => {
const data = useStaticQuery(graphql`
query {
file(relativePath: { eq: "laptop.jpg" }) {
childImageSharp {
fluid {
base64
aspectRatio
src
srcSet
sizes
}
}
}
}
`)
return (
<div>
<Img fluid={data.file.childImageSharp.fluid} alt="laptop" />
</div>
)
}
export default IndexPage
We specify that we want to get laptop.jpg in our GraphQL query.
Then we get the fields and put them into the Img component in the JSX.
We can simplify this by writing:
import React from "react"
import { useStaticQuery, graphql } from "gatsby"
import Img from "gatsby-image"
const IndexPage = () => {
const data = useStaticQuery(graphql`
query {
file(relativePath: { eq: "laptop.jpg" }) {
childImageSharp {
fluid(maxWidth: 200, quality: 75) {
...GatsbyImageSharpFluid
}
}
}
}
`)
return (
<div>
<Img
fluid={data.file.childImageSharp.fluid}
alt="laptop"
style={{ border: "2px solid purple", borderRadius: 5, height: 250 }}
/>
</div>
)
}
export default IndexPage
We simplify the query with the GatsbyImageSharpField fragment, which is equivalent to what we have in the previous example.
And we add the style into our Img component.
We can set the fluid prop to force an aspect ratio by overriding the aspectRatio field:
import React from "react"
import { useStaticQuery, graphql } from "gatsby"
import Img from "gatsby-image"
const IndexPage = () => {
const data = useStaticQuery(graphql`
query {
file(relativePath: { eq: "laptop.jpg" }) {
childImageSharp {
fluid(maxWidth: 200, quality: 75) {
...GatsbyImageSharpFluid
}
}
}
}
`)
return (
<div>
<Img
fluid={data.file.childImageSharp.fluid}
alt="laptop"
fluid={{
...data.file.childImageSharp.fluid,
aspectRatio: 1.6,
}}
/>
</div>
)
}
export default IndexPage
Also, we can set the image with a fixed-width with the following query:
import React from "react"
import { useStaticQuery, graphql } from "gatsby"
import Img from "gatsby-image"
const IndexPage = () => {
const data = useStaticQuery(graphql`
query {
file(relativePath: { eq: "laptop.jpg" }) {
childImageSharp {
fixed(width: 250) {
...GatsbyImageSharpFixed
}
}
}
}
`)
return (
<div>
<Img fixed={data.file.childImageSharp.fixed} alt="laptop" />
</div>
)
}
export default IndexPage
We have the fixed field with the width set to 250.
So the image will be displayed with 250px width.
Conclusion
We can display a single image in various ways by using various queries with Gatsby.