492 votes

Comment faire pour que deux divs côte à côte aient la même hauteur ?

J'ai deux divs côte à côte. J'aimerais que leur hauteur soit la même et qu'elle reste la même si l'une d'elles est redimensionnée. Mais je n'arrive pas à résoudre ce problème. Des idées ?

Pour clarifier ma question, j'aimerais que les deux boîtes aient toujours la même taille, de sorte que si l'une d'entre elles s'agrandit parce que du texte y est placé, l'autre devrait s'agrandir pour correspondre à la hauteur.

<div style="overflow: hidden">
    <div style="border:1px solid #cccccc; float:left; padding-bottom:1000px; margin-bottom:-1000px">
        Some content!<br/>
        Some content!<br/>
        Some content!<br/>
        Some content!<br/>
        Some content!<br/>
    </div>
    <div style="border:1px solid #cccccc; float:left; padding-bottom:1000px; margin-bottom:-1000px">
        Some content!
    </div>
</div>

0 votes

Voulez-vous que si l'un d'eux grandit, l'autre garde la même taille ?

0 votes

Un exemple qui n'est pas une solution mais qui se trouve dans un environnement modifiable peut être trouvé ici : jsfiddle.net/PCJUQ

0 votes

Utilisez le javascript : stackoverflow.com/questions/3275850/

661voto

Pavlo Points 7084

Flexbox

Avec flexbox, il s'agit d'une seule déclaration :

.row {
  display: flex; /* equal height of the children */
}

.col {
  flex: 1; /* additionally, equal width */

  padding: 1em;
  border: solid;
}

<div class="row">
  <div class="col">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</div>
  <div class="col">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad omnis quae expedita ipsum nobis praesentium velit animi minus amet perspiciatis laboriosam similique debitis iste ratione nemo ea at corporis aliquam.</div>
</div>

Des préfixes peuvent être nécessaires pour les navigateurs plus anciens, cf. Support du navigateur .

18 votes

Flexbox a fonctionné comme un charme. Si vous développez un design réactif et que vous voulez que votre deuxième div descende sur des écrans plus petits, vous devrez définir .row sur display : block ; dans votre requête média.

9 votes

@NickZulu Je pense que dans ce cas, vous devriez définir flex-direction: column : jsfiddle.net/sdsgW/1

0 votes

Cela fonctionne parfaitement. Un petit rappel pour certains, .row doit également être flottant pour que cela fonctionne.

156voto

mqchen Points 3621

Il s'agit d'un problème courant que beaucoup ont rencontré, mais heureusement certains esprits intelligents comme Ed Eliot est sur son blog ont mis en ligne leurs solutions.

En gros, ce que vous faites, c'est que les deux divs/colonnes très haut en ajoutant un padding-bottom: 100% et ensuite "tromper le navigateur" en lui faisant croire qu'ils ne sont pas si grands en utilisant margin-bottom: -100% . Elle est mieux expliquée par Ed Eliot sur son blog, qui comprend également de nombreux exemples.

.container {
    overflow: hidden;
}
.column {
    float: left;
    margin: 20px;
    background-color: grey;
    padding-bottom: 100%;
    margin-bottom: -100%;
}

<div class="container">

    <div class="column">
        Some content!<br>
        Some content!<br>
        Some content!<br>
        Some content!<br>
        Some content!<br>
    </div>

    <div class="column">
        Something
    </div>

</div>

1 votes

L'explication de One True Layout était un peu pauvre, mais après avoir vérifié le premier lien, j'ai pu l'implémenter correctement à partir de l'un des exemples qu'il utilisait. Cependant, c'est vraiment mauvais parce que vous devez utiliser une image pour représenter le bord inférieur des colonnes, et c'est douteux pour le support des navigateurs. Cependant, cela fonctionne et ne dépend pas de javascript, donc je vais le marquer comme correct. Merci !

0 votes

Cela ne semble pas fonctionner dans les anciens navigateurs IE (oui, malheureusement, je dois encore supporter IE6). Y a-t-il un moyen de le rendre compatible ?

1 votes

