Reputation: 3695
I am trying to use Tailwind CSS in an Next.js project but I cant't use my Tailwind classes with Next.js Image component.
Here's my code:
<Image
src={img.img}
alt="Picture of the author"
width="200"
height="200"
className="bg-mint text-mint fill-current"
></Image>
I want to use Tailwind classes instead of the height
and width
property of the Next.js Image. But I can't because it throws me an error. Also, unsized
property throws another error saying it's deprecated. Is there any solution?
Here is the error if I don't use the height
and width
property.
When I use the layout='fill'
property it shows only one picture. And if I use the unsized
property, then the following error is shown.
Upvotes: 71
Views: 63926
Reputation: 6809
Use the fill
property.
Next.js 14.1.0
example:
<Link
href="/"
className="relative h-4 w-36 sm:h-5 sm:w-48"
>
<Image
src="/logo.svg"
alt="logo"
priority={true}
fill={true}
/>
</Link>
From the official documentation:
fill={true}
A boolean that causes the image to fill the parent element, which is useful when the width and height are unknown.
The parent element must assign position: "relative"
, position: "fixed"
, or position: "absolute"
style.
By default, the img element will automatically be assigned the position: "absolute"
style.
Official documentation: https://nextjs.org/docs/app/api-reference/components/image#props
Upvotes: 0
Reputation: 4653
When I read through the Next.js 13 documentation I found out that it is very important to understand that when you are using fill with nextjs Image tag, the parent container should be relative.
fill
fill={true} // {true} | {false}
A boolean that causes the image to fill the parent element instead of setting width and height.
The parent element must assign position: "relative", position: "fixed", or position: "absolute" style.
By default, the img element will automatically be assigned the position: "absolute" style.
The default image fit behavior will stretch the image to fit the container. You may prefer to set object-fit: "contain" for an image which is letterboxed to fit the container and preserve aspect ratio.
Alternatively, object-fit: "cover" will cause the image to fill the entire container and be cropped to preserve aspect ratio. For this to look correct, the overflow: "hidden" style should be assigned to the parent element.
For more information, see also:
position
object-fit
object-position
So I did it like this:
<div className="relative w-full h-full overflow-hidden">
<Image
className="rounded-sm"
object-fit="cover"
fill={true}
alt={group?.name ? group.name : "no details" }
src="https://www.oddcircles.com/images/group-image.png"
/>
</div>
Upvotes: 3
Reputation: 635
It's been solved, no more need for hacky solutions. Just style them using tailwind directly!
https://nextjs.org/blog/next-12-2
Upvotes: 4
Reputation: 754
You can use a div container and apply a class to it.
<div className="bg-mint text-mint fill-current">
<Image
src={img.img}
alt="Picture of the author"
width="200"
height="200">
</Image>
</div>
Upvotes: -1
Reputation: 1616
There’s a discussion and related example over at the Next.js GitHub project. It sounds like that example achieves what you want to do. tl;dr:
<div className="h-64 w-96 relative"> // "relative" is required; adjust sizes to your liking
<Image
src={img.img}
alt="Picture of the author"
layout="fill" // required
objectFit="cover" // change to suit your needs
className="rounded-full" // just an example
/>
</div>
The image will preserve its original aspect ratio and fill / cover (or whatever object-fit
you chose) the size of the outer div
, which you can set using Tailwind classes. Other styles, like rounded corner, can be applied to the Image
.
Upvotes: 109