2011-08-29 30 views
10

Tengo un simple botón HTML que contiene texto y una imagen:¿Cómo alinear verticalmente una imagen de tamaño desconocido al centro de un div?

HTML:(Ya el http://jsfiddle.net/EFwgN)

<span class="Button"> 
    <img src="http://www.connectedtext.com/Image/ok.gif" /> 
    Small Icon 
</span> 

CSS:

span.Button {display:inline-block; margin:2px 4px;padding:3px 6px; 
      background-color:#ddd; height:24px; line-height:24px; 
      vertical-align:middle;} 
span.Button img {vertical-align:middle;} 

que pueda Propongo una combinación que se ajuste a estos requisitos:

  • La imagen y el texto deben estar verticalmente en el medio del div, con el texto en el medio de la imagen. Debería ser ordenado.
  • horizontalmente - la imagen puede estar en cualquier ancho, y el botón debe crecer para mostrarlo.
  • Verticalmente - la imagen puede estar en cualquier altura, más pequeña o más grande que el botón. Cuando la imagen es más grande, no me importa si se muestran o recortan los píxeles adicionales, siempre que estén centrados.
  • El botón está en una altura fija. Actualmente utilizo line-height para centrar el texto.
  • El botón debe quedar bien alineado con otros botones y texto.
  • La solución tiene que trabajar en todas las últimas versiones de los principales navegadores, e Internet Explorer 8.

He aquí una jsFiddle con mi código actual: http://jsfiddle.net/EFwgN
(tenga en cuenta el pequeño icono es ligeramente por debajo del centro del botón)

+0

Sé que hay un sinnúmero de duplicados, pero podría hacer que todo funcione bien ... – Kobi

+0

Ok, está en marcha. * (al menos) * ** 150 ** reputación en moneda de recompensa por una buena solución, extra ** 50 ** si la solución es compatible con IE8 en modo compatibilidad. – Kobi

+0

He encontrado una forma de desactivar la vista de compatibilidad, ¡así que no hay puntos extra! http://twigstechtips.blogspot.com/2010/03/css-ie8-meta-tag-to-disable.html – Kobi

Respuesta

4

Una solución sencilla, si necesita no menos de IE8 (en modo estándar): http://jsfiddle.net/kizu/EFwgN/31/

Sólo añadir margin: -100px 0-img, por lo que el margen negativo comían cualquier altura grande:

span.Button img {vertical-align:middle; margin:-100px 0; 
       position:relative; top:-2px;} 

He agregado position: relative; top:-2px; solo para verlo mejor :)

Pero si necesita compatibilidad con el modo de compatibilidad o IE lt 8 (por alguna razón), la cosa con margen no funcionará. Por lo tanto, necesitará un marcado adicional: http://jsfiddle.net/kizu/EFwgN/28/, pero es un poco hacky y funciona solo con la altura del botón fijo (como en el ejemplo).

+0

IE8 El modo de compatibilidad está muerto para mí. Olvídalo ':)'. Además, la imagen no está * exactamente * centrada, se ve mejor con '-1px', para mí, lo cual me preocupa. ¡Interesante sin embargo! – Kobi

+0

Se centra de acuerdo con los ascendentes y descenders de la fuente, pero no visualmente, así que sí, '-1px' o' -2px' arreglarían la parte visual :) – kizu

+0

Entonces, si usaras otro bloque en línea en lugar de solo texto, Verás que está perfectamente centrado: http://jsfiddle.net/kizu/EFwgN/36/ El problema está en la alineación vertical del texto, por lo que está bien arreglarlo moviendo la imagen un poco. – kizu

0

por qué no hacer que la imagen encogimiento en el caso en que de hecho es más alto que el botón?

span.Button img { 
    vertical-align:middle; 
    max-height: 100%; 
} 
+0

Prefiero no, tengo algunas imágenes que están rellenas con píxeles transparentes y puedo ocultarlas libremente. Por cierto, no está mal, pero las imágenes todavía no están en el centro del botón. – Kobi

0

Probablemente me olvidé de algunos de los requisitos, como la configuración de span. La altura del auto en automático me sirvió de algo.

Si lo que quieres es botón de crecimiento sólo en horizontal, vertical, con desbordamiento recortada, que tal vez lo haría así:

span.Button {display:inline-block; margin:2px 4px;padding:3px 6px; 
      background-color:#ddd; width:auto; height:24px; line-height:24px;overflow:hidden; 
      vertical-align:middle; 
      } 

con un poco de javascript para determinar la altura img y, a continuación, centrarlo en consecuencia.

+0

El ícono grande está recortado, con está bien, pero el texto y el ícono no están centrados: http://jsfiddle.net/uNDCL/ – Kobi

1

Utilice la visualización basada en tablas. Requiere contracción de la imagen debido a un conflicto entre display:table-cell; y height:24px. Muy similar a su intento abortado de los comentarios, pero incluye la display:block; requerida en la imagen: http://jsfiddle.net/shanethehat/5ck3s/

+0

Gracias por esto. Es una buena opción si quiero volver a escalar las imágenes, pero aquí prefiero no hacerlo. – Kobi

1

hay que ir, usando jQuery:

$(".button img").load(function() 
      { 
       $(this).each(function() 
          { 
           sh = $(this).outerHeight(); 
           if (sh > 24){ 
           alert(sh); 
           $(this).css("margin-top", - (sh - 24)/2 + 'px'); 
           } 
          }); 
      }); 

Editar: acabo de ver que lo quería puro CSS, así , aquí está el código golfo por ahí!:)

0

¿Qué tal ... esto?

http://jsfiddle.net/92K8J/

Agregado display:inline-block a las imágenes, y se retira el height fijo del contenedor.

+0

Lo sentimos, pero la altura fija es uno de los requisitos más importantes ...Tengo algunas imágenes rellenas con píxeles transparentes, en su mayoría, y no quiero recortarlas porque 1. Es aburrido 2. Se comparten con otros elementos de la interfaz de usuario, y no quiero copiarlos. – Kobi

Cuestiones relacionadas