¿Cómo puedo evitar que una imagen rebose una caja de esquina redondeada con CSS3?


Si utilizo este código, la imagen no está recortada por las esquinas redondeadas del div (lo que resulta en las esquinas cuadradas de la imagen que cubren las esquinas redondeadas del div):

<div style="border-radius: 1em; -moz-border-radius: 1em; -webkit-border-radius: 1em; overflow:hidden;">
    <img src="big-image.jpg" />
</div>

¿Alguien sabe cómo obtener un div de corder redondeado para evitar que una imagen infantil se desborde?

Author: Bret Walker, 2009-02-25

10 answers

Esto puede o no funcionar en su situación, pero considere hacer de la imagen un fondo CSS. En FF3, lo siguiente funciona bien:

<div style="
  background-image:   url(big-image.jpg);
  border-radius:      1em;
  height:             100px;
  -moz-border-radius: 1em;
  width:              100px;"
></div>

No estoy seguro de que haya otra solución: si aplicas un borde a la imagen en sí (por ejemplo, 1em profundo), obtienes el mismo problema de esquinas cuadradas.

Editar: aunque, en el caso "agregar un borde a la imagen", el recuadro de imagen es correcto, es solo que la imagen no está al ras con el elemento div. Para comprobar el resultados, agregue style="border:1em solid black;border-radius:1em;-moz-border-radius:1em;" a la etiqueta img (con width y height establecidos apropiadamente, si es necesario).

 11
Author: kyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 21:08:26

Mi último Chrome, Firefox, y Safari clip de la imagen al borde del contenedor-radio (según lo previsto).

Http://jsfiddle.net/RQYnA/12/embedded/result /

En Firefox 15, veo la imagen recortada cuando el contenedor tiene {overflow: hidden}. (Recorte de contenido hijo parece haber sido añadido en Gecko 2.0.)

En Chrome 23 y Safari 5, veo la imagen recortada solo cuando el contenedor tiene {position: static; overflow: hidden} y la imagen tiene {position: static}.

 22
Author: sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-17 21:02:26

Incluso cuando overflow se establece en hidden, border-radius no recorta su contenido. Esto es por diseño.

Una solución sería establecer border-radius en la imagen así como su contenedor.

<div style="border-radius: 16px; ...">
    <img src="big-image.jpg" style="border-radius: 16px; ..." />
</div>

Otra forma sería establecer la imagen como el fondo del contenedor usando background-image; pero hay problemas con este método en Firefox antes de la versión 3 (ver este error) - no es que eso te moleste demasiado.

 3
Author: Alex Barrett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-05 17:44:11

Pruebe esta solución:

  1. La imagen en la etiqueta img está presente y allí se establece el ancho y la altura.
  2. Luego escóndelo con visibility:hidden. El ancho y la altura permanecen intactos.
  3. Después de eso, establecerá la misma fuente que la imagen de fondo y se recortará.

<a class="thumb" href="#" style="background-image: url('./img/pic1.jpg');" title="Picture">
  <img border="0" src="./img/pic1.jpg" alt="Pic" height="100" width="150" />
</a>

#page .thumb {
background-repeat: no-repeat;
background-position: left top;
border: 3px #e5dacf solid;
display: block;
float: left;}

#page .thumb img {
display: block;
visibility: hidden;}
 1
Author: Gabox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-27 15:03:13

Ahora también hay background-clip en css3. Funciona en todos los principales navegadores. Las opciones son border-box, padding-box y content-box. En tu caso, creo que querrás usar padding-box.

-webkit-background-clip: padding-box;
-moz-background-clip:    padding; 
background-clip:         padding-box;
 1
Author: thomasrye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-29 05:01:34

Si convierte la imagen en una imagen de fondo en lugar de contenido, la imagen no recortará las esquinas redondeadas (al menos en FF3).

También puede agregar un relleno al div, o un margen para la imagen para agregar un relleno adicional entre el borde redondeado y la imagen.

 0
Author: Illandril,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 21:12:45

Un simple border-radius en la etiqueta img funciona bien en las versiones actuales de Safari 5, Chrome 16, Firefox 9:

<div>
    <img src="big-image.jpg" style="border-radius: 1em;" />
</div>
 0
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-31 21:46:12

Creo que este problema ocurre cuando la imagen o el padre de la imagen es position:absolute. Esto es comprensible ya que el ajuste absoluto elimina el elemento del flujo del documento.

Estoy 90% seguro de que he visto una solución para esto, actualizaré este post cuando lo haga: D

 0
Author: Brad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-09 11:44:52

El recorte adicional suele estar solo dentro del margen de error del grosor del borde. Simplemente deje que el radio interior sea ligeramente más pequeño para que el margen de error caiga debajo del borde en lugar de al lado de is

<div style='border-radius:5px;border:thin solid 1px;'>
   <img style='border-radius:4px' />
</div>
 0
Author: Matt Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 19:17:50

Debe especificar un ancho y una altura exactos con overflow:hidden, si desea que su div recorte su imagen

 -1
Author: Barbaros Alp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 22:03:35