Maintenir le ratio d'aspect de la div mais de remplir la largeur de l'écran et de la hauteur en CSS?
J'ai un site pour mettre ensemble qui a un rapport largeur /longueur fixe d'environ 16:9
paysage, comme une vidéo.
Je veux l'avoir et axée sur l'étendre à remplir la disposition de la largeur et de la hauteur disponible, mais jamais de grandir sur chaque côté.
Par exemple:
- Un grand et mince page le contenu de l'étirement de la totalité de la largeur tout en conservant une hauteur proportionnelle.
- Une courte échelle de page le contenu de l'étirement de la hauteur, avec une largeur proportionnelle.
Il y a deux méthodes que j'ai été à la recherche à:
- Utiliser une image avec le bon ratio d'aspect pour développer un conteneur
div
, mais je ne pouvais pas le faire se comporter de la même manière sur les principaux navigateurs. - Réglage proportionnel remplissage en bas, mais qui ne fonctionne que relativement à la largeur et ignore la hauteur. Il juste ne cesse de s'agrandir avec la largeur et affiche les barres de défilement verticale.
Je sais que vous pouvez le faire avec JS assez facilement, mais je voudrais un pur CSS solution.
Des idées?
- sitepoint.com/... l'Ensemble div conteneur à
position: relative (default) height: 0 padding-<top/bottom>: H/W*100%
Vous devez vous connecter pour publier un commentaire.
Utiliser le nouveau CSS fenêtre d'affichage unités
vw
etvh
(fenêtre d'affichage de la largeur /hauteur de la fenêtre d'affichage)VIOLON
Redimensionner verticalement et horizontalement, et vous verrez que l'élément sera toujours remplir le maximum de la taille de la fenêtre sans casser le ratio et sans les barres de défilement!
(PUR) CSS
CSS:
HTML:
Si vous souhaitez utiliser un maximum de 90% de la largeur et de la hauteur de la fenêtre d'affichage: VIOLON
CSS:
HTML:
Aussi, prise en charge du navigateur est très bonne aussi: IE9+, FF, Chrome, Safari- caniuse
vh
,vw
,vmin
,vmax
). Cependant, il y a un solution, qui utilise les media queries pour cible les appareils iOS.display:block
overflow: hidden;
pour le corps .. donc mon corps css decl ressemble à ceci maintenant:body { width: 100%; height: 100%; overflow: hidden;
}Juste de reformuler
Danield
's réponse en MOINS de mixin, pour une autre utilisation:Utiliser un CSS media query
@media
avec le CSS fenêtre d'affichage unitésvw
etvh
de s'adapter à l'aspect ratio de la fenêtre d'affichage. Ceci a l'avantage de mettre à jour d'autres propriétés, comme lafont-size
, trop.Ce violon montre les proportions fixes pour la div, et le texte correspondant à son échelle exactement.
Taille initiale est basée sur la pleine largeur:
Puis, lorsque la fenêtre est plus large que le format d'image désiré, passez à hauteur de la base de mesure:
Ceci est très similaire dans la veine de la
max-width
etmax-height
approche par @Danield, juste un peu plus flexible.À ma question originale pour ce est de savoir comment les deux ont un élément d'une installation fixe d'aspect, mais pour l'ajustement à l'intérieur d'un conteneur spécifié exactement, ce qui le rend un peu laborieux. Si vous voulez simplement un élément individuel de maintenir son ratio d'aspect, il est beaucoup plus facile.
La meilleure méthode que j'ai trouver est de donner un élément de hauteur nulle, puis à l'aide de pourcentage padding-bottom pour lui donner de la hauteur. Pourcentage de remplissage est toujours proportionnelle à la largeur d'un élément, et non à sa hauteur, même si le haut ou le bas du rembourrage.
W3C Rembourrage des Propriétés d'
Donc, en utilisant que vous pouvez donner à un élément d'un pourcentage de la largeur de s'asseoir dans un récipient, puis le rembourrage pour spécifier le format, ou en d'autres termes, le rapport 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 c'est la largeur a été 160px puis le bas du rembourrage, et donc la hauteur serait 90px - un aspect de 16:9.
Le léger problème ici, ce qui peut ne pas être un problème pour vous, c'est qu'il n'y a pas d'espace naturel à l'intérieur de votre nouvel objet. Si vous avez besoin de mettre un peu de texte par exemple, et que le texte doit prendre ses propres valeurs de remplissage, vous devez ajouter un conteneur à l'intérieur et à spécifier les propriétés de là.
Également vw et vh unités ne sont pas pris en charge sur certains navigateurs plus anciens, de sorte que l'on a accepté la réponse à ma question peut ne pas être possible pour vous et vous pourriez avoir à utiliser quelque chose de plus lo-fi gratuite.
Je comprends que vous avez demandé à qui vous souhaitez un
CSS
solution spécifique. Pour conserver les proportions, vous devez diviser la hauteur souhaité par le ratio d'aspect. 16:9 = 1.777777777778.Pour obtenir la bonne hauteur pour le conteneur, vous devez diviser la largeur actuelle par 1.777777777778. Puisque vous ne pouvez pas vérifier la
width
du récipient avec justeCSS
ou diviser par un pourcentage estCSS
, ce n'est pas possible sansJavaScript
(à ma connaissance).J'ai écrit un travail de script qui permettra de conserver le format d'image désiré.
HTML
CSS
JavaScript
Vous pouvez utiliser le
function
de nouveau si vous souhaitez afficher quelque chose d'autre avec un ratio différent en utilisantwindow.onresize
est déclenché au moment où le navigateur des changements de taille.Il y a maintenant une nouvelle propriété CSS spécifié à cette adresse:
object-fit
.http://docs.webplatform.org/wiki/css/properties/object-fit
Prise en charge du navigateur est toujours en manque un peu (http://caniuse.com/#feat=object-fit) - travaille actuellement dans une certaine mesure, dans la plupart des navigateurs à l'exception de Microsoft mais vu le temps c'est exactement ce qui est requis pour cette question.
Danield réponse est bon, mais il ne peut être utilisé lorsque la div remplit l'ensemble de la fenêtre d'affichage, ou en utilisant un peu de
calc
, peuvent être utilisés si la largeur et la hauteur de l'autre le contenu dans la fenêtre d'affichage est connu.Toutefois, en combinant les
margin-bottom
truc avec la méthode de ladite réponse, le problème peut être réduit à devoir connaître la hauteur de l'autre contenu. Ceci est utile si vous avez une hauteur fixe-tête, mais la largeur de la barre latérale, par exemple, n'est pas connu.CSS:
HTML:
Ici, il est dans un jsfiddle à l'aide de scss, ce qui rend plus évident où viennent les valeurs de.
Basé sur La réponse de Daniel, j'ai écrit ce mixin SASS avec interpolation (
#{}
) pour une vidéo youtube de l'iframe qui est à l'intérieur d'un fichier d'amorce de dialogue modale:Utilisation:
HTML:
Ce sera toujours afficher la vidéo sans que les parties noires que youtube ajoute à l'iframe lorsque la largeur ou la hauteur n'est pas proportionnelle à la vidéo. Notes:
$sides-adjustment
est un léger ajustement pour compenser une infime partie de ces pièces noires montrant sur les côtés;.modal-footer
;.modal-dialog
;.modal-header
.Après beaucoup de tests, cela fonctionne parfaitement pour moi maintenant.