Cómo configurar el componente siguiente/imagen al 100 % de altura

4 minutos de lectura

Avatar de usuario de Jake
jake

Tengo una aplicación Next.js y necesito una imagen que llene toda la altura de su contenedor y decida automáticamente su ancho en función de su relación de aspecto.

He probado lo siguiente:

<Image
    src="/deco.svg"
    alt=""
    layout="fill"
/>

Este fragmento se compila correctamente, pero en la interfaz veo el siguiente error:

Error: la imagen con src “/deco.svg” debe usar las propiedades “ancho” y “alto” o la propiedad “sin tamaño”.

Esto me confunde porque según los documentosestas propiedades son no requerido cuando se usa layout="fill".

  • No creo que esto sea posible sin manipular la posición de img para que sea relativa, o editar el relleno en el contenedor desde la parte superior del relleno hasta el relleno izquierdo.

    – Piet van Leeuwen

    7 ago a las 23:18

avatar de usuario de francisco
francisco

Esto es lo que funcionó para mí.

con next/image:

<div style={{width: '100%', height: '100%', position: 'relative'}}>
  <Image
    alt="Mountains"
    src="https://stackoverflow.com/mountains.jpg"
    layout="fill"
    objectFit="contain"
  />
</div>

y con next/future/image:

<Image
    fill
    alt="Mountains"
    src="https://stackoverflow.com/mountains.jpg"
    sizes="100vw"/>

siguiente/futuro/imagen

  • Sí, el padre de Image debe tener relative propiedades.

    – Asad S.

    29 sep 2021 a las 15:04

  • está configurando los valores absolutos para la altura y el ancho, pero la pregunta se expresa en porcentaje

    – Hussam Jatib

    28 de noviembre de 2021 a las 10:43

  • Solo me gustaría agregar algo a esta respuesta. En mi caso, donde necesitaba que la imagen se alineara a la izquierda, puede agregar el atributo objectPosition=”left”; Se pasa a css object-position: “left”; Más información – developer.mozilla.org/en-US/docs/Web/CSS/object-position

    – Piltsen

    10 de mayo a las 15:40

  • Esta es la solución perfecta. Para aquellos que intentan esto en una tarjeta que también tiene contenido de texto, separe el contenedor de la imagen del contenedor de texto y agregue el position: relative solo al contenedor de la imagen para que no se superponga con el contenido.

    – Víctor Eke

    7 sep a las 0:25

  • Verificar siguiente/futuro/imagen‘s fill modo de diseño que hace que la imagen rellene el elemento principal.

    – francisco

    15 de septiembre a las 14:18

Avatar de usuario de Muhammet Can TONBUL
Muhammet Can TONBUL

<img src="/path/to/image.jpg" alt="" title="" />

En NextJS 12 y versiones anteriores

<Image src="/path/to/image.jpg" alt="" title="" width="100%" height="100%" layout="responsive" objectFit="contain"/>

  • 100% no es un ancho válido – Error: la imagen con src tiene una propiedad de “ancho” no válida. Se esperaba un valor numérico en píxeles pero recibió “100%”.

    – Oly Dungey

    15 de noviembre a las 7:08

  • Sí, tiene usted razón. Anulado con NextJS 13. Espero encontrar una solución al respecto y actualizar mi respuesta. @OlyDungey

    – Muhammet Can TONBUL

    15 de noviembre a las 9:39

Avatar de usuario de Peyman Baseri
peyman baseri

Aquí hay una manera: por ejemplo, quiero tener una imagen que cubra todo el ancho y alto de su contenedor, que es un div.

<div className={'image-container'}>
  <Image src={path} layout="fill" className={'image'} />
</div>

Y aquí está el estilo: (Hay un contenedor div que ocupa la mitad del ancho y la altura de la ventana gráfica y mi imagen lo cubrirá).

// Nested Styling
.image-container {
    width: 50vw;
    height: 50vh;
    position: relative;

    .image {
        width: 100%;
        height: 100%;
        position: relative !important;
        object-fit: cover; // Optional
    }
}

// Or Normal Styling
.image-container {
    width: 50vw;
    height: 50vh;
    position: relative;
  }
.image-container .image {
    width: 100%;
    height: 100%;
    position: relative !important;
    object-fit: cover; // Optional
}

  • Esa es una de las mejores soluciones que he encontrado para la imagen distante. Para imágenes locales, es mucho más fácil, pero para imágenes cargadas dinámicamente, esta solución funciona de maravilla.

    – GRosay

    3 oct 2021 a las 9:22

  • Ninguna de las soluciones que encontré aquí me funciona.

    – Hugo

    9 de septiembre a las 13:29

  • No hay necesidad de una posición relativa en el elemento de la imagen, ¡así que puede eliminar eso!

    – Ali Radmanesh

    18 de septiembre a las 7:23

Creo que también proporciono un atributo de ajuste de objeto en el elemento Imagen como este: –

<Image
    alt="Mountains"
    src="/mountains.jpg"
    layout="fill"
    objectFit="cover"
  />

El ejemplo proporcionado por Nextjs puede ser https://github.com/vercel/next.js/blob/canary/examples/image-component/pages/layout-fill.js

En caso de que no quiera usar valores absolutos para el alto y el ancho, es decir, en px, etc., puede hacer algo como esto

    <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>

Fuente original https://stackoverflow.com/a/66358533/12242764

Avatar de usuario de Knight Rider
Caballero jinete

<img alt="" src="https://some/image/uri" loading="lazy" />

En SiguienteJS

<div>
  <Image
    alt=""
    src="https://some/image/uri"
    width="100%"
    height="100%"
    layout="fill"
    objectFit="contain"
  />
</div>

Avatar de usuario de Blastfurnace
alto horno

Funciona para mí en el componente de imagen next.js

<Image src="/path/image.jpg" alt="" title="" width="100%" height="100%" layout="responsive" objectFit="cover"/>

  • no me funciona, atributos width="100%" height="100%" no parecen tener valores válidos

    – Ariel Mira

    3 de septiembre a las 18:06

¿Ha sido útil esta solución?