Eu tenho tentado resolver como centralizar uma imagem de grandes dimensões dentro de uma div usando apenas css.
Como estamos usando um layout fluido, a largura dos contêineres da imagem varia conforme a largura da página (a altura da div é fixa). A imagem fica dentro de uma div, com um valor inserido na sombra da caixa para parecer que você está olhando a página na imagem.
A própria imagem foi dimensionada para preencher a div circundante com o maior valor possível (o design possui um max-width
valor).
É bem fácil de fazer se a imagem for menor que a div circundante:
margin-left: auto;
margin-right: auto;
display: block;
Mas quando a imagem é maior que a div, ela simplesmente começa na borda esquerda e fica fora do centro para a direita (estamos usando overflow: hidden
).
Poderíamos atribuir um width=100%
, mas os navegadores fazem um péssimo trabalho no redimensionamento de imagens e o design da web se concentra em imagens de alta qualidade.
Alguma idéia de centralizar a imagem para overflow:hidden
cortar as duas extremidades uniformemente?
Respostas:
Tente algo assim. Isso deve centralizar qualquer elemento enorme no meio vertical e horizontalmente em relação ao pai, não importando os dois tamanhos.
fonte
-100%
para cima / direita / baixo / esquerda? Com isso, o contêiner poderia ter literalmente qualquer largura.-100%
problema ^^. Btw: se você adicionarmin-width
emin-height
de100%
você basicamente obter umbackground-size: cover;
comportamento com tags de imagem -> jsFiddleEste é um Q antigo, mas uma solução moderna sem flexbox ou posição absoluta funciona assim.
Mostrar snippet de código
Então, por que isso funciona?
À primeira vista, parece que deslocamos 50% para a direita e depois 50% para a esquerda novamente. Isso resultaria em turno zero, e daí?
Mas os 50% não são os mesmos, porque o contexto é importante. Se você usar unidades relativas, uma margem será calculada como porcentagem da largura do elemento pai , enquanto a transformação será de 50% em relação ao mesmo elemento.
Temos essa situação antes de adicionarmos o CSS
Com o estilo adicionado
margin-left: 50%
, temosE os
transform: translateX(-50%)
turnos de volta para a esquerdaInfelizmente, isso funciona apenas para centralização horizontal, pois o cálculo da porcentagem da margem é sempre relativo à largura. Ou seja, não apenas
margin-left
emargin-right
, mas tambémmargin-top
emargin-bottom
são calculados em relação à largura.A compatibilidade do navegador não deve ser problema: https://caniuse.com/#feat=transforms2d
fonte
margin-top: 50%
terá 50% da largura . não a altura desejada.-webkit-transform: translateX(-50%);
para uma boa medida)Coloque uma div grande dentro da div, centralize isso e o centro da imagem dentro dessa div.
Isso centraliza horizontalmente:
HTML:
CSS:
Demonstração: http://jsfiddle.net/Guffa/L9BnL/
Para centralizá-lo verticalmente também, você pode usar o mesmo para a div interna, mas você precisaria da altura da imagem para colocá-la absolutamente dentro dela.
fonte
width
configuração do contêiner, ela terá a largura do pai e a imagem será centralizada mesmo que a página seja mais estreita que a imagem, ou seja, tanto a borda esquerda quanto a borda direita estarão ocultas : jsfiddle.net/Guffa/L9BnL/2Tarde do jogo, mas achei esse método extremamente intuitivo. https://codepen.io/adamchenwei/pen/BRNxJr
CSS
HTML
fonte
display: flex
no contêiner pai ealign-self: center
na imagem. Aqui está uma versão otimizada: codepen.io/anon/pen/dWKyeyNão use largura ou altura fixa ou explícita na tag da imagem. Em vez disso, codifique-o:
ex: http://jsfiddle.net/xwrvxser/1/
fonte
eu sou um grande fã de transformar uma imagem em segundo plano de um div / node - então você pode usar o
background-position: center
atributo para centralizá-la, independentemente do tamanho da telafonte
A largura e a altura são apenas por exemplo:
Ele deve funcionar para você se a parte superior esquerda e a parte superior da sua divisão pai não estiverem na parte superior e esquerda da janela da tela. Funciona para mim.
fonte
Eu achei que era uma solução mais elegante, sem flex:
fonte
Com base na grande resposta de @ yunzen:
Acho que muitas pessoas que pesquisam esse tópico estão tentando usar uma imagem grande como imagem de plano de fundo "herói", por exemplo, em uma página inicial. Nesse caso, eles geralmente desejam que o texto apareça sobre a imagem e aumente sua escala em dispositivos móveis.
Aqui está o CSS perfeito para uma imagem de fundo (use-a na
<img>
tag):fonte
Uma opção que você pode usar é
object-fit: cover
se comportar um poucobackground-size: cover
. Mais sobre ajuste de objeto .ignore todas as JS abaixo, isso é apenas para a demonstração.
A chave aqui é que você precisa definir a imagem dentro de um wrapper e fornecer as seguintes propriedades.
Criei uma demonstração abaixo, onde você altera a altura / largura do invólucro e vê em jogo. A imagem será sempre centralizada na vertical e na horizontal. Ele ocupará 100% de sua largura e altura pai e não será esticado / esmagado. Isso significa que a proporção da imagem é mantida. As alterações são aplicadas ao aumentar / diminuir o zoom.
A única desvantagem
object-fit
é que ele não funciona no IE11.fonte