Comment puis-je forcer une DIV flottante à correspondre à la hauteur d'une autre DIV flottante?

mon code HTML divise simplement les pages en deux colonnes, 65% et 35% respectivement.

<div style="float : left; width :65%; height:auto;background-color:#FDD017;">
   <div id="response">
   </div> 
</div>
<div style="float : left; width :35%;height:auto; background-color:#FDD017;">
   <div id="note">
   </div>
</div> 

dans le response div , j'ai des données variables; dans le note div , j'ai des données fixes. Même si les deux div s ont deux ensembles différents de données, j'ai besoin d'eux pour afficher avec la même hauteur de sorte que les couleurs de fond apparaissent pour remplir une boîte contenant les deux. Naturellement, le problème est le response div , comme son la hauteur varie en fonction de la quantité de données actuellement affichées à l'intérieur.

Comment puis-je m'assurer que la hauteur des deux colonnes est toujours égale?

67
demandé sur Shog9 2009-02-08 23:20:22

11 réponses

les envelopper dans un div contenant avec la couleur de fond appliquée à elle, et avoir un div de clarification après les 'colonnes'.

<div style="background-color: yellow;">
  <div style="float: left;width: 65%;">column a</div>
  <div style="float: right;width: 35%;">column b</div>
  <div style="clear: both;"></div>
</div>

mis à Jour pour répondre à certains commentaires et mes propres pensées:

cette méthode fonctionne parce que c'est essentiellement une simplification de votre problème, dans cette méthode un peu "oldskool" j'ai mis deux colonnes dans suivie d'un élément de compensation vide, le travail de l'élément de compensation est de dire le parent (avec l'arrière-plan) c'est là où le comportement flottant se termine, ce qui permet au parent de rendre essentiellement 0 pixels de hauteur à la position du clair, qui sera quel que soit l'élément flottant le plus élevé est.

la raison en est de s'assurer que l'élément parent est aussi haut que la colonne la plus haute, le fond est alors placé sur le parent pour donner l'apparence que les deux colonnes ont la même hauteur.

Il convient de noter que cette la technique est " oldskool "parce que le meilleur choix est de déclencher ce comportement de calcul de hauteur avec quelque chose comme clearfix ou tout simplement avoir débordement: caché sur l'élément parent.

alors que cela fonctionne dans ce scénario limité, si vous souhaitez que chaque colonne ait l'air visuellement différent, ou avoir un espace entre eux, alors mettre un arrière-plan sur l'élément parent ne fonctionnera pas, il y a cependant un truc pour obtenir cet effet.

le truc est d'ajouter le rembourrage de fond à toutes les colonnes, à la quantité maximale de taille que vous attendez qui pourrait être la différence entre la colonne la plus courte et la plus haute, si vous ne pouvez pas travailler cela dehors puis choisissez un grand chiffre, vous devez alors ajouter une marge de fond négative du même nombre.

vous aurez besoin de débordement caché sur l'objet parent, mais le résultat sera que chaque colonne demandera de rendre cette hauteur supplémentaire suggérée par la marge, mais pas réellement demander la mise en page de cette taille (parce que la marge négative s'oppose au calcul).

cela rendra le parent à la taille de la colonne la plus haute, tout en permettant à toutes les colonnes de rendre à leur hauteur + la taille du rembourrage de fond utilisé, si cette hauteur est plus grande que le parent, alors le reste sera simplement découper.

<div style="overflow: hidden;">
  <div style="background: blue;float: left;width: 65%;padding-bottom: 500px;margin-bottom: -500px;">column a<br />column a</div>
  <div style="background: red;float: right;width: 35%;padding-bottom: 500px;margin-bottom: -500px;">column b</div>
</div>

vous pouvez voir un exemple de cette technique sur le bowers et wilkins site web (voir la quatre images horizontales de spotlight au bas de la page).

100
répondu meandmycode 2011-01-26 22:29:43

si vous essayez de forcer une div flottante à correspondre à une autre pour créer un effet de colonne, c'est ce que je fais. Je l'aime parce que c'est simple et propre.

