Как установить для следующего компонента / изображения высоту 100%
У меня есть приложение Next.js, и мне нужно изображение, которое заполняет всю высоту его контейнера и автоматически определяет его ширину в зависимости от соотношения сторон.
Я пробовал следующее:
<Image
src="/deco.svg"
alt=""
layout="fill"
/>
Этот фрагмент успешно компилируется, но на интерфейсе я вижу следующую ошибку:
Ошибка: изображение с src "/deco.svg" должно использовать свойства "width" и "height" или свойство "unsized".
Это меня смущает, потому что, согласно документации , эти свойства не требуются при использовании
layout="fill"
.
23 ответа
Вот что сработало для меня:
<div style='width:104px;height:104px;position:relative;'>
<Image
alt="Mountains"
src="/mountains.jpg"
layout="fill"
objectFit="contain"
/>
</div>
В 2023 году все вышеперечисленные решения устарели.
используйте ниже
<Image
src="url"
width={0}
height={0}
sizes="100vw"
style={{ width: '100%', height: 'auto' }} // optional
/>
Github: https://github.com/vercel/next.js/discussions/18474#discussioncomment-5501724
<img src="/path/to/image.jpg" alt="" title="" />
В NextJS
<Image src="/path/to/image.jpg" alt="" title="" width="100%" height="100%" layout="responsive" objectFit="contain"/>
Вот способ: например, я хочу иметь изображение, которое покрывает всю ширину и высоту своего контейнера, который является div.
<div className={'image-container'}>
<Image src={path} layout="fill" className={'image'} />
</div>
И вот стиль: (Есть контейнер div, который занимает половину ширины и высоты области просмотра, и мое изображение будет закрывать его.)
.image-container {
width: 50vw;
height: 50vh;
> div {
width: 100%;
height: 100%;
position: relative !important;
}
.image {
object-fit: cover; // Optional
}
}
PS Я использовал стилизованные компоненты для вложенных стилей.
И в следующем v13
<Image
src={src}
width={200}
height={160}
alt={alt}
sizes="(max-width: 768px) 100vw,
(max-width: 1200px) 50vw,
33vw"
style={{ height: '100%', width: '100%' }} //The point is right there!
//OR className='w-100 h-100'
/>
благодаря @Abílio Soares Coelho
Я думаю также предоставить атрибут соответствия объекта элементу Image следующим образом: -
<Image
alt="Mountains"
src="/mountains.jpg"
layout="fill"
objectFit="cover"
/>
Пример, предоставленный Nextjs, может быть https://github.com/vercel/next.js/blob/canary/examples/image-component/pages/layout-fill.js
<Image
src="/deco.svg"
alt="alternative text"
fill
style={{height: "100%", width:"100%"}}
/>
Возможно, эти другие ответы предназначены для другой версии NextJS, но ни один из них не работал у меня.
Я использую NextJS v13.0.0
Для этого у меня был следующий JSX (используя TailwindCSS, должно быть легко перевести на ванильный CSS):
<div className="h-screen relative">
<Image
src="/image.png"
alt="pic of dog"
fill={true}
/>
</div>
Важной частью здесь является создание родительского элемента div.position: relative
(и установить его высоту/ширину так, как вы хотите для изображения) и установитьfill={true}
. Я получил это из документации NextJS Image:
Общая документация по изображениям: https://nextjs.org/docs/api-reference/next/image .
Документация поfill
атрибут: https://nextjs.org/docs/api-reference/next/image#fill
Надеюсь, это поможет кому-то!
Вот что работает сnext/image
в следующих 13.5
width={0}
height={0}
sizes="100vw"
style={{ width: 'auto', height: '50px' }}
<Image
src="/deco.svg"
alt=""
width={1000}
height={1000}
className='nextimg'
/>
в том месте, где ваша таблица стилей добавляет
.nextimg{
width: 100%;
height: auto;
}
Кстати, я добавил 1000 для ширины и высоты, когда небольшое изображение становится нечетким . и думаю, что вы можете добавить свои собственные стили для класса nextImg
Для меня в Next 13 все работало нормально после того, как я импортировал изображение и переместил его изpublic
:
До
<Image src='/link-to-public/img.png' alt="topmoto.pro" />
После
import img from "../assets/img.png";
...
<Image src={img} alt="topmoto.pro" />
Если вы не хотите использовать абсолютные значения высоты и ширины, то есть в пикселях и т. д., вы можете сделать что-то вроде этого
<div style={{ position: "relative", width: "100%", paddingBottom: "20%" }} >
<Image
alt="Image Alt"
src="/image.jpg"
layout="fill"
objectFit="contain" // Scale your image down to fit into the container
/>
</div>
Первоисточник /questions/56649842/kak-ispolzovat-komponent-izobrazheniya-v-nextjs-s-neizvestnoj-shirinoj-i-vyisoto/56791684#56791684
В Next 13 при получении изображений с внешних URL-адресов вы можете просто передать fill.
import Image from "next/image";
<Image
src="https://unaqua.com.br/img/logo.png"
fill
/>
работает для меня
<div
style={{
display: 'flex',
flexDirection: 'column',
height: 'auto',
maxHeight: 343,
position: 'relative'
}}
>
<Image
src={`<YOU_IMAGE>`}
alt="thumbnail"
width="100%"
height="100%"
layout="responsive"
/>
</div>
Начиная с Next.js 13.5, добавлениеlayout="responsive"
& добавление имени класса и стиля в файл .css работает
<Image
width={100}
height={120}
layout="responsive"
className="sample_img"
src="..."
alt={"Sample Image"}
/>
Файл стилей.css:
.sample_img{
max-height: 5rem;
aspect-ratio: 1;
}
После загрузки CSS изображение изменится с100px * 120px
к5rem * 5rem
размеры
If someone use NextJS with styled components. It works:
const Container = styled.div`
width: 100%;
div, span {
position: unset !important;
}
.image {
object-fit: contain;
width: 100% !important;
position: relative !important;
height: unset !important;
}
`;
<Container>
<Image src={ src }
layout="fill"
className={ "image" }
/>
</Container>
<Image src='/images/wipster-medialibrary-1.png' width="100%" height="100%" layout="responsive" objectFit="contain"></Image>
у меня сработало, если вы хотите, чтобы изображение помещалось в родительский контейнер.
НЕ используйте layout='fill', на самом деле по какой-то причине изображение помещается на весь экран.
в изменениях CSS --->
.next-image {
max-width: 100%;
div {
position: unset !important;
padding: 0px !important;
img {
position: unset !important;
width: 100% !important;
height: 100% !important;
max-height: 100% !important;
max-width: 100% !important;
}
}
}
в компоненте JSX или TSX --->>
<div className="next-image min-h-[150px]">
<Image
src={product?.images?.length ? product?.images[0]?.src : placeholderImage}
width={imgWidth}
height={imgHeight}
layout="responsive"
loading={imgLoading}
quality={100}
alt={product?.title || 'Product Image'}
className="your Class"
/>
</div>
Добавить опору
unsized
:
<Image
unsized
layout="fill"
src={src}
/>
Когда вы используетеlayout
имущество стоимостьюfill
, Next.js автоматически установитposition: absolute
иtop:0
,left:0
,right:0
, иbottom:0
Свойства CSS компонента изображения, благодаря которым он заполняет свой контейнер. Однако Next.js все равно необходимо знать исходные размеры изображения, чтобы он мог определить соотношение сторон и соответствующим образом изменить его размер.
Вы можете либо предоставить свойствам ширины и высоты соответствующие значения, либо вместо этого использовать свойство unsize, которое сообщает Next.js использовать исходные размеры изображения.
<Image
src="/deco.svg"
alt = ""
layout="fill"
unsized
/>
Изображение с автоматической высотой и шириной. Это отобразит фактический размер изображения.
<Image
src={selectedImage}
width={0}
height={0}
alt=""
style={{ width: "auto", height: "100%" }} // optional
/>
Изображение с фиксированной высотой и шириной.
<div style={{ position: "relative", width: "200px", height: "279px" }}>
<Image
src={selectedImage}
fill
alt=""
style={{ objectFit: "cover" }} // As per your requirement
/>
</div>
<img alt="" src="https://some/image/uri" loading="lazy" />
В NextJS
<div>
<Image
alt=""
src="https://some/image/uri"
width="100%"
height="100%"
layout="fill"
objectFit="contain"
/>
</div>
У меня это работает в компоненте изображения next.js
<Image src="/path/image.jpg" alt="" title="" width="100%" height="100%" layout="responsive" objectFit="cover"/>