Quero criar um div
que possa alterar sua largura / altura conforme a largura da janela for alterada.
Existem regras CSS3 que permitam alterar a altura de acordo com a largura, mantendo a proporção ?
Eu sei que posso fazer isso via JavaScript, mas eu preferiria usar apenas CSS.
Respostas:
Basta criar um wrapper
<div>
com um valor percentual parapadding-bottom
, assim:Isso resultará em uma
<div>
altura igual a 75% da largura do seu contêiner (uma proporção de 4: 3).Isso se baseia no fato de que, para o preenchimento:
Valores do fundo de preenchimento para outras proporções e largura de 100%:
Colocando conteúdo na div:
Para manter a proporção da div e impedir que seu conteúdo a estique, é necessário adicionar um filho absolutamente posicionado e esticá-lo às bordas do invólucro com:
Aqui está uma demonstração e outro mais em profundidade de demonstração
fonte
vw
unidades:Você pode usar
vw
unidades para a largura e a altura do elemento. Isso permite que a proporção do elemento seja preservada, com base na largura da janela de exibição.Como alternativa, você também pode usar
vh
para a altura da janela de exibição, ou mesmovmin
/vmax
para usar as dimensões menor / maior da janela de visualização (discussão aqui ).Exemplo: proporção de aspecto 1: 1
Para outras proporções, você pode usar a tabela a seguir para calcular o valor da altura de acordo com a largura do elemento:
Exemplo: grade 4x4 de divs quadrados
Aqui está um Fiddle com esta demonstração e aqui está uma solução para criar uma grade de quadrados responsiva com conteúdo centralizado na vertical e na horizontal .
O suporte do navegador para unidades vh / vw é o IE9 +, consulte canIuse para obter mais informações
fonte
width:50%
eheight:50vw
a altura é um pouco mais alta que a largura, portanto não é exatamente uma proporção de 1: 1. Alguma ideia?Encontrei uma maneira de fazer isso usando CSS, mas você deve ter cuidado, pois isso pode mudar dependendo do fluxo do seu próprio site. Eu fiz isso para incorporar vídeo com uma proporção constante dentro de uma parte de largura de fluido do meu site.
Digamos que você tenha um vídeo incorporado como este:
Você pode colocar tudo isso dentro de uma div com uma classe "video". Essa classe de vídeo provavelmente será o elemento fluido em seu site, de modo que, por si só, não possui restrições diretas de altura, mas quando você redimensiona o navegador, sua largura muda de acordo com o fluxo do site. Esse seria o elemento em que você provavelmente está tentando obter o vídeo incorporado, mantendo uma certa proporção do vídeo.
Para fazer isso, coloquei uma imagem antes do objeto incorporado na classe "video" div.
!!! O importante é que a imagem tenha a proporção correta que você deseja manter. Além disso, verifique se o tamanho da imagem é PELO MENOS do tamanho mínimo que você espera que o vídeo (ou seja o que você estiver mantendo o AR) seja baseado no seu layout. Isso evitará possíveis problemas na resolução da imagem quando ela for redimensionada em porcentagem. Por exemplo, se você deseja manter uma proporção de 3: 2, não use apenas uma imagem de 3 x 2 x. Pode funcionar em algumas circunstâncias, mas ainda não testei, e provavelmente seria uma boa ideia evitar.
Você provavelmente já deve ter uma largura mínima como essa definida para elementos fluidos do seu site. Caso contrário, é uma boa idéia fazê-lo para evitar o corte de elementos ou a sobreposição quando a janela do navegador ficar muito pequena. É melhor ter uma barra de rolagem em algum momento. A menor largura que uma página da Web deve ter fica em torno de ~ 600px (incluindo qualquer coluna de largura fixa) porque as resoluções de tela não são menores, a menos que você esteja lidando com sites amigáveis por telefone. !!!
Eu uso um png completamente transparente, mas eu realmente não acho que isso acabe importando se você fizer certo. Como isso:
Agora você deve poder adicionar CSS semelhante ao seguinte:
Também remova qualquer declaração explícita de altura ou largura no objeto e nas tags de incorporação que geralmente vêm com o código de incorporação de copiar / colar.
A maneira como funciona depende das propriedades de posição do elemento da classe de vídeo e o item que você deseja manter uma certa proporção. Aproveita a maneira como uma imagem mantém sua proporção adequada quando redimensionada em um elemento. Ele informa o que mais estiver no elemento de classe de vídeo para tirar o máximo proveito do espaço fornecido pela imagem dinâmica, forçando sua largura / altura a 100% do elemento de classe de vídeo sendo ajustado pela imagem.
Muito legal, né?
Talvez você precise brincar um pouco para fazer funcionar com seu próprio design, mas isso realmente funciona surpreendentemente bem para mim. O conceito geral está lá.
fonte
Elliot me inspirou a esta solução - obrigado:
aspectratio.png
é um arquivo PNG completamente transparente com o tamanho da sua proporção preferida, no meu caso, 30x10 pixels.HTML
CSS3
Observe:
background-size
é um recurso css3 que pode não funcionar com os navegadores de destino. Você pode verificar a interoperabilidade (fe em caniuse.com ).fonte
Para adicionar à resposta do Web_Designer,
<div>
ele terá uma altura (totalmente composta pelo preenchimento inferior) de 75% da largura do elemento que o contém . Aqui está um bom resumo: http://mattsnider.com/css-using-percent-for-margin-and-padding/ . Não sei por que isso deve ser assim, mas é assim que é.Se você deseja que sua div tenha uma largura diferente de 100%, você precisa de outra div de quebra automática para definir a largura:
Recentemente, usei algo semelhante ao truque de imagem de Elliot para me permitir usar consultas de mídia CSS para exibir um arquivo de logotipo diferente, dependendo da resolução do dispositivo, mas ainda dimensionar proporcionalmente como
<img>
faria naturalmente (defino o logotipo como imagem de plano de fundo em um arquivo transparente .png com a proporção correta). Mas a solução do Web_Designer me salvaria de uma solicitação http.fonte
Conforme declarado aqui no w3schools.com e um pouco reiterado nesta resposta aceita , preenchimento de valores como porcentagens (ênfase minha):
Portanto, um exemplo correto de um DIV responsivo que mantém uma proporção de 16: 9 é o seguinte:
CSS
HTML
Demo no JSFiddle
fonte
Como o @ web-tiki já mostra uma maneira de usar
vh
/vw
, eu também preciso de uma maneira de centralizar na tela, aqui está um código para o retrato 9:16 .translateY
manterá esse centro na tela.calc(100vw * 16 / 9)
altura prevista para 16/09.(100vw * 16 / 9 - 100vh)
é a altura do estouro, portanto, puxe para cimaoverflow height/2
o manterá centralizado na tela.Para paisagem, e mantenha 16: 9 , você mostra uso
A proporção 9/16 é fácil de alterar, sem necessidade de predefinições
100:56.25
ou100:75
. Se você deseja garantir a altura primeiro, deve alterar a largura e a altura, por exemplo,height:100vh;width: calc(100vh * 9 / 16)
para 9:16 em retrato.Se você deseja se adaptar a diferentes tamanhos de tela, também pode interessar
@media (orientation: portrait)
/@media (orientation: landscape)
portrait
/landscape
para alterar a proporção.fonte
Esta é uma melhoria na resposta aceita:
fonte
Eu me deparei com uma solução inteligente usando
<svg>
edisplay:grid
.O elemento de grade permite que você ocupe o mesmo espaço com dois (ou mais) elementos, sem precisar especificar qual define a altura. O que significa que, fora da caixa, o mais alto define a proporção .
Isso significa que você pode usá-lo como está quando sabe que o conteúdo nunca será alto o suficiente para preencher toda a "proporção" e você está simplesmente procurando uma maneira de posicionar o conteúdo nesse espaço (ou seja, para centralizá-lo nas duas direções)
display:flex; align-items:center; justify-content:center
)É praticamente o mesmo que usar um transparente
<img>
comdisplay:block
e proporção pré-determinada, exceto o<svg>
é mais leve e consideravelmente mais fácil de modificar (para alterar a relação responsavelmente, caso você precise).Tudo que você precisa fazer é alterar a
<svg>
proporção s:<svg viewBox="0 0 4 3"></svg>
<svg viewBox="0 0 16 9"></svg>
Veja trabalhando:
Mostrar snippet de código
Se você precisar de uma solução em que o elemento de conteúdo não tenha permissão para definir a proporção quando for mais alto (com estouro oculto ou automático), será necessário definir
position:relative
na grade eposition:absolute; height:100%; overflow-y: auto;
no conteúdo. Exemplo:Mostrar snippet de código
fonte
Baseando-se em suas soluções, fiz alguns truques:
Quando você o usa, seu HTML será apenas
Para usá-lo desta forma, faça: CSS:
e js (jQuery)
E tendo isso, você acabou de definir attr
data-keep-ratio
para height / width e pronto .fonte
data-keep-ratio
nãokeep-ratio
e obtê-lo de valor usando$(this).data('keep-ratio');
Você pode usar um svg. Torne a posição do contêiner / invólucro relativa, coloque o svg primeiro como estático e depois coloque o conteúdo absolutamente posicionado (em cima: 0; esquerda: 0; direita: 0; embaixo: 0;)
Exemplo com proporções 16: 9:
image.svg: (pode ser destacado em src)
CSS:
HTML:
Observe que o svg embutido não parece funcionar, mas você pode codificar o svg com url e incorporá-lo no atributo img src da seguinte forma:
fonte
SCSS é a melhor solução no meu caso; usando um atributo de dados:
Por exemplo :
fonte
fonte
[data-aspect-ratio]
seletor de atributos está disponível para você em CSS.Embora a maioria das respostas seja muito interessante, a maioria delas exige que uma imagem já esteja dimensionada corretamente ... Outras soluções funcionam apenas com uma largura e não se importam com a altura disponível, mas às vezes você também deseja ajustar o conteúdo em uma determinada altura. .
Eu tentei juntá-los para criar uma solução totalmente portátil e redimensionável ... O truque é usar o dimensionamento automático de uma imagem, mas usar um elemento svg embutido em vez de usar uma imagem pré-renderizada ou qualquer forma de segunda solicitação HTTP ...
Observe que eu usei grandes valores nos atributos width e height do SVG, pois ele precisa ser maior que o tamanho máximo esperado, pois só pode encolher. O exemplo faz com que a proporção da div 10: 5
fonte
Apenas uma ideia ou um truque.
fonte
digamos que você tenha 2 divs, a div externa é um contêiner e o interno pode ser qualquer elemento necessário para manter sua proporção (img ou iframe do youtube ou o que for)
html é assim:
digamos que você precise manter a proporção do "elemento"
relação => 4 para 1 ou 2 para 1 ...
css se parece com isso
preenchimento, quando especificado em%, é calculado com base na largura e não na altura. .. então basicamente você não importa qual a sua largura e altura será sempre calculada com base nisso. o que manterá a proporção.
fonte
Eu já tive esse problema algumas vezes, então criei uma solução JS para ele. Isso basicamente ajusta a altura do domElement de acordo com a largura do elemento pela proporção que você especificar. Você pode usá-lo da seguinte maneira:
<div ratio="4x3"></div>
Esteja ciente de que, uma vez que está definindo a altura do elemento, o elemento deve ser um
display:block
oudisplay:inline-block
.https://github.com/JeffreyArts/html-ratio-component
fonte
Se você deseja ajustar um quadrado dentro da viewport na vista retrato ou paisagem (o maior possível, mas nada aparecendo lá fora), alterne entre usar
vw
/vh
na orientaçãoportrait
/landscape
:fonte
Gostaria de compartilhar minha solução, na qual tenho uma
img
tag preenchendo uma determinada proporção. Eu não poderia usarbackground
por causa da falta de apoio da CMS e eu não prefiro usar uma marca de estilo assim:<img style="background:url(...)" />
. Além disso, a largura é 100%, portanto, não precisa ser definida em um tamanho fixo, como em algumas das soluções. Ele será dimensionado responsivamente!fonte
Você pode conseguir isso usando SVG.
Depende de um caso, mas em alguns é realmente útil. Como exemplo - você pode definir
background-image
sem definir a altura fixa ou usá-lo para incorporar o youtube<iframe>
com proporção16:9
eposition:absolute
etc.Para a
3:2
relação definidaviewBox="0 0 3 2"
e assim por diante.Exemplo:
fonte
Uma maneira simples de manter a proporção, usando o elemento canvas.
Tente redimensionar a div abaixo para vê-la em ação.
Para mim, essa abordagem funcionou melhor, por isso estou compartilhando com outras pessoas para que elas também possam se beneficiar.
Também funciona com altura dinâmica!
fonte
Diga que você gosta de manter Width: 100px e Height: 50px (ou seja, 2: 1) Basta fazer este cálculo:
fonte
Bem, recentemente recebemos a capacidade de usar a
aspect-ratio
propriedade em CSS.https://twitter.com/Una/status/1260980901934137345/photo/1
Nota: O suporte ainda não é o melhor ...
https://caniuse.com/#search=aspect-ratio
fonte
Você pode usar o layout de fluxo (FWD).
https://en.wikipedia.org/wiki/Adaptive_web_design
Ele escalará e manterá o layout, é um pouco complexo, mas permite que uma página seja redimensionada sem empurrar o conteúdo como (RWD).
Parece responsivo, mas está em escala. https://www.youtube.com/watch?v=xRcBMLI4jbg
Você pode encontrar a fórmula de escala CSS aqui:
http://plugnedit.com/pnew/928-2/
fonte
Eu usei uma nova solução.
Para proporção principal
No entanto, isso é relativo a toda a janela de exibição. Portanto, se você precisar de uma div que seja 30% da largura da janela de exibição, poderá usar 30vw e, desde que saiba a largura, reutilize-as em altura usando a unidade calc e vw.
fonte
Se toda a estrutura do contêiner fosse baseada em porcentagem, esse seria o comportamento padrão. Você pode fornecer um exemplo mais específico?
Abaixo está um exemplo do que quero dizer, se toda a hierarquia pai fosse baseada em%, qualquer ajuste da janela do navegador funcionaria sem nenhum js / css adicional. Isso não é uma possibilidade no seu layout?
fonte