2012-03-08 23 views
12

En la actualidad, todas mis imágenes tener este aspecto:¿Cómo mostrar solo una parte de una imagen solo con la etiqueta img?

enter image description here

HTML

<img class="photo" src="foo.png" /> 

CSS

.photo { 
    padding: 3px; 
    border: 1px solid #000; 
    background: #fff; 
    width: 64px; 
    height: 64px; 
    display: block; 
} 

Este espera que la relación de aspecto de la imagen para siempre ser 1: 1. Ahora, un nuevo requisito de proyecto ha llegado para que las imágenes no tengan que ser 1: 1. Por el contrario, pueden ser rectángulos altos:

enter image description here

En este caso, me gustaría sólo para revelar la plaza superior de la imagen:

enter image description here

¿Cómo se puede hacer esto con una etiqueta simple <img>? Sé cómo hacerlo con dos etiquetas: simplemente envuelva el img con un div, aplique relleno 3px al div y coloque el URL como background-image del img. Pero me gustaría saber cómo hacer esto de una manera más limpia, sin una etiqueta HTML adicional.

+0

no estaba seguro si había mirado mi solución anterior o no, sino porque jsFiddle no funcionaba la noche anterior, no podía refinarlo (y por lo tanto no estaba haciendo lo que esperaba) hasta hoy. Entonces, si miró antes y notó que no funcionó, intente buscar nuevamente. Todavía hay una pequeña pieza del rompecabezas que resolver para que sea compatible con los navegadores cruzados. – ScottS

Respuesta

8

Actualización final: probado IE8 +: This solution utiliza un refinamiento de la idea de Surreal Dreams de utilizar el contorno para obtener el borde. Esto permite una simplicidad de navegador cruzada en comparación con the linear-gradient method que estaba buscando. Funciona en IE7, excepto el outline (no compatible).

Manteniéndolo como una etiqueta img con un src lo mantiene semántico.

A margin: 1px se aplica para dar outline "espacio" en el diseño, ya que por naturaleza outline ocupa espacio. La altura cero suprime la imagen principal y el relleno se utiliza para crear la altura deseada para la imagen de fondo (que se establece igual que la imagen principal) para mostrar.

HTML

<img class="photo" src="foo.png" style="background-image: url(foo.png)" /> 

CSS

.photo { 
    padding: 64px 0 0 0; 
    border: 3px solid #fff; 
    outline: 1px solid #000; 
    margin: 1px; 
    width: 64px; 
    height: 0px; 
    display: block; 
} 
+0

Necesito que funcione en IE8 y 9 y los degradados no funcionan en esos navegadores. – JoJo

+0

@ JoJo - hecho! Usando un refinamiento de la idea de Surreal Dreams para bordearlo, tenemos una etiqueta img haciendo lo que desees, trabajando en IE8 +. – ScottS

+0

Muchas gracias @ScottS, ¡su código me salvó el día! – TechGirl

7

Eche un vistazo a la propiedad clip.

http://www.w3schools.com/cssref/pr_pos_clip.asp

Aquí un ejemplo con su imagen: http://jsfiddle.net/2U3CE/1/

Código:

img{ 
    position:absolute; 
    clip:rect(0,73px,73px,0); 
} 
+3

El único inconveniente de este método es que ** solo funciona cuando la posición está configurada como absoluta o fija **, lo que lo convierte en un momento horrible para organizar su página. – animuson

+0

No puedo tener imágenes de posición absoluta/fija como señala @aminuson. – JoJo

+0

sí, esto es nervioso. podrías poner un div con 'position: relative;' alrededor de las imágenes, pero eso no sería muy bonito. – Alex

0

Pienso que usted es l ooking para la propiedad CSS dentro CLIP:

.photo-clipped { 
    position: absolute; 
    clip: rect(0px,64px,64px,0px); 
} 

<img src="some_image.gif" class="photo photo-clipped" /> 
1

En realidad, se puede hacer esto con una sola etiqueta - un div. ¿Importa que no sea una etiqueta img?

<div style="display: inline-block; width: 50px; height: 50px; background: url(test.jpg);"></div> 

Nunca se utiliza una etiqueta <img>, que acaba de configurar el div y ya está. Establezca el tamaño, agregue relleno, borde, etc., y preferiblemente coloque todos los estilos reutilizables en una clase y configure la imagen de fondo por div. Se termina con esto:

<div class="hip2bsquare" style="background: url(test.jpg);"></div> 

CSS:

.hip2bsquare { 
    display: inline-block; 
    width: 50px; 
    height: 50px; 
    border: 3px solid #FFF; 
    outline: 1px solid #000; 
} 

Esto utiliza la frontera para agregar blanco y delinear añadir negro. Probablemente sea un abuso del modelo de caja, pero debería darle la apariencia.

+2

Sin embargo, el uso de una división elimina el significado semántico de la imagen. – animuson

+0

El cartel parecía mucho más interesado en hacer esto con una sola etiqueta, sin preservar el significado semántico del código. –

+0

Solo estoy tirando eso. Ya sea que a OP le guste la idea o no, cualquiera que pueda tropezar con la página en el futuro debe saberlo. – animuson

Cuestiones relacionadas