Je veux créer un div
qui peut changer sa largeur / hauteur à mesure que la largeur de la fenêtre change.
Existe-t-il des règles CSS3 qui permettraient à la hauteur de changer en fonction de la largeur, tout en conservant son rapport hauteur / largeur ?
Je sais que je peux le faire via JavaScript, mais je préférerais utiliser uniquement CSS.
Réponses:
Créez simplement un wrapper
<div>
avec un pourcentage pourpadding-bottom
, comme ceci:Il en résultera une
<div>
hauteur égale à 75% de la largeur de son contenant (un rapport d'aspect de 4: 3).Cela repose sur le fait que pour le rembourrage:
Valeurs de remplissage pour d'autres rapports d'aspect et largeur de 100%:
Placer du contenu dans la div:
Afin de conserver le rapport d'aspect du div et d'empêcher son contenu de l'étirer, vous devez ajouter un enfant absolument positionné et l'étirer jusqu'aux bords de l'emballage avec:
Voici une démo et une autre plus en profondeur démo
la source
vw
unités:Vous pouvez utiliser des
vw
unités pour la largeur et la hauteur de l'élément. Cela permet de conserver le rapport hauteur / largeur de l'élément, en fonction de la largeur de la fenêtre.Alternativement, vous pouvez également utiliser
vh
pour la hauteur de la fenêtre, ou mêmevmin
/vmax
pour utiliser la plus petite / plus grande des dimensions de la fenêtre (discussion ici ).Exemple: rapport d'aspect 1: 1
Pour d'autres proportions, vous pouvez utiliser le tableau suivant pour calculer la valeur de la hauteur en fonction de la largeur de l'élément:
Exemple: grille 4x4 de divs carrés
Voici un violon avec cette démo et voici une solution pour faire une grille réactive de carrés avec un contenu centré verticalement et horizontalement .
La prise en charge du navigateur pour les unités vh / vw est IE9 + voir canIuse pour plus d'informations
la source
width:50%
etheight:50vw
la hauteur est un peu plus haute que la largeur, donc pas exactement une proportion de 1: 1. Des idées?J'ai trouvé un moyen de le faire en utilisant CSS, mais vous devez être prudent car cela peut changer en fonction du flux de votre propre site Web. Je l'ai fait afin d'intégrer une vidéo avec un rapport d'aspect constant dans une partie de largeur fluide de mon site Web.
Supposons que vous ayez une vidéo intégrée comme celle-ci:
Vous pouvez ensuite placer tout cela à l'intérieur d'un div avec une classe "vidéo". Cette classe vidéo sera probablement l'élément fluide de votre site Web de telle sorte qu'elle ne présente pas en soi de contrainte de hauteur directe, mais lorsque vous redimensionnez le navigateur, sa largeur change en fonction du flux du site Web. Ce serait l'élément dans lequel vous essayez probablement d'obtenir votre vidéo intégrée tout en conservant un certain rapport d'aspect de la vidéo.
Pour ce faire, je mets une image avant l'objet intégré dans la classe "video" div.
!!! La partie importante est que l'image a le rapport d'aspect correct que vous souhaitez conserver. Assurez-vous également que la taille de l'image est au moins aussi grande que la plus petite que vous attendez de la vidéo (ou de tout ce que vous conservez l'AR) en fonction de votre mise en page. Cela évitera tout problème potentiel dans la résolution de l'image lorsqu'elle est redimensionnée en pourcentage. Par exemple, si vous souhaitez conserver un rapport hauteur / largeur de 3: 2, n'utilisez pas uniquement une image de 3 x 2 pixels. Cela peut fonctionner dans certaines circonstances, mais je ne l'ai pas testé, et ce serait probablement une bonne idée à éviter.
Vous devriez probablement déjà avoir une largeur minimale comme celle-ci définie pour les éléments fluides de votre site Web. Sinon, c'est une bonne idée de le faire afin d'éviter de couper des éléments ou de se chevaucher lorsque la fenêtre du navigateur devient trop petite. Il est préférable d'avoir une barre de défilement à un moment donné. La plus petite largeur qu'une page Web devrait obtenir se situe autour de ~ 600 px (y compris toutes les colonnes de largeur fixe) car les résolutions d'écran ne sont pas plus petites, sauf si vous avez affaire à des sites adaptés aux téléphones. !!!
J'utilise un png complètement transparent mais je ne pense pas vraiment que cela finisse par être important si vous le faites correctement. Comme ça:
Vous devriez maintenant pouvoir ajouter du CSS similaire à ce qui suit:
Assurez-vous que vous supprimez également toute déclaration explicite de hauteur ou de largeur dans l'objet et incorporez les balises qui sont généralement fournies avec le code d'intégration copié / collé.
Le fonctionnement dépend des propriétés de position de l'élément de classe vidéo et de l'élément que vous souhaitez conserver un certain rapport hauteur / largeur. Il tire parti de la façon dont une image conservera son rapport d'aspect approprié lorsqu'elle sera redimensionnée dans un élément. Il indique tout ce qui se trouve dans l'élément de classe vidéo pour tirer pleinement parti de l'immobilier fourni par l'image dynamique en forçant sa largeur / hauteur à 100% de l'élément de classe vidéo ajusté par l'image.
Assez cool, hein?
Vous devrez peut-être jouer avec un peu pour le faire fonctionner avec votre propre design, mais cela fonctionne étonnamment bien pour moi. Le concept général est là.
la source
Elliot m'a inspiré cette solution - merci:
aspectratio.png
est un fichier PNG complètement transparent avec la taille de votre format d'image préféré, dans mon cas 30x10 pixels.HTML
CSS3
Veuillez noter:
background-size
est une fonctionnalité css3 qui pourrait ne pas fonctionner avec vos navigateurs cibles. Vous pouvez vérifier l'interopérabilité (par exemple sur caniuse.com ).la source
Pour ajouter à la réponse de Web_Designer, le
<div>
aura une hauteur (entièrement composée de rembourrage inférieur) de 75% de la largeur de son é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 ainsi.Si vous souhaitez que votre div soit d'une largeur autre que 100%, vous avez besoin d'un autre div enveloppant sur lequel définir la largeur:
J'ai récemment utilisé quelque chose de similaire à l'astuce d'image d'Elliot pour me permettre d'utiliser des requêtes de médias CSS pour servir un fichier de logo différent en fonction de la résolution de l'appareil, mais toujours à l'échelle proportionnellement comme le
<img>
ferait naturellement (j'ai défini le logo comme image d'arrière-plan sur un .png transparent avec le bon rapport hauteur / largeur). Mais la solution de Web_Designer me sauverait une demande http.la source
Comme indiqué ici sur w3schools.com et quelque peu réitéré dans cette réponse acceptée , les valeurs de remplissage en pourcentages (soulignement le mien):
Ergo, un exemple correct de DIV réactif qui conserve un rapport d'aspect 16: 9 est le suivant:
CSS
HTML
Démo sur JSFiddle
la source
Comme @ web-tiki montre déjà un moyen d'utiliser
vh
/vw
, j'ai également besoin d'un moyen de centrer à l'écran, voici un code d'extrait pour 9:16 portrait.translateY
gardera ce centre à l'écran.calc(100vw * 16 / 9)
est la hauteur attendue pour 9/16.(100vw * 16 / 9 - 100vh)
est la hauteur de débordement, donc, tirez versoverflow height/2
le haut le gardera au centre de l'écran.Pour le paysage, et gardez 16: 9 , vous montrez l'utilisation
Le ratio 9/16 est facile à changer, pas besoin de prédéfini
100:56.25
ou100:75
.Si vous voulez d'abord assurer la hauteur, vous devez changer la largeur et la hauteur, par exempleheight:100vh;width: calc(100vh * 9 / 16)
pour 9:16 portrait.Si vous souhaitez vous adapter à différentes tailles d'écran, vous pouvez également être intéressé
@media (orientation: portrait)
/@media (orientation: landscape)
portrait
/landscape
pour changer le rapport.la source
Il s'agit d'une amélioration par rapport à la réponse acceptée:
la source
Je suis tombé sur une solution intelligente en utilisant
<svg>
etdisplay:grid
.L'élément de grille vous permet d'occuper le même espace avec deux (ou plus) éléments, sans avoir besoin de spécifier lequel définit la hauteur. Ce qui signifie que, hors de la boîte, le plus grand définit le rapport .
Cela signifie que vous pouvez l'utiliser tel quel lorsque vous savez que le contenu ne sera jamais assez grand pour remplir tout le "ratio" et que vous cherchez simplement un moyen de positionner le contenu dans cet espace (c'est-à-dire de le centrer sur les deux directions, utilisez
display:flex; align-items:center; justify-content:center
).C'est à peu près la même chose que d'utiliser un rapport transparent
<img>
avecdisplay:block
et prédéterminé, sauf qu'il<svg>
est plus léger et beaucoup plus facile à modifier (pour changer le rapport en conséquence, si vous en avez besoin).Il vous suffit de modifier le
<svg>
rapport s:<svg viewBox="0 0 4 3"></svg>
<svg viewBox="0 0 16 9"></svg>
Voyez-le fonctionner:
Afficher l'extrait de code
Si vous avez besoin d'une solution où l'élément de contenu n'est pas autorisé à définir le rapport lorsqu'il est plus grand (avec débordement masqué ou automatique), vous devez définir
position:relative
sur la grille etposition:absolute; height:100%; overflow-y: auto;
sur le contenu. Exemple:Afficher l'extrait de code
la source
Sur la base de vos solutions, j'ai fait quelques trucs:
Lorsque vous l'utilisez, votre code HTML sera uniquement
Pour l'utiliser de cette façon, faites: CSS:
et js (jQuery)
Et en ayant cela, vous définissez simplement attr
data-keep-ratio
sur hauteur / largeur et c'est tout.la source
data-keep-ratio
pas utiliserkeep-ratio
et obtenir sa valeur en utilisant$(this).data('keep-ratio');
Vous pouvez utiliser un svg. Rendez la position du conteneur / wrapper relative, placez d'abord le svg comme positionné statiquement, puis mettez le contenu absolument positionné (haut: 0; gauche: 0; droite: 0; bas: 0;)
Exemple avec des proportions 16: 9:
image.svg: (peut être inséré en src)
CSS:
HTML:
Notez que le svg en ligne ne semble pas fonctionner, mais vous pouvez encoder le svg en url et l'intégrer dans l'attribut img src comme ceci:
la source
SCSS est la meilleure solution dans mon cas; en utilisant un attribut de données:
Par exemple :
la source
la source
[data-aspect-ratio]
sélecteur d'attributs est à votre disposition en CSS.Alors que la plupart des réponses sont très cool, la plupart d'entre elles nécessitent d'avoir une image déjà dimensionnée correctement ... D'autres solutions ne fonctionnent que pour une largeur et ne se soucient pas de la hauteur disponible, mais parfois vous souhaitez également adapter le contenu à une certaine hauteur .
J'ai essayé de les coupler ensemble pour apporter une solution entièrement portable et redimensionnable ... L'astuce consiste à utiliser la mise à l'échelle automatique d'une image mais à utiliser un élément svg en ligne au lieu d'utiliser une image pré-rendue ou toute forme de deuxième requête HTTP ...
Notez que j'ai utilisé de grandes valeurs dans les attributs de largeur et de hauteur du SVG, car il doit être plus grand que la taille maximale attendue car il ne peut que rétrécir. L'exemple fait le rapport de div 10: 5
la source
Juste une idée ou un hack.
la source
disons que vous avez 2 divs, le div externe est un conteneur et l'intérieur peut être tout élément dont vous avez besoin pour garder son ratio (img ou une iframe youtube ou autre)
html ressemble à ceci:
disons que vous devez conserver le rapport de "l'élément"
rapport => 4 à 1 ou 2 à 1 ...
css ressemble à ceci
le rembourrage spécifié en% est calculé en fonction de la largeur et non de la hauteur. .. donc, fondamentalement, peu importe votre largeur, sa hauteur sera toujours calculée en fonction de cela. qui gardera le ratio.
la source
J'ai rencontré ce problème plusieurs fois, j'ai donc fait une solution JS pour cela. Cela ajuste essentiellement la hauteur du domElement en fonction de la largeur de l'élément par le rapport que vous spécifiez. Vous pouvez l'utiliser comme suit:
<div ratio="4x3"></div>
Veuillez noter que puisqu'il définit la hauteur de l'élément, l'élément doit être soit a
display:block
soitdisplay:inline-block
.https://github.com/JeffreyArts/html-ratio-component
la source
Si vous souhaitez placer un carré à l'intérieur de la fenêtre en mode portrait ou paysage (aussi grand que possible, mais rien ne dépasse à l'extérieur), basculez entre l'utilisation de
vw
/vh
sur l'orientationportrait
/landscape
:la source
Je voudrais partager ma solution, où j'ai un
img
-tag remplissant un certain rapport d'aspect. Je ne pouvais pas utiliser enbackground
raison du manque de soutien de la CMS et je ne préfère utiliser une balise de style comme ceci:<img style="background:url(...)" />
. De plus, la largeur est de 100%, il n'est donc pas nécessaire de la définir à une taille fixe comme dans certaines solutions. Il évoluera de manière réactive!la source
Vous pouvez y parvenir en utilisant SVG.
Cela dépend d'un cas, mais dans certains cas, c'est vraiment utile. À titre d'exemple - vous pouvez définir
background-image
sans définir de hauteur fixe ou l'utiliser pour intégrer YouTube<iframe>
avec un ratio16:9
,position:absolute
etc.Pour le
3:2
ratio définiviewBox="0 0 3 2"
et ainsi de suite.Exemple:
la source
Un moyen simple de conserver les proportions, en utilisant l'élément canvas.
Essayez de redimensionner le div ci-dessous pour le voir en action.
Pour moi, cette approche a fonctionné le mieux, donc je la partage avec d'autres afin qu'ils puissent en bénéficier également.
Fonctionne également avec une hauteur dynamique!
la source
Disons que vous aimez maintenir la largeur: 100px et la hauteur: 50px (c.-à-d. 2: 1) Faites simplement ce calcul:
la source
Eh bien, nous avons récemment reçu la possibilité d'utiliser la
aspect-ratio
propriété en CSS.https://twitter.com/Una/status/1260980901934137345/photo/1
Remarque: le support n'est pas encore le meilleur ...
https://caniuse.com/#search=aspect-ratio
la source
Vous pouvez utiliser la disposition de flux (FWD).
https://en.wikipedia.org/wiki/Adaptive_web_design
Il mettra à l'échelle et maintiendra la mise en page, c'est un peu complexe mais permet à une page de se redimensionner sans pousser le contenu comme (RWD).
Il semble réactif, mais il évolue. https://www.youtube.com/watch?v=xRcBMLI4jbg
Vous pouvez trouver la formule de mise à l'échelle CSS ici:
http://plugnedit.com/pnew/928-2/
la source
J'ai utilisé une nouvelle solution.
Au rapport d'aspect principal
Cependant, cela est relatif à la fenêtre entière. Donc, si vous avez besoin d'un div qui représente 30% de la largeur de la fenêtre, vous pouvez utiliser 30vw à la place, et puisque vous connaissez la largeur, vous les réutilisez en hauteur à l'aide de calc et vw unit.
la source
Si la structure entière du conteneur était basée sur un pourcentage, ce serait le comportement par défaut, pouvez-vous fournir un exemple plus spécifique?
Voici un exemple de ce que je veux dire, si toute votre hiérarchie parent était basée sur%, tout ajustement de la fenêtre du navigateur fonctionnerait sans js / css supplémentaire, n'est-ce pas une possibilité avec votre mise en page?
la source