241 votes

Comment styliser une div pour qu'elle devienne un carré réactif ?

Je veux que ma div adapte sa hauteur pour qu'elle soit toujours égale à sa largeur. La largeur est un pourcentage. Lorsque la largeur du parent diminue, la boîte doit diminuer en conservant son rapport d'aspect.

Comment le faire en CSS ?

255voto

rahulbehl Points 2589

Fonctionne avec presque tous les navigateurs.

Vous pouvez essayer de donner padding-bottom en pourcentage.

<div style="height:0;width:20%;padding-bottom:20%;background-color:red">
<div>
Content goes here
</div>
</div>

La div extérieure forme un carré et la div intérieure contient le contenu. Cette solution a fonctionné pour moi à plusieurs reprises.

Voici une jsfiddle

217voto

Daniel Burkhart Points 1870

Pour obtenir ce que vous recherchez, vous pouvez utiliser la fonction longueur en pourcentage de la fenêtre de visualisation vw .

Voici un exemple rapide que j'ai réalisé sur jsfiddle .

HTML:

<div class="square">
    <h1>This is a Square</h1>
</div>

CSS:

.square {
    background: #000;
    width: 50vw;
    height: 50vw;
}
.square h1 {
    color: #fff;
}

Je suis sûr qu'il existe de nombreuses autres façons de procéder, mais celle-ci m'a semblé la meilleure.

71voto

gidzior Points 472

HTML

<div class='square-box'>
    <div class='square-content'>
        <h3>test</h3>
    </div>
</div>

CSS

.square-box{
    position: relative;
    width: 50%;
    overflow: hidden;
    background: #4679BD;
}
.square-box:before{
    content: "";
    display: block;
    padding-top: 100%;
}
.square-content{
    position:  absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    color: white;
    text-align: center;
}

http://jsfiddle.net/38Tnx/1425/

34voto

Chipe Points 1643

Il suffit de spécifier un fond de remplissage de la même taille que la largeur en pourcentage. Ainsi, si vous avez une largeur de 50 %, il vous suffit d'utiliser l'exemple suivant

id or class{
    width: 50%;
    padding-bottom: 50%;
}

Voici un jsfiddle http://jsfiddle.net/kJL3u/2/

Version éditée avec texte réactif : http://jsfiddle.net/kJL3u/394

8voto

gskalinskii Points 544

Une autre méthode consiste à utiliser un fichier 1x1.png transparent avec l'option width: 100% , height: auto dans un div et un contenu absolument positionné à l'intérieur de celui-ci :

html :

<div>
    <img src="1x1px.png">
    <h1>FOO</h1>
</div>

css :

div {
    position: relative;
    width: 50%;
}

img {
    width: 100%;
    height: auto;
}

h1 {
    position: absolute;
    top: 10px;
    left: 10px;
}

Fidle : http://jsfiddle.net/t529bjwc/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X