Как установить для следующего компонента / изображения высоту 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"/>
Другие вопросы по тегам