Next.js background-image css property cant load the image
I'm trying to access a static image to use within an inline backgroundImage property within React.
i am working with reactjs and next.js then i faced an issue with adding images with next.js but fixed this by using image loader called : Next.js + Images,
now i could add images normally with normal html img tag
Example: <img src={ img } />
this works.
but when i tried to add css background images as the following:
const team = (props) => { const img = require("../../assets/images/security-team.jpg"); const styling = { backgroundImage: `url('${img}')`, width:"100%", height:"100%" } console.log(img); return ( <div className="team" style={styling}> </div> );
}
here was the console.log results :
/_next/static/images/security-team-449919af8999ae47eaf307dca4dda8e1.jpg
the image doesn't appear and no errors happened then, i tried to type in the browser website-url + the console.log results the image appeared !
223 Answers
First import the image file
import bg from '../../assets/images/security-team.jpg'
then apply inline style
style={{ backgroundImage: `url(${bg.src})`, width: '100%', height: '100%', }}
7With [email protected]
I had my image in the public folder and then in the style file I used the following and it worked.
background-image: url('/image.svg');
0All the solutions here don't allow the main benefits of NextJs custom <Image>
component which serves optimized, responsive images by default and has immense benefits. When I can, I use z-index
to "fake" a css background image.
However, this method does have the limitation of not having repeatable options like a CSS background would.
Note that this example uses Tailwind CSS.
<div className="h-screen"> <div className="absolute -z-10"> <Image src="./some.jpeg" layout="fill" objectFit="cover" quality={100} /> </div> <div> Some overlay things go in here </div> </div>
4css file in styles/home.scss
Image file in public/bg-img.png
.content_bg { margin: 50px 0; background-image: url('../public/bg-img.png'); height: 500px; background-size: cover; background-repeat: no-repeat; }
3The package next-images works for me.
First :
yarn add next-images
Then, in a next.config.js file :
const withImages = require('next-images') module.exports = withImages()
Then you can do :
<div style={{ backgroundImage: "url(" + `${require("./path-to-the-image")}` + ")", width: "100%", height:[HEIGHT OF THE IMAGE], backgroundRepeat: "no-repeat", backgroundSize: "cover" }} >XXX</div>
For more info on next-images : https://github.com/twopluszero/next-images
3As nextjs
documentation says (https://nextjs.org/docs/basic-features/static-file-serving):
Next.js can serve static files, like images, under a folder called public
in the root directory.
Files inside public
can then be referenced by your code starting from the base URL (/
).
So the right way to reference our images from the public
folder:
CSS example:
background-image: url('/your-image.jpg');
JSX example:
import Image from 'next/image' <Image src="./your-image.jpg" alt="Image description" width="64" height="64" />
1when i used JSX styles then added position absolute property it worked just fine.
Like this:
<style JSX>{` .team { width:100%; height:100%; position:absolute; background: url('`+img+`') no-repeat; } `}</style>
You can also try to use '/static/images/security-team.jpg' without import if you place your image in '/static/images/' folder. For example:
const styling = { backgroundImage: "url('/static/images/security-team.jpg')", width:"100%", height:"100%" } return ( <div className="team" style={styling}></div> );
1You can put the image in the public folder, and access it like so:
const team = (props) => { const styling = { backgroundImage: `url('./security-team.jpg')`, width:"100%", height:"100%" } return ( <dev className="team" style={styling}> </dev> );
2all what you have to do is to change url
from background-image: url('/public/images/my-img.jpg');
to background-image: url('/static/images/my-img.jpg');
I'm using Next.js v12.0.10, and it fails to load css background image when I try something like:
<div style={{ backgroundImage: "url('/public/a.jpg')"}}> </div>
but when I omit the /public
in the image url, everything works:
<div style={{ backgroundImage: "url: '/a.jpg')"}}> </div>
Just like Ivan says above:
Files inside public can then be referenced by your code starting from the base URL (/).
1the /static directory was deprecated. anyone who tries to use it will probably get the error message in their console but here the link containing NextJS' explanation of why they chose to deprecate the static directory.
for use dynamic image
first of all declare style like this
let style = { backgroundImage: "url(" + props.image + ")", }
then
<div style={style}> <div className="content">content here</div> </div>
Next.js can serve static files, like images, under a folder called public in the root directory. Files inside public can then be referenced by your code starting from the base URL (/).
For example, if you add an image to public/me.png, the following code will access the image:
background-image: url('/img/imge1.png');
Next.js by default supports .scss and related files. Internally, Next.js uses a Webpack loader to load css that will follow url("")
values and translate them to the output file name in the same way that import bg from '../../assets/images/security-team.jpg'
will.
So as long as you're importing your css in a way that Webpack can understand import styles from './MyModule.module.scss'
or similar, you can directly url('relative/path')
.
For example:
.team { background-image: url('../../assets/images/security-team.jpg'), width: 100%, height: 100% /* ... */ }
And the above does NOT require it to be in the public folder
<div className="VistaCodeLab" style={{backgroundImage: ` url('data:image/png;base64,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')`}}></div>
use like this with base64 image
Online conversion tool for image to base64 https://www.base64-image.de/
image must be in public (example with tailwind)
<div className="my-5 lg:my-6"> <img src="./logotipo/logo.png" alt="easybanklogo" /> </div>
<div class="horizontal-layout horizontal-menu navbar-static dark-layout 1-column footer-static bg-full-screen-image blank-page blank-page" data-open="hover" data-menu="horizontal-menu" data-col="1-column" data-layout="dark-layout" style={{ backgroundImage: "url(/assets/images/pages/auth-bg.jpg)" }} >
For me, this type of url works:
background-image: url("../../public/path/to/image.jpg")
The trick is to use two ..
before /public
(assuming your images are in public folder)
What I noticed in next js :
- you can access files in the public folder direcly by including it's path from the public folder (not including the public folder or a route to that public folder ) for and inline BackgroundImage => "/image.png"
for and background-image(In a css file) => define a path from the file your coding in to that image eg "../public/image.png"
Back to what i was working on ...
<section style={{ backgroundImage : "url('/4.jpg')" }}>
in next.js 14 with tailwind
import imagePath from "public/image.png" // inset-0 makes it fill the entire space within its parent container. <div className="absolute -z-10 inset-0"> <Image src={imagePath} alt="always add alt" fill style={{objectFit:'cover'}} /> {product.title} </div>
Example using Nextjs, node modules and scss. import styles from "../styles/Home.modules.scss" import Image from "next/image" export default function Home() { <div className={styles.background_image}> <Image width={2746} //use the width of the image being used height={4681} //use the height of the image being used layout="fill" alt="water_portrait" src="./home/water_portrait.jpg" //image saved in public/home /> </div> } //styles/Home.module.scss .background_image { position: absolute; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 1; } .somethingElse{ positsion: relative; z-index:10; }
I managed to get around this by using the src property of the image object so:
{ img.src }
Their documentation shows a background image implemented via the below method though:
import Image from 'next/image' <Image />
Here's a live demo - https://image-component.nextjs.gallery/background
1ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJobGpwZGeBcoWOp5yxrF2fwG6uwJyioKqfqrulecimmKCdXZjAtHnPq6apnaKpxm6vwKerZqSflrFuwMeeZKKlkZyy