He estado tratando de resolver cómo centrar una imagen de gran tamaño dentro de un div usando solo CSS.
Estamos utilizando un diseño fluido, por lo que el ancho de los contenedores de imágenes varía al igual que el ancho de la página (la altura de div es fija). La imagen se encuentra dentro de un div, con un valor de sombreado de recuadro para que parezca que está mirando la imagen a través de la página.
La imagen en sí ha sido dimensionada para llenar el div circundante en su valor más amplio posible (el diseño tiene un max-width
valor).
Es bastante fácil de hacer si la imagen es más pequeña que el div circundante:
margin-left: auto;
margin-right: auto;
display: block;
Pero cuando la imagen es más grande que el div, simplemente comienza en el borde izquierdo y está descentrada a la derecha (estamos usando overflow: hidden
).
Podríamos asignar un width=100%
, pero los navegadores hacen un pésimo trabajo al cambiar el tamaño de las imágenes y el diseño web se centra en imágenes de alta calidad.
¿Alguna idea sobre centrar la imagen para que overflow:hidden
corte ambos bordes de manera uniforme?
Respuestas:
Intenta algo como esto. Esto debería centrar cualquier elemento enorme en el medio vertical y horizontalmente con respecto a su padre, sin importar sus dos tamaños.
fuente
-100%
para arriba / derecha / abajo / izquierda? Con eso, el contenedor podría tener literalmente cualquier ancho.-100%
problema ^^. Por cierto: si agregamin-width
ymin-height
de100%
usted básicamente obtiene unbackground-size: cover;
comportamiento con etiquetas de imagen -> jsfiddleEsta es una antigua Q, pero una solución moderna sin flexbox o posición absoluta funciona así.
Mostrar fragmento de código
Entonces, ¿por qué funciona?
A primera vista parece que cambiamos 50% a la derecha y luego 50% a la izquierda nuevamente. Eso resultaría en un cambio a cero, ¿y qué?
Pero el 50% no es lo mismo, porque el contexto es importante. Si utiliza unidades relativas, se calculará un margen como porcentaje del ancho del elemento principal , mientras que la transformación será del 50% en relación con el mismo elemento.
Tenemos esta situación antes de agregar el CSS
Con el estilo agregado
margin-left: 50%
tenemosY los
transform: translateX(-50%)
cambios de vuelta a la izquierdaDesafortunadamente, esto solo funciona para el centrado horizontal, ya que el cálculo del porcentaje de margen siempre es relativo al ancho. Es decir, no solo
margin-left
ymargin-right
, sino tambiénmargin-top
ymargin-bottom
se calculan con respecto al ancho.La compatibilidad del navegador no debería ser un problema: https://caniuse.com/#feat=transforms2d
fuente
margin-top: 50%
será el 50% del ancho . No la altura deseada.-webkit-transform: translateX(-50%);
por siColoque un div grande dentro del div, céntrelo y centre la imagen dentro de ese div.
Esto lo centra horizontalmente:
HTML:
CSS:
Demostración: http://jsfiddle.net/Guffa/L9BnL/
Para centrarlo verticalmente también, puede usar lo mismo para el div interno, pero necesitaría la altura de la imagen para colocarla absolutamente dentro de ella.
fuente
width
configuración en el contenedor, será el ancho del elemento primario y la imagen se centrará incluso si la página es más estrecha que la imagen, es decir, se ocultará tanto el borde izquierdo como el derecho. : jsfiddle.net/Guffa/L9BnL/2Tarde al juego, pero descubrí que este método es extremadamente intuitivo. https://codepen.io/adamchenwei/pen/BRNxJr
CSS
HTML
fuente
display: flex
en el contenedor principal yalign-self: center
en la imagen. Aquí hay una versión optimizada: codepen.io/anon/pen/dWKyeyNo utilice un ancho o alto fijo o explícito para la etiqueta de la imagen. En cambio, codifíquelo:
ex: http://jsfiddle.net/xwrvxser/1/
fuente
Soy un gran admirador de hacer que una imagen sea el fondo de un div / nodo, entonces solo puede usar el
background-position: center
atributo para centrarlo independientemente del tamaño de la pantallafuente
El ancho y la altura son solo por ejemplo:
Tiene que funcionar para usted si la izquierda y la parte superior de su div principal no están en la parte superior e izquierda de la ventana de su pantalla. Esto funciona para mi.
fuente
Encontré que esta es una solución más elegante, sin flexión:
fuente
Sobre la base de la gran respuesta de @ yunzen:
Supongo que muchas personas que buscan este tema intentan usar una imagen grande como imagen de fondo de "héroe", por ejemplo, en una página de inicio. En este caso, a menudo querrían que el texto aparezca sobre la imagen y que se reduzca bien en dispositivos móviles.
Aquí está el CSS perfecto para dicha imagen de fondo (úsela en la
<img>
etiqueta):fuente
Una opción que puede usar es que
object-fit: cover
se comporta un poco comobackground-size: cover
. Más sobre ajuste de objetos .ignore todos los JS a continuación, eso es solo para la demostración.
La clave aquí es que necesita establecer la imagen dentro de un contenedor y darle las siguientes propiedades.
He creado una demostración a continuación donde cambias el alto / ancho del contenedor y lo ves en juego. La imagen siempre estará centrada vertical y horizontalmente. Ocupará el 100% de su ancho y altura principal, y no se estirará / aplastará. Esto significa que se mantiene la relación de aspecto de la imagen. Los cambios se aplican al acercar / alejar.
El único inconveniente
object-fit
es que no funciona en IE11.fuente