Estou tentando redimensionar uma imagem com uma porcentagem de si mesma. Por exemplo, eu só quero reduzir a imagem pela metade, redimensionando-a para 50%. Mas a aplicação width: 50%;
irá redimensionar a imagem para 50% do elemento do recipiente (o elemento pai que pode ser, <body>
por exemplo).
A questão é: posso redimensionar a imagem com uma porcentagem dela sem usar javascript ou do lado do servidor? (Não tenho informações diretas do tamanho da imagem)
Tenho certeza de que você não pode fazer isso, mas só quero ver se há uma solução apenas para CSS inteligente. Obrigado!
width: <number>%
. Eu não acho que haja uma maneira de fazer isso!Respostas:
Eu tenho 2 métodos para você.
Método 1. demonstração em jsFiddle
Este método redimensiona a imagem apenas visual, não nas dimensões reais no DOM, e o estado visual após o redimensionamento centralizado no meio do tamanho original.
html:
css:
Navegador suporte nota: estatísticas navegadores mostrou inline
css
.Método 2. demonstração em jsFiddle
html:
css:
Nota:
img.normal
eimg.fake
é a mesma imagem.Nota de suporte de navegador: este método funcionará em todos os navegadores, porque todos os navegadores suportam
css
propriedades usadas no método.O método funciona desta maneira:
#wrap
e#wrap img.fake
tem fluxo#wrap
tem deoverflow: hidden
modo que suas dimensões sejam idênticas à imagem interna (img.fake
)img.fake
é o único elemento interno#wrap
semabsolute
posicionamento para não quebrar a segunda etapa#img_wrap
temabsolute
posicionamento interno#wrap
e se estende em tamanho para todo o elemento (#wrap
)#img_wrap
tem as mesmas dimensões da imagem.width: 50%
emimg.normal
, seu tamanho é50%
de#img_wrap
, e, portanto,50%
do tamanho da imagem original.fonte
transform:scale()
solução tem um grande problema. Não interage bem com o modelo de caixa CSS. Com isso quero dizer que ele não interage com ele de forma alguma , então você obtém um layout que parece totalmente errado. Veja: jsfiddle.net/kahen/sGEkt/8HTML:
CSS:
Essa deve ser uma das soluções mais simples usando a abordagem de elemento de contêiner.
Ao usar a abordagem de elemento de contêiner, esta pergunta é uma variação da pergunta . O truque é deixar o elemento contêiner encolher a imagem filho, para que tenha um tamanho igual ao da imagem sem tamanho. Assim, ao definir a
width
propriedade da imagem como um valor percentual, a imagem é redimensionada em relação à sua escala original.Algumas das outras propriedades permitindo shrinkwrapping e valores de propriedade são:
float: left/right
,position: fixed
emin/max-width
, como mencionado na pergunta ligada. Cada um tem seus próprios efeitos colaterais, masdisplay: inline-block
seria uma escolha mais segura. Matt mencionoufloat: left/right
em sua resposta, mas ele erroneamente atribuiu isso aoverflow: hidden
.Demo no jsfiddle
Edit: Conforme mencionado pelo trojan , você também pode aproveitar as vantagens do módulo de dimensionamento intrínseco e extrínseco do CSS3 recém-introduzido :
HTML:
CSS:
No entanto, nem todas as versões populares de navegadores o suportam no momento da escrita .
fonte
<img src="https://www.google.com/images/srpr/logo11w.png"/>
CSS:img { display: inline-block; width: 15%; }
figure
é awidth: fit-content;
partir de agora. O suporte do navegador também está muito melhor hoje.Experimente
zoom
propriedadeEdit: Aparentemente, o FireFox não oferece suporte à
zoom
propriedade. Você deveria usar;para FireFox.
fonte
Outra solução é usar:
Não validará porque o
src
atributo é obrigatório, mas funciona (exceto em qualquer versão do IE porquesrcset
não é suportado).fonte
Na verdade, isso é possível, e descobri o quanto por acidente, enquanto projetava meu primeiro site de design responsivo em grande escala.
O overflow: hidden dá ao wrapper altura e largura, apesar do conteúdo flutuante, sem usar o hack do clearfix. Você pode então posicionar seu conteúdo usando as margens. Você pode até tornar o div do wrapper um bloco embutido.
fonte
Este é um tópico muito antigo, mas eu o encontrei enquanto procurava uma solução simples para exibir a captura de tela de retina (alta resolução) em uma tela de resolução padrão.
Portanto, há uma solução somente HTML para navegadores modernos:
Isso informa ao navegador que a imagem tem o dobro da dimensão do tamanho de exibição pretendido. Os valores são proporcionais e não precisam refletir o tamanho real da imagem. Pode-se usar 2w 1px também para obter o mesmo efeito. O atributo src é usado apenas por navegadores legados.
O bom efeito disso é que ele exibe o mesmo tamanho na retina ou na tela padrão, encolhendo na última.
fonte
Esta solução usa js e jquery e redimensiona com base apenas nas propriedades da imagem e não no pai. Ele pode redimensionar uma única imagem ou um grupo com base em parâmetros de classe e id.
para mais, acesse: https://gist.github.com/jennyvallon/eca68dc78c3f257c5df5
fonte
Esta não é uma abordagem difícil:
fonte
Na verdade, a maioria das respostas aqui realmente não dimensionar a imagem à largura de si .
Precisamos ter uma largura e altura automática no
img
próprio elemento para que possamos começar com seu tamanho original.Depois disso, um elemento de contêiner pode dimensionar a imagem para nós.
Exemplo de HTML simples:
E aqui estão as regras CSS. Eu uso um contêiner absoluto neste caso:
Você pode ajustar o posicionamento da imagem com regras como
transform: translate(0%, -50%);
.fonte
Acho que você está certo, simplesmente não é possível com CSS puro, tanto quanto eu sei (não cross-browser, quero dizer).
Editar:
Ok, eu não gostei muito da minha resposta, então fiquei um pouco confuso. Posso ter encontrado uma ideia interessante que poderia ajudar .. talvez seja possível afinal (embora não seja a coisa mais bonita de todas):
Editar: Testado e funcionando no Chrome, FF e IE 8 e 9. . Não funciona no IE7.
Exemplo de jsFiddle aqui
html:
css:
fonte
inline-block
, é por isso que a largura#img_wrap
depende não apenas da largura interna do html, mas também da largura do contêiner de contexto.