J'ai un site à créer qui a un rapport hauteur / largeur fixe d'environ 16:9
paysage, comme une vidéo.
Je veux qu'il soit centré et élargi pour remplir la largeur disponible et la hauteur disponible, mais ne jamais grossir d'un côté ou de l'autre.
Par exemple:
- Une page haute et fine aurait le contenu s'étendant sur toute la largeur tout en conservant une hauteur proportionnelle.
- Une page courte et large aurait le contenu s'étendant sur toute la hauteur, avec une largeur proportionnelle.
J'ai étudié deux méthodes:
- Utilisez une image avec le bon rapport hauteur / largeur pour développer un conteneur
div
, mais je n'ai pas pu le faire se comporter de la même manière dans les principaux navigateurs. - Définir un rembourrage inférieur proportionnel, mais qui ne fonctionne que relativement à la largeur et ignore la hauteur. Il ne cesse de s'agrandir avec la largeur et affiche des barres de défilement verticales.
Je sais que vous pourriez le faire avec JS assez facilement, mais j'aimerais une solution CSS pure.
Des idées?
html
css
responsive-design
aspect-ratio
Henry Gibson
la source
la source
position: relative (default) height: 0 padding-<top/bottom>: H/W*100%
Réponses:
Utilisez les nouvelles unités de fenêtre CSS
vw
etvh
(largeur de la fenêtre / hauteur de la fenêtre)VIOLON
Redimensionnez verticalement et horizontalement et vous verrez que l'élément remplira toujours la taille maximale de la fenêtre sans casser le rapport et sans barres de défilement!
(PURE) CSS
Afficher l'extrait de code
Si vous souhaitez utiliser un maximum de 90% de largeur et de hauteur de la fenêtre: FIDDLE
Afficher l'extrait de code
De plus, la prise en charge des navigateurs est également très bonne: IE9 +, FF, Chrome, Safari- caniuse
la source
vh
,vw
,vmin
,vmax
). Cependant, il existe une solution de contournement , qui utilise des requêtes multimédias pour cibler les appareils iOS.Simplement reformuler
Danield
la réponse dans un mixin MOINS, pour une utilisation ultérieure:la source
Utilisez une requête multimédia CSS
@media
avec les unités de la fenêtre CSSvw
etvh
pour vous adapter au rapport hauteur / largeur de la fenêtre. Cela a l'avantage de mettre à jour d'autres propriétés, commefont-size
aussi.Ce violon montre le rapport hauteur / largeur fixe pour le div et le texte correspondant exactement à son échelle.
La taille initiale est basée sur la pleine largeur:
Ensuite, lorsque la fenêtre est plus large que le rapport hauteur / largeur souhaité, passez à la hauteur comme mesure de base:
Ceci est très similaire dans la veine à l' approche
max-width
et de @Danield, juste plus flexible.max-height
la source
Ma question initiale était de savoir comment avoir à la fois un élément d'aspect fixe, mais l'adapter exactement à un conteneur spécifié, ce qui le rend un peu fastidieux. Si vous voulez simplement qu'un élément individuel conserve ses proportions, c'est beaucoup plus facile.
La meilleure méthode que j'ai rencontrée consiste à donner à un élément une hauteur nulle, puis à utiliser le pourcentage de remplissage en bas pour lui donner de la hauteur. Le pourcentage de remplissage est toujours proportionnel à la largeur d'un élément, et non à sa hauteur, même si son remplissage supérieur ou inférieur.
Propriétés de remplissage W3C
Ainsi, en utilisant cela, vous pouvez donner à un élément une largeur en pourcentage pour qu'il soit placé dans un conteneur, puis un remplissage pour spécifier le rapport hauteur / largeur, ou en d'autres termes, la relation entre sa largeur et sa hauteur.
Ainsi, dans l'exemple ci-dessus, l'objet prend 80% de la largeur du conteneur, puis sa hauteur est de 56,25% de cette valeur. Si sa largeur était de 160 pixels, le rembourrage inférieur, et donc la hauteur, serait de 90 pixels - un aspect 16: 9.
Le léger problème ici, qui n'est peut-être pas un problème pour vous, est qu'il n'y a pas d'espace naturel à l'intérieur de votre nouvel objet. Si vous avez besoin de mettre du texte par exemple et que ce texte doit prendre ses propres valeurs de remplissage, vous devez ajouter un conteneur à l'intérieur et spécifier les propriétés à l'intérieur.
De plus, les unités vw et vh ne sont pas prises en charge sur certains navigateurs plus anciens, donc la réponse acceptée à ma question pourrait ne pas vous être possible et vous devrez peut-être utiliser quelque chose de plus lo-fi.
la source
Je crois comprendre que vous avez demandé que vous souhaitiez une
CSS
solution spécifique. Pour conserver le rapport hauteur / largeur, vous devez diviser la hauteur par le rapport hauteur / largeur souhaité. 16: 9 = 1,777777777778.Pour obtenir la hauteur correcte du conteneur, vous devez diviser la largeur actuelle par 1,777777777778. Puisque vous ne pouvez pas vérifier le
width
contenu du conteneur avec justeCSS
ou diviser par un pourcentageCSS
, cela n'est pas possible sansJavaScript
(à ma connaissance).J'ai écrit un script de travail qui conservera le rapport hauteur / largeur souhaité.
HTML
CSS
JavaScript
Vous pouvez utiliser à
function
nouveau si vous souhaitez afficher autre chose avec un rapport différent en utilisantla source
window.onresize
est déclenché au moment où le navigateur change de taille.Il y a maintenant une nouvelle propriété CSS spécifié pour répondre ceci:
object-fit
.http://docs.webplatform.org/wiki/css/properties/object-fit
La prise en charge des navigateurs fait encore un peu défaut ( http://caniuse.com/#feat=object-fit ) - fonctionne actuellement dans une certaine mesure dans la plupart des navigateurs sauf Microsoft - mais étant donné le temps, c'est exactement ce qui était requis pour cette question.
la source
La réponse de Danield est bonne, mais elle ne peut être utilisée que lorsque la div remplit toute la fenêtre, ou en utilisant un peu de
calc
, peut être utilisée si la largeur et la hauteur de l'autre contenu dans la fenêtre sont connues.Cependant, en combinant l'
margin-bottom
astuce avec le procédé dans la réponse susmentionnée, le problème peut être réduit à simplement avoir à connaître la hauteur de l'autre contenu. Ceci est utile si vous avez un en-tête à hauteur fixe, mais que la largeur de la barre latérale, par exemple, n'est pas connue.Ici, c'est dans un jsfiddle utilisant scss , ce qui rend plus évident la provenance des valeurs.
la source
Sur la base de la réponse de Daniel , j'ai écrit ce mixin SASS avec interpolation (
#{}
) pour l'iframe d'une vidéo youtube qui se trouve dans une boîte de dialogue modale Bootstrap:Usage:
HTML:
Cela affichera toujours la vidéo sans les parties noires que YouTube ajoute à l'iframe lorsque la largeur ou la hauteur n'est pas proportionnelle à la vidéo. Remarques:
$sides-adjustment
est un léger ajustement pour compenser une infime partie de ces parties noires apparaissant sur les côtés;.modal-footer
;.modal-dialog
;.modal-header
.Après de nombreux tests, cela fonctionne parfaitement pour moi maintenant.
la source
voici une solution basée sur la solution @Danield, qui fonctionne même au sein d'un div.
Dans cet exemple, j'utilise Angular mais il peut rapidement passer à vanilla JS ou à un autre framework.
L'idée principale est simplement de déplacer la solution @Danield dans un iframe vide et de copier les dimensions après le changement de la taille de la fenêtre iframe.
Cette iframe doit s'adapter aux dimensions de son élément père.
https://stackblitz.com/edit/angular-aspect-ratio-by-iframe?file=src%2Findex.html
Voici quelques captures d'écran:
la source