Maintenir le ratio d'aspect d'un div en CSS
Je veux créer un div
qui peut changer sa largeur/hauteur que la largeur de la fenêtre de modifications.
Existe-il des règles CSS3 qui permettrait à la hauteur de changer en fonction de la largeur, tout en maintenant son ratio d'aspect?
Je sais que je peux le faire en JavaScript, mais je préfère en utilisant uniquement CSS.
- J'ai écrit sur les différentes approches dans mon CSS-Tricks article sur mise à l'échelle sensible les animations
- Je suis venu à ce Q&très en retard, mais je dois commenter. Bien qu'il est très discipliné et dans les règles de chacun de répondre à essayer de leur mieux pour satisfaire le "seul CSS" à la demande de la question, il est assez surprenant que, à l'exception de la réponse par user007 bas sur la page, personne n'a mentionné l'évidence: pas fiable du CSS seule solution existe, ce problème nécessite l'activation de Javascript. Un débutant de venir sur cette page ne perdez plus de temps de commutation à partir d'un ensemble de avantages/inconvénients à l'autre avant que l'ampoule s'éteint: CSS-seulement de ne pas le faire.
- J'ai écrit un petit outil qui facilite la prévisualisation et de calculer les ratios d'aspect, aspectrat.io. Il génère également le CSS appropriée dans/Sass/Moins de code que vous pouvez copier et coller dans vos projets. J'espère que les gens le trouvent utile.
- voir cet exemple: w3schools.com/howto/howto_css_aspect_ratio.asp ..... qui a travaillé moi
- Cette question est pour le réglage de la hauteur en fonction de la largeur. Si vous avez besoin d'en face, découvrez Réglage de l'Élément de la Largeur sur la Hauteur Via CSS.
Vous devez vous connecter pour publier un commentaire.
Il suffit de créer un wrapper
<div>
avec un pourcentage de la valeur pourpadding-bottom
, comme ceci:CSS:
HTML:
Il en résulte une
<div>
avec hauteur égale à 75% de la largeur de son conteneur (un format 4:3).Cela repose sur le fait que pour rembourrage :
Padding-bottom valeurs pour les autres ratios d'aspect et de 100% de la largeur :
De placer le contenu dans le div :
Afin de maintenir le ratio d'aspect de la div et de prévenir son contenu à partir de l'étirant, vous devez ajouter un positionnement absolu de l'enfant et de l'étirer les bords de l'emballage avec:
Voici une démo et un autre plus en profondeur démo
top:0; bottom:0;
est assez - dans mon cas, j'aiwidth:999999px
sur l'élément enfant, ce qui me permet de créer une bande horizontale de<img>
balises dans le récipient; avecheight:100%
sur ceux, ils s'étreignent le conteneur et l'échelle d'aisance pour s'adapter à la largeur du navigateur, tout en préservant l'aspect ratio. Génial!padding-bottom: 66.66%
sans précisertop
,bottom
,left
, ouright
et il fonctionne très bien!<div>
avecposition: absolute; top: 0; bottom: 0; left: 0; right: 0;
comme mentionné dans la réponse?vw
unités:Vous pouvez utiliser
vw
unités pour la la largeur et la hauteur de l'élément. Cela permet à l'élément de l'aspect ratio d'être conservé, basé sur la largeur de la fenêtre d'affichage.Alternativement, vous pouvez également utiliser
vh
pour la fenêtre d'affichage de la hauteur, ou mêmevmin
/vmax
à utiliser l'inférieure/supérieure de la fenêtre d'affichage dimensions (discussion ici).Exemple: 1:1 ratio d'aspect
CSS:
HTML:
Pour les autres formats, vous pouvez utiliser le tableau suivant pour calculer la valeur de la hauteur en fonction de la largeur de l'élément :
Exemple: grille de 4 × 4 carré divs
CSS:
HTML:
Ici est un Jouer avec cette démo et voici une solution pour faire un grille souple de carrés avec verticaly et horizontaly centrée sur le contenu.
Prise en charge du navigateur pour vh/vw unités est IE9+ voir canIuse pour plus d'info
width:50%
etheight:50vw
la hauteur est un peu plus grand que la largeur, donc pas exactement un 1:1 proportion. Des idées?width: 100%; height: 56.25vw;
vw
unité n'est bon que dans certains cas. Imaginez que vous avez fait votre site 100% de la largeur et de l'aidevw
unités pour éléments avec une proportion fixe, alors le client vous demande de réparer votre conteneur principal dumax-width
. Si vous avez utilisé le remplissage de la solution, il serait assez juste de corriger celamax-width
. Avecvw
, vous devrez réécrire styles pour le remplissage de solution.J'ai trouvé un moyen de faire cela à l'aide de CSS, mais vous devez être prudent car il peut changer en fonction du débit de votre propre site web. Je l'ai fait dans le but d'intégrer de la vidéo avec les proportions au sein d'un fluide largeur de la partie de mon site web.
Dire que vous avez une vidéo comme ceci:
Vous pouvez ensuite placer tout cela à l'intérieur d'un div avec une "vidéo" de la classe. Cette vidéo de classe sera probablement l'élément liquide dans votre site web, tels que, par elle-même, elle n'est pas directement contraintes de hauteur, mais lorsque vous redimensionnez le navigateur, il sera de modification de la largeur en fonction de la circulation du site web. Ce serait l'element que vous essayez probablement pour obtenir votre vidéo intégrée dans tout en conservant un certain ratio d'aspect de la vidéo.
Pour ce faire, j'ai mis une image avant de l'objet incorporé au sein de la "vidéo" de la classe div.
!!! L'important, c'est que l'image est le rapport d'aspect correct que vous souhaitez conserver. Aussi, assurez-vous que la taille de l'image est AU MOINS aussi grand que le plus petit que vous attendez de la vidéo (ou ce que vous sont le maintien de l'A. R. de) en fonction de votre mise en page. Cela permettra d'éviter des problèmes potentiels dans la résolution de l'image quand elle est pourcentage de redimensionnement. Par exemple, si vous souhaitez maintenir un ratio d'aspect de 3:2, n'est pas simplement utiliser un 3px par 2px image. Il peut fonctionner dans certaines circonstances, mais je ne l'ai pas testé, et il serait probablement une bonne idée d'éviter.
Vous devriez déjà avoir une largeur minimale comme ce définies pour le fluide éléments de votre site web. Si non, c'est une bonne idée de le faire afin d'éviter de découper des éléments ou d'avoir chevauchement lorsque la fenêtre du navigateur est trop petit. Il est préférable d'avoir une barre de défilement à un certain point. La plus petite largeur d'une page web est quelque part autour de ~600px (y compris toutes les colonnes de largeur fixe) parce que les résolutions d'écran ne viennent pas plus petit, sauf si vous avez affaire avec le téléphone-les sites de l'environnement. !!!
- Je utiliser complètement transparent png mais je ne pense pas vraiment que ça se termine important si vous le faites à droite. Comme ceci:
Maintenant, vous devriez être en mesure d'ajouter des CSS semblable à la suivante:
Assurez-vous également de supprimer de manière explicite la hauteur ou la largeur de la déclaration dans les balises object et embed qui viennent généralement avec des copier/coller le code d'intégration.
Le mode de fonctionnement dépend de la position des propriétés de la vidéo de la classe de l'élément et l'élément que vous souhaitez avoir à maintenir un certain ratio d'aspect. Il faut profiter de la façon dont une image de maintenir son ratio d'aspect lors de redimensionnée dans un élément. Il raconte que ce soit d'autre est dans la vidéo de la classe de l'élément de tirer pleinement avantage de l'immobilier fournis par la dynamique de l'image en forçant sa largeur/hauteur de 100% de la vidéo de la classe de l'élément ajusté par l'image.
Assez cool, hein?
Vous pourriez avoir à jouer avec elle un peu pour qu'il fonctionne avec votre propre conception, mais cela fonctionne étonnamment bien pour moi. L'idée générale est là.
À ajouter à Web_Designer réponse, le
<div>
auront une hauteur (entièrement composé de remplissage en bas) de 75% de la largeur de la élément contenant. Voici un bon résumé: http://mattsnider.com/css-using-percent-for-margin-and-padding/. Je ne sais pas pourquoi il devrait en être ainsi, mais c'est comment il est.Si vous voulez que votre div à une largeur de 100%, vous avez besoin d'un autre habillage de la div sur lequel l'largeur:
J'ai utilisé quelque chose de semblable à Elliot image du truc récemment pour me permettre d'utiliser les CSS media queries pour servir un autre fichier du logo en fonction de la résolution du périphérique, mais encore à l'échelle proportionnellement comme un
<img>
, naturellement, de faire (j'ai mis le logo comme image d'arrière-plan transparente .png avec le ratio d'aspect). Mais Web_Designer la solution de me sauver d'une requête http.Elliot m'a inspiré pour cette solution - merci:
aspectratio.png
est complètement transparent fichier PNG avec la taille de votre choix à l'aspect ratio, dans mon cas 30 x 10 pixels.HTML
CSS3
Veuillez noter:
background-size
est un css3-fonction qui pourrait ne pas fonctionner avec votre cible-les navigateurs. Vous pouvez vérifier l'interopérabilité (f.e. sur caniuse.com).Comme indiqué dans ici w3schools.com et un peu rappelé dans ce accepté de répondre à, les valeurs de remplissage sous la forme de pourcentages (l'emphase est mienne):
Ergo, un bon exemple d'un réactif DIV qui garde un aspect ratio 16:9 est comme suit:
CSS
HTML
Démo sur JSFiddle
En se basant sur vos solutions, j'ai fait une astuce:
Quand vous l'utilisez, votre code HTML sera seulement
De l'utiliser de cette façon de faire:
CSS:
et js (jQuery)
Et avoir ce que vous venez de définir attr
data-keep-ratio
à hauteur/largeur et c'est tout.data-keep-ratio
paskeep-ratio
et obtenez sa valeur à l'aide de$(this).data('keep-ratio');
Vous pouvez utiliser un svg. Le récipient/wrapper position relative, mettre la svg d'abord comme staticly positionné et puis mettre en position absolue de contenu (top: 0; left:0; right:0; bottom:0;)
Exemple 16:9 proportions:
image.svg: (peut être incorporé dans src)
CSS:
HTML:
Noter que inline svg ne semble pas fonctionner, mais vous pouvez urlencode le svg et de l'intégrer dans img src attribut comme ceci:
Comme @web-tiki est déjà une façon d'utiliser
vh
/vw
, j'ai aussi besoin d'un moyen de centre de l'écran, voici un extrait de code pour 9:16 portrait.translateY
va garder ce centre de l'écran.calc(100vw * 16 /9)
est à la hauteur prévue pour 9/16.(100vw * 16 /9 - 100vh)
est dépassement de hauteur, de sorte que, tirezoverflow height/2
gardera centre de l'écran.Pour le paysage, et de garder 16:9, vous montrer l'utilisation
Le ratio 9/16 est la facilité à changer, pas besoin de prédéfinies
100:56.25
ou100:75
.Si vous voulez vous assurer que la hauteur de la première, vous devriez changer la largeur et la hauteur, par exempleheight:100vh;width: calc(100vh * 9 /16)
pour 9:16 portrait.Si vous voulez adapté pour différentes taille de l'écran, vous pouvez également l'intérêt des
@media (orientation: portrait)
/@media (orientation: landscape)
portrait
/landscape
de modifier le rapport.C'est une amélioration sur le acceptées réponse:
CSS:
HTML:
SCSS est la meilleure solution dans mon cas; à l'aide d'un attribut de données :
Par exemple :
source
[data-aspect-ratio]
sélecteur d'attribut est disponible pour vous dans le CSS.Juste une idée ou un hack.
CSS:
HTML:
permet de dire que vous avez 2 divs la outher div est un conteneur et l'intérieur peut être n'importe quel élément que vous avez besoin pour maintenir son ratio (img ou un youtube iframe ou quoi que ce soit )
html ressemble à ceci :
permet de dire que vous avez besoin pour garder le ratio de la "élément"
ratio => 4 à 1 ou 2 à 1 ...
css ressemble à ceci
remplissage lorsque spécifié en % elle est calculée en fonction de la largeur de pas de la hauteur.
..
donc, fondamentalement, vous, il n'a pas d'importance ce que votre largeur hauteur sera toujours calculé en fonction de cela . qui va garder les proportions .
Alors que la plupart des réponses sont très cool, la plupart d'entre eux nécessitent de disposer d'une image déjà correctement dimensionné... d'Autres solutions que de travailler pour une largeur et ne se soucient pas de la hauteur disponible, mais parfois vous voulez ajuster le contenu dans une certaine hauteur trop.
J'ai essayé de couple ensemble pour apporter un entièrement portable et re-extensible solution... L'astuce est à utiliser pour la mise à l'échelle automatique de l'image, mais l'utilisation d'insertion de l'élément svg au lieu d'utiliser un pré-rendu de l'image ou de toute forme de deuxième requête HTTP...
CSS:
HTML:
Vous remarquerez que j'ai utilisé des valeurs dans les attributs width et height de l'SVG, comme il doit être plus grand que le maximum de la taille attendue comme elle seule peut le réduire. L'exemple fait de la div du ratio de 10:5
Si vous voulez monter une place à l'intérieur de la fenêtre d'affichage sur le mode portrait ou paysage (le plus grand possible, mais rien de coller à l'extérieur), de basculer entre l'utilisation de
vw
/vh
sur l'orientationportrait
/landscape
:Je suis tombé sur une solution intelligente à l'aide de
<svg>
etdisplay:grid
.Élément de grille permet d'occuper le même espace avec deux (ou plus) éléments, sans avoir besoin de préciser laquelle définit la hauteur. Ce qui signifie que, hors de la boîte, le plus haut définit le rapport.
Cela signifie que vous pouvez l'utiliser comme quand vous savez que le contenu ne sera jamais assez grand pour remplir la totalité de la "ratio" et vous êtes simplement à la recherche d'un moyen de placer le contenu dans cet espace (c'est à dire pour les centrer sur les deux directions utiliser
display:flex; align-items:center; justify-content:center
).C'est à peu près la même qu'à l'aide d'un transparent
<img>
avecdisplay:block
et prédéterminée rapport, à l'exception de la<svg>
est plus léger et beaucoup plus facile à modifier (changer le rapport de réactivité, si vous en avez besoin).Tout ce que vous devez faire est de changer le
<svg>
s ratio:<svg viewBox="0 0 4 3"></svg>
<svg viewBox="0 0 16 9"></svg>
De voir leur fonctionnement:
CSS:
HTML:
Si vous avez besoin d'une solution dans laquelle l'élément de contenu n'est pas autorisé à définir le rapport quand il est plus grand (avec trop-plein caché ou auto), vous devez définir
position:relative
sur la grille etposition:absolute; height:100%; overflow-y: auto;
sur le contenu. Exemple:CSS:
HTML:
J'ai couru dans cette question tout à fait quelques fois, j'ai donc fait un JS solution pour elle. Fondamentalement régler la hauteur de la domElement selon la largeur de l'élément par le rapport que vous spécifiez. Vous pouvez l'utiliser comme suivi:
<div ratio="4x3"></div>
S'il vous plaît être conscient que c'est le réglage de la hauteur de l'élément, l'élément doit être, soit un
display:block
oudisplay:inline-block
.https://github.com/JeffreyArts/html-ratio-component
Dire que vous pour maintenir Width: 100px et Height: 50px (c'est à dire, 2:1)
Faire ce calcul:
Je voudrais partager ma solution, où j'ai un
img
-tag de remplissage d'un certain ratio d'aspect. Je ne pouvais pas utiliserbackground
en raison du manque de soutien de la CMS et je n'avais pas préfèrent utiliser une balise style comme:<img style="background:url(...)" />
. Aussi, la largeur est de 100%, de sorte qu'il n'a pas besoin d'être fixé à une taille fixe, comme dans certaines solutions. Il sera mis à l'échelle de réactivité!CSS:
HTML:
Vous pouvez utiliser le flux d'aménagement (TA).
https://en.wikipedia.org/wiki/Adaptive_web_design
Il sera mis à l'échelle et de maintenir la mise en page, c'est un peu complexe, mais qui permet une page pour redimensionner sans pousser le contenu, comme l' (RWD).
Il ressemble réactif mais il est de mise à l'échelle. https://www.youtube.com/watch?v=xRcBMLI4jbg
Vous pouvez trouver le CSS de mise à l'échelle de la formule ici:
http://plugnedit.com/pnew/928-2/
J'ai utilisé une nouvelle solution.
Principal aspect ratio
Cependant, c'est par rapport à l'ensemble de la fenêtre d'affichage. Donc, si vous avez besoin d'un div qui est de 30% de la largeur de la fenêtre d'affichage, vous pouvez utiliser 30vw au lieu de cela, et comme vous savez que la largeur, vous de les réutiliser dans la hauteur en utilisant calc et vw unité.
Si l'ensemble de la structure du conteneur a été basée sur les pourcentages, ce serait le comportement par défaut, vous pouvez donner un exemple plus spécifique?
Ci-dessous est un exemple de ce que je veux dire, si l'ensemble de votre hiérarchie parent a été % à base, de n'importe quel navigateur de la fenêtre de réglage de la fonctionnerait sans js/css, n'est-ce pas une possibilité avec votre mise en page?