Est-il possible de définir la même hauteur que la largeur (ratio 1: 1)?
Exemple
+----------+
| body |
| 1:3 |
| |
| +------+ |
| | div | |
| | 1:1 | |
| +------+ |
| |
| |
| |
| |
| |
+----------+
CSS
div {
width: 80%;
height: same-as-width
}
En utilisant jQuery, vous pouvez y parvenir en faisant
var cw = $('.child').width();
$('.child').css({'height':cw+'px'});
[Mise à jour: Bien que j’ai découvert ce truc de façon indépendante, j’ai depuis appris que Thierry Koblentz me battait. Vous pouvez trouver son article de 2009 sur A List Apart. Crédit où le crédit est dû.]
Je sais que c’est une vieille question, mais j’ai rencontré un problème similaire que je n’avais résolu que par CSS. Voici mon article de blog qui traite de la solution. Ce message contient un exemple en direct . Le code est republié ci-dessous.
HTML:
<div id="container">
<div id="dummy"></div>
<div id="element">
some text
</div>
</div>
CSS:
#container {
display: inline-block;
position: relative;
width: 50%;
}
#dummy {
margin-top: 75%; /* 4:3 aspect ratio */
}
#element {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: silver /* show me! */
}
#container {
display: inline-block;
position: relative;
width: 50%;
}
#dummy {
margin-top: 75%;
/* 4:3 aspect ratio */
}
#element {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: silver/* show me! */
}
<div id="container">
<div id="dummy"></div>
<div id="element">
some text
</div>
</div>
Il existe un moyen d'utiliser CSS!
Si vous définissez votre largeur en fonction du conteneur parent, vous pouvez définir la hauteur sur 0 et définir padding-bottom sur le pourcentage qui sera calculé en fonction de la largeur actuelle:
.some_element {
position: relative;
width: 20%;
height: 0;
padding-bottom: 20%;
}
Cela fonctionne bien dans tous les principaux navigateurs.
C'est possible sans Javascript :)
Cet article le décrit parfaitement - http://www.mademyday.de/css-height-equals-width-with-pure-css.html
Le HTML:
<div class='box'>
<div class='content'>Aspect ratio of 1:1</div>
</div>
Le CSS:
.box {
position: relative;
width: 50%; /* desired width */
}
.box:before {
content: "";
display: block;
padding-top: 100%; /* initial ratio of 1:1*/
}
.content {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
/* Other ratios - just apply the desired class to the "box" element */
.ratio2_1:before{
padding-top: 50%;
}
.ratio1_2:before{
padding-top: 200%;
}
.ratio4_3:before{
padding-top: 75%;
}
.ratio16_9:before{
padding-top: 56.25%;
}
Simple et neet: utilisez vw
unités pour une hauteur/largeur sensible en fonction de la largeur de la fenêtre.
vw: 1/100ème de la largeur de la fenêtre. ( Source MDN )
HTML:
<div></div>
CSS pour un rapport de format 1: 1:
div{
width:80vw;
height:80vw; /* same as width */
}
Tableau pour calculer la hauteur en fonction du format et de la largeur souhaités de l’élément.
aspect ratio | multiply width by
-----------------------------------
1:1 | 1
1:3 | 3
4:3 | 0.75
16:9 | 0.5625
Cette technique vous permet de:
position:absolute;
Ces unités sont supportées par IE9 + voir canIuse pour plus d’informations
HTML
<div id="container">
<div id="element">
some text
</div>
</div>
CSS
#container {
width: 50%; /* desired width */
}
#element {
height: 0;
padding-bottom: 100%;
}
En développant la technique de remplissage haut/bas, il est possible d'utiliser un pseudo élément pour définir la hauteur de l'élément. Utilisez les marges flottantes et négatives pour supprimer le pseudo-élément du flux et de la vue.
Cela vous permet de placer du contenu dans la boîte sans utiliser de positionnement supplémentaire div et/ou CSS.
.fixed-ar::before {
content: "";
float: left;
width: 1px;
margin-left: -1px;
}
.fixed-ar::after {
content: "";
display: table;
clear: both;
}
/* proportions */
.fixed-ar-1-1::before {
padding-top: 100%;
}
.fixed-ar-4-3::before {
padding-top: 75%;
}
.fixed-ar-16-9::before {
padding-top: 56.25%;
}
/* demo */
.fixed-ar {
margin: 1em 0;
max-width: 400px;
background: #EEE url(https://lorempixel.com/800/450/food/5/) center no-repeat;
background-size: contain;
}
<div class="fixed-ar fixed-ar-1-1">1:1 Aspect Ratio</div>
<div class="fixed-ar fixed-ar-4-3">4:3 Aspect Ratio</div>
<div class="fixed-ar fixed-ar-16-9">16:9 Aspect Ratio</div>
c'est vraiment un commentaire pour la réponse de Nathan, mais je ne suis pas encore autorisé à le faire ...
Je voulais conserver les proportions, même s’il y avait trop de choses à ranger dans la boîte. Son exemple élargit la hauteur, changeant les proportions. J'ai trouvé en ajoutant
overflow: hidden;
overflow-x: auto;
overflow-y: auto;
à l'élément. Voir http://jsfiddle.net/B8FU8/3111/