@strongriley Allez voir le blog d'Ed Eliot : ejeliot.com/blog/61 Cela devrait fonctionner dans IE6. Peut-être le problème vient-il d'ailleurs ?

55voto

Paul D. Waite Points 35456

Il s'agit d'un domaine dans lequel CSS n'a jamais vraiment eu de solution. <table> (ou les simuler en utilisant les balises CSS display:table* ), car c'est le seul endroit où l'option "garder un groupe d'éléments à la même hauteur" a été mise en œuvre.

<div style="display: table-row;">

    <div style="border:1px solid #cccccc; display: table-cell;">
        Some content!<br/>
        Some content!<br/>
        Some content!<br/>
        Some content!<br/>
        Some content!<br/>
    </div>

    <div style="border:1px solid #cccccc;  display: table-cell;">
        Some content!
    </div>

</div>

Cela fonctionne dans toutes les versions de Firefox, Chrome et Safari, Opera à partir de la version 8 au moins, et dans IE à partir de la version 8.

6 votes

Cette solution n'est pas disponible pour ceux qui doivent prendre en charge IE6/IE7, mais je pense que c'est la plus propre.

2 votes

Cette réponse est PARFAITE ! juste un petit rappel : il se peut qu'un client exige "table" au lieu de "table-row".

0 votes

@user2025810 : aw, merci. Savez-vous quels clients exigent table au lieu de table-row ?

47voto

Derek Adair Points 6324

Utilisation de jQuery

Grâce à jQuery, vous pouvez le faire en une seule ligne de script super simplescript.

// HTML
<div id="columnOne">
</div>

<div id="columnTwo">
</div>

// Javascript
$("#columnTwo").height($("#columnOne").height());

Utilisation de CSS

Celle-ci est un peu plus intéressante. La technique s'appelle Fausses Colonnes . Plus ou moins, vous ne définissez pas vraiment les paramètres de l'opération. réel hauteur soit la même, mais vous modifiez certains éléments graphiques pour qu'ils soient regardez la même hauteur.

0 votes

Je pense que l'utilisation de JavaScript est une très bonne méthode. Le problème est qu'elle ne fonctionne pas si elle est désactivée. Je pense que je l'utiliserai de toute façon et que j'élaborerai la meilleure solution de rechange possible ;-) Merci !

14 votes

Cela implique que la hauteur de la colonne 1 est toujours supérieure à celle de la colonne 2.

2 votes

Vous devez comparer la hauteur des colonnes avant d'appliquer la hauteur pour elles. Je pense que js est la meilleure méthode pour ce problème, presque tous les navigateurs sont compatibles js, si non, ils devraient sortir de votre site web et beaucoup d'autres sites web.

16voto

geofflee Points 620

Je suis surpris que personne n'ait mentionné la technique (très ancienne mais fiable) des colonnes absolues : http://24ways.org/2008/absolute-columns/

À mon avis, elle est bien supérieure à la technique de Faux Columns et de One True Layout.

L'idée générale est qu'un élément avec position: absolute; se positionnera par rapport à l'élément parent le plus proche qui a position: relative; . Vous pouvez ensuite étirer une colonne pour qu'elle remplisse une hauteur de 100% en assignant à la fois un top: 0px; et bottom: 0px; (ou tout autre pixel/pourcentage dont vous avez réellement besoin.) Voici un exemple :

<!DOCTYPE html>
<html>
  <head>
    <style>
      #container
      {
        position: relative;
      }

      #left-column
      {
        width: 50%;
        background-color: pink;
      }

      #right-column
      {
        position: absolute;
        top: 0px;
        right: 0px;
        bottom: 0px;
        width: 50%;
        background-color: teal;
      }
    </style>
  </head>
  <body>
    <div id="container">
      <div id="left-column">
        <ul>
          <li>Foo</li>
          <li>Bar</li>
          <li>Baz</li>
        </ul>
      </div>
      <div id="right-column">
        Lorem ipsum
      </div>
    </div>
  </body>
</html>

1 votes

Si la colonne de droite comporte plus de lignes que celle de gauche, le contenu est en surnombre.

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