<div style="background-color: #CCC; width:300px; overflow:hidden; ">
    <!-- Padding-Bottom is equal to 100% of the container's size, Margin-bottom hides everything beyond
         the container equal to the container size. This allows the column to grow with the largest
         column. -->
    <div style="float: left;width: 100px; background:yellow; padding-bottom:100%; margin-bottom:-100%;">column a</div>
    <div style="float: left;width: 100px;  background:#09F;">column b<br />Line 2<br />Line 3<br />Line 4<br />Line 5</div>
    <div style="float:left; width:100px; background: yellow; padding-bottom:100%; margin-bottom:-100%;">Column C</div>
    <div style="clear: both;"></div>
</div>

je pense que c'est logique. Il semble bien fonctionner, même avec du contenu dynamique.

38
répondu Dyson 2013-03-01 20:40:14

voici un plugin jQuery pour définir les hauteurs de divs multiples pour être les mêmes. Et voici le code réel du plugin.

$.fn.equalHeights = function(px) {
$(this).each(function(){
var currentTallest = 0;
$(this).children().each(function(i){
    if ($(this).height() > currentTallest) { currentTallest = $(this).height(); }
        });
    if (!px || !Number.prototype.pxToEm) currentTallest = currentTallest.pxToEm(); //use ems unless px is specified
        // for ie6, set height since min-height isn't supported
    if ($.browser.msie && $.browser.version == 6.0) { $(this).children().css({'height': currentTallest}); }
        $(this).children().css({'min-height': currentTallest}); 
    });
    return this;
};
15
répondu Justin Yost 2009-02-08 20:33:27

la solution correcte pour ce problème est d'utiliser display: table-cell

Important: Cette solution n'a pas besoin de float puisque table-cell transforme déjà le div en un élément qui s'aligne avec les autres dans le même conteneur. Cela signifie également que vous n'avez pas à vous soucier de nettoyer les flotteurs, débordement, arrière-plan brillant à travers et toutes les autres mauvaises surprises que le float hack apporte à la partie.

CSS:

.container {
  display: table;
}
.column {
  display: table-cell;
  width: 100px;
}

HTML:

<div class="container">
    <div class="column">Column 1.</div>
    <div class="column">Column 2 is a bit longer.</div>
    <div class="column">Column 3 is longer with lots of text in it.</div>
</div>

Related:

9
répondu Aaron Digulla 2014-05-06 10:04:23

Vous devez envelopper dans un div sans flotteur.

<div style="float:none;background:#FDD017;" class="clearfix">
    <div id="response" style="float:left; width:65%;">Response with two lines</div>
    <div id="note" style="float:left; width:35%;">single line note</div>
</div>

j'utilise aussi le patch clearfix ici http://www.webtoolkit.info/css-clearfix.html

6
répondu bendewey 2009-02-08 20:27:07

Je ne comprends pas pourquoi cette question Est pilonnée dans le sol alors qu'en 30 secondes vous pouvez coder une table à deux colonnes et résoudre le problème.

ce problème de hauteur de colonne div se pose sur une disposition typique. Pourquoi recourir au script quand une simple vieille étiquette HTML de base le fera? À moins qu'il y ait des tables énormes et nombreuses sur une disposition, Je ne crois pas à l'argument que les tables sont significativement plus lentes.

4
répondu Erich Richter 2013-03-01 20:38:32

Flex le fait par défaut.

<div id="flex">
 <div id="response">
 </div> 
 <div id="note">
 </div>
</div>   

CSS:

#flex{display:flex}
#response{width:65%}
#note{width:35%}

https://jsfiddle.net/784pnojq/1/

BONUS: lignes multiples

https://jsfiddle.net/784pnojq/2/

1
répondu Nick Manning 2016-01-13 00:49:44

je vous recommande de les envelopper tous les deux dans une div externe avec la couleur de fond désirée.

0
répondu chaos 2009-02-08 20:25:20

vous pouvez toujours utiliser une image de fond pour le faire aussi. J'ai tendance à voter pour cette option 100% du temps car la seule autre solution parfaite est L'option Jquery.

comme avec l'utilisation de la div externe avec une couleur de fond, vous finirez par avoir le contenu dans les deux divs atteignant la même hauteur.

0
répondu Drew 2010-06-21 11:15:57

ce code vous permettra d'avoir un nombre variable de rangées (avec un nombre variable de DIVs sur chaque rangée) et il fera que toutes les DIVs sur chaque rangée correspondent à la hauteur de son plus haut voisin:

si nous avons supposé que toutes les DIVs, qui sont flottantes, sont à l'intérieur d'un conteneur avec le id "divContainer", alors vous pouvez utiliser ce qui suit:

$(document).ready(function() {

var currentTallest = 0;
var currentRowStart = 0;
var rowDivs = new Array();

$('div#divContainer div').each(function(index) {

    if(currentRowStart != $(this).position().top) {

        // we just came to a new row.  Set all the heights on the completed row
        for(currentDiv = 0 ; currentDiv < rowDivs.length ; currentDiv++) rowDivs[currentDiv].height(currentTallest);

        // set the variables for the new row
        rowDivs.length = 0; // empty the array
        currentRowStart = $(this).position().top;
        currentTallest = $(this).height();
        rowDivs.push($(this));

    } else {

        // another div on the current row.  Add it to the list and check if it's taller
        rowDivs.push($(this));
        currentTallest = (currentTallest < $(this).height()) ? ($(this).height()) : (currentTallest);

    }
    // do the last row
    for(currentDiv = 0 ; currentDiv < rowDivs.length ; currentDiv++) rowDivs[currentDiv].height(currentTallest);

});
});
0
répondu HardlyNoticeable 2011-01-26 19:01:41

ayant eu le même type de problème aussi bien, nécessitant trois divs à côté de l'autre avec un contenu différent, avec des bordures à droite pour les "séparer", la seule solution qui a fonctionné était une version légèrement modifiée de l'option jQuery dans une autre réponse. Rappelez-vous que vous avez également besoin du script trouvé ici .

ci-dessous est ma version légèrement modifiée du script, qui permet juste un vrai réglage de min-height (comme j'avais besoin de mes boîtes pour être à moins d'une certaine hauteur).

/*--------------------------------------------------------------------
 * JQuery Plugin: "EqualHeights"
 * by:    Scott Jehl, Todd Parker, Maggie Costello Wachs (http://www.filamentgroup.com)
 *
 * Copyright (c) 2008 Filament Group
 * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php)
 *
 * Description:   Compares the heights or widths of the top-level children of a provided element
                  and sets their min-height to the tallest height (or width to widest width). Sets in em units
                  by default if pxToEm() method is available.
 * Dependencies: jQuery library, pxToEm method    (article:
                  http://www.filamentgroup.com/lab/retaining_scalable_interfaces_with_pixel_to_em_conversion/)
 * Usage Example: $(element).equalHeights();
                  Optional: to set min-height in px, pass a true argument: $(element).equalHeights(true);
                  Optional: to specify an actual min-height (in px), pass an integer value, regardless of previous parameter: $(element).equalHeights(false,150);
 * Version: 2.0, 08.01.2008
--------------------------------------------------------------------*/

$.fn.equalHeights = function(px,minheightval) {
    $(this).each(function(){
        if (minheightval != undefined) { 
            var currentTallest = minheightval;    
        } 
        else { 
            var currentTallest = 0;
        }
        $(this).children().each(function(i){
            if ($(this).height() > currentTallest) { 
                currentTallest = $(this).height();
            }
        });
        if (!px || !Number.prototype.pxToEm) 
            currentTallest = currentTallest.pxToEm(); //Use ems unless px is specified.
        // For Internet Explorer 6, set height since min-height isn't supported.
        if ($.browser.msie && $.browser.version == 6.0) { 
            $(this).children().css({'height': currentTallest});
        }
        $(this).children().css({'min-height': currentTallest});
    });
    return this;
};

Il fonctionne comme un charme et ne ralentit pas n'importe quoi :)

0
répondu David 2013-03-01 20:37:33