Placer des hauteurs égales pour les div avec jQuery

je veux mettre la même hauteur pour les divs avec jQuery. Toutes les divs peuvent avoir une quantité différente de contenu et une hauteur par défaut différente. Voici un exemple de ma mise en page html:

<div class="container">
    <div class="column">This is<br />the highest<br />column</div>
    <div class="column">One line</div>
    <div class="column">Two<br />lines</div>
</div>
<div class="container">
    <div class="column">One line</div>
    <div class="column">Two<br>lines</div>
    <div class="column">One line</div>
</div>

je règle la hauteur avec la prochaine fonction jQuery:

$(document).ready(function(){

    var highestBox = 0;
        $('.container .column').each(function(){  
                if($(this).height() > highestBox){  
                highestBox = $(this).height();  
        }
    });    
    $('.container .column').height(highestBox);

});

cela fonctionne bien mais pas dans mon cas parce que je veux que toutes les 'colonnes' soient égales seulement à l'intérieur d'un 'conteneur'. Cela signifie que, dans le premier contenant toutes les cases doivent être aussi haut que le premier div, mais la deuxième ils doivent être égales à la deuxième colonne.

alors la question Est -- Comment dois-je modifier mon jQuery pour atteindre ceci?

Merci!

29
demandé sur Mitya Ustinov 2012-07-27 16:58:57

15 réponses

Réponse à votre question

votre code vérifiait toutes les colonnes dans n'importe quel conteneur, ce que vous devez faire est:

  • boucle à travers chaque récipient
    • obtenir les hauteurs de chaque colonne dans ce conteneur
    • Trouver le plus haut
    • appliquer cette hauteur à chaque colonne du contenant avant de passer à la suivante.

Note: Essayez de fournir un exemple jsfiddle de votre problème, il nous permet pour vous aider plus facilement et comprendre le problème, vous solution de travail tout de suite et il encourage des réponses plus rapides.

Rapide (Rugueux) Exemple

$(document).ready(function(){

    // Select and loop the container element of the elements you want to equalise
    $('.container').each(function(){  
      
      // Cache the highest
      var highestBox = 0;
      
      // Select and loop the elements you want to equalise
      $('.column', this).each(function(){
        
        // If this box is higher than the cached highest then store it
        if($(this).height() > highestBox) {
          highestBox = $(this).height(); 
        }
      
      });  
            
      // Set the height of all those children to whichever was highest 
      $('.column',this).height(highestBox);
                    
    }); 

});
.container { border 1px solid red; }
.column { border: 1px solid blue; float:left; width: 30%; text-align:center; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<div class="container">
    <div class="column">This is<br />the highest<br />column</div>
    <div class="column">One line</div>
    <div class="column">Two<br />lines</div>
</div>
<div class="container">
    <div class="column">One line</div>
    <div class="column">Two<br>lines</div>
    <div class="column">One line</div>
</div>



Bibliothèque!

Voici une bibliothèque que j'ai trouvé qui semble prometteur si vous vous en voulez plus contrôles de péréquation astucieux

http://brm.io/jquery-match-height-demo/




Adressage @Mem question

Question: Va $(document).ready() si vous avez des images qui ont besoin de charger qui à son tour modifier les hauteurs de conteneurs?



égalisation hauteurs après le chargement de l'image

si vous chargez des images, vous constaterez que cette solution ne fonctionne pas toujours. C'est parce que document.ready est tiré le plus tôt possible, ce qui signifie qu'il n'attend pas que des ressources externes soient chargées (comme des images).

lorsque vos images se chargent enfin, elles peuvent déformer les hauteurs de leurs conteneurs après que le script d'égalisation a été exécuté, ce qui le fait apparaître trop peu travail.



résolution égalisation des hauteurs avec des images

  1. Lier une image événements de chargement

C'est la meilleure solution (au moment de la rédaction) et implique la liaison à l' img.load événement. Tout ce que vous avez à faire est de compter combien d'img il y a $('img').length et puis, pour chacun des load,-1 à partir de ce compte jusqu'à ce que vous atteigniez zéro, puis tirez l'égaliseur.

La mise en garde load ne peut pas tirer dans tous les navigateurs, si l'image est dans le cache. Regardez autour de google / github, il devrait y avoir un script de solution là-bas. Au moment de l'écriture, j'ai trouvé waitForImages from Alexander Dickson (pas testé, ce n'est pas une approbation).

  1. une autre solution plus fiable est window.load événement. Cela devrait généralement toujours. Cependant, si vous consultez le docs, vous remarquerez que cet événement se déclenche après que toutes les ressources externes sont chargées. Cela signifie que si vos images sont chargées mais qu'il y a du javascript en attente de téléchargement, il ne se déclenche pas tant que cela n'est pas terminé.

si vous chargez la majorité de vos externes de manière asynchrone et que vous êtes habile à minimiser, comprimer et répartir la charge, vous n'aurez probablement aucun problème avec cette méthode, cependant un CDN soudainement lent (se produit tout le temps) pourrait causer des problèmes.

Dans les deux cas, vous pourriez prendre un muet approchez et appliquez des minuteries de secours. Demandez au script d'égalisation de s'exécuter automatiquement après quelques secondes juste au cas où l'événement ne se déclencherait pas ou que quelque chose se déclenche lentement hors de votre contrôle. Ce n'est pas une preuve évidente, mais en réalité vous satisferez 99% de vos visiteurs avec ce repli si vous accordez la minuterie correctement.

77
répondu Lee 2016-03-10 17:39:25
$(document).ready(function(){

    $('.container').each(function(){  
        var highestBox = 0;

        $(this).find('.column').each(function(){
            if($(this).height() > highestBox){  
                highestBox = $(this).height();  
            }
        })

        $(this).find('.column').height(highestBox);
    });    


});
9
répondu Snow Blind 2012-07-27 13:08:46

Vous avez besoin de ceci:

$('.container').each(function(){  
     var $columns = $('.column',this);
     var maxHeight = Math.max.apply(Math, $columns.map(function(){
         return $(this).height();
     }).get());
     $columns.height(maxHeight);
});

Explication

  • l'extrait suivant construit un tableau des hauteurs:

    $columns.map(function(){
        return $(this).height();
    }).get()
    
  • Math.max.apply( Math, array ) trouve le maximum d'éléments de tableau

  • $columns.height(maxHeight); définit la hauteur de toutes les colonnes à la hauteur maximale.

démonstration

6
répondu Engineer 2012-07-27 13:25:41

amélioration Importante! (J'ai ajouté $(ceci).hauteur ('auto'); Avant de mesurer la hauteur - nous devrions la Réinitialiser à auto. Ensuite, nous pouvons utiliser cette fonction sur redimensionner)

function equalheight () {
            $('.cont_for_height').each(function(){  

                var highestBox = 0;
                $('.column_height', this).each(function(){

                    var htmlString = $( this ).html()

                    ;


                $(this).height('auto');

                    if($(this).height() > highestBox) 
                       highestBox = $(this).height(); 
                });  

                $('.column_height',this).height(highestBox);

        });  

        }
4
répondu squarepixell 2014-09-26 06:44:15

C'est ma version de blocs de la même hauteur... Par exemple, vous avez un DIV qui contient des divs avec le nom "col"

$('.col').parent().each(function() {
    var height = 0,
        column = $(this).find('.col');
    column.each(function() {
        if ($(this).height() > height) height = $(this).height();
    });
    column.height(height);
});
3
répondu Scribilicious 2014-07-21 10:10:55
  <script>
function equalHeight(group) {
   tallest = 0;
   group.each(function() {
      thisHeight = $(this).height();
      if(thisHeight > tallest) {
         tallest = thisHeight;
      }
   });
   group.height(tallest);
}
$(document).ready(function() {
   equalHeight($(".column"));
});
</script>
1
répondu Minu Alex 2015-05-19 05:16:22

vous avez besoin d'imagesLoaded si le conteneur a des images à l'intérieur. Cela fonctionne pour sensible aussi.

$(document).ready(function () { 
     equalHeight('.column');
});
$(window).resize(function(){equalHeight('.column');});

function equalHeight(columnClass){
    $('.eq-height-wrap').imagesLoaded(function(){
        $('.eq-height-wrap').each(function(){  

            var maxHeight = Math.max.apply(null, $(this).find(columnClass).map(function ()
            {
                return $(this).innerHeight();
            }).get());

            $(columnClass,this).height(maxHeight);
        });
    });
}
1
répondu kmiloangel 2015-08-14 15:38:43

donc, au-dessous du script jquery pour définir la hauteur égale à la colonne qui est mathématique.max calcule la hauteur des deux divs et prend la plus haute hauteur soit il peut être à gauche ou à droite.

$(document).ready(function() {
var Equalheights = Math.max($(“#left”).height(), $(“#right”).height());
$(“#left”). Equalheights(d);
$(“#right”). Equalheights(d);
});
Highest height will be assigned to both left and right divs

Démonstration

1
répondu Faizal 2018-07-04 13:32:31

Vous pouvez écrire la fonction de cette façon aussi qui aide à construire votre code une fois juste pour ajouter le nom de la classe ou L'ID à la fin

function equalHeight(group) {
               tallest = 0;
               group.each(function() {
                  thisHeight = jQuery(this).height();
                  if(thisHeight > tallest) {
                     tallest = thisHeight;
                  }
               });
               group.height(tallest);
            }
            equalHeight(jQuery("Add your class"));
1
répondu Chetan bane 2018-08-13 10:38:54

vous pouvez atteindre chaque conteneur séparé en utilisant .parent() API.

Comme,

var highestBox = 0;
        $('.container .column').each(function(){  
                if($(this).parent().height() > highestBox){  
                highestBox = $(this).height();  
        }
    }); 
0
répondu AdityaParab 2012-07-27 13:03:23

var currentTallest = 0,
     currentRowStart = 0,
     rowDivs = new Array(),
     $el,
     topPosition = 0;

 $('.blocks').each(function() {

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

     // 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 = topPostion;
     currentTallest = $el.height();
     rowDivs.push($el);

   } else {

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

  }
   
  // do the last row
   for (currentDiv = 0 ; currentDiv < rowDivs.length ; currentDiv++) {
     rowDivs[currentDiv].height(currentTallest);
   }
   
 });​
$('.blocks') would be changed to use whatever CSS selector you need to equalize.
0
répondu krishanan 2015-02-13 08:16:45
https://github.com/dubbs/equal-height

$('.columns').equalHeight();

si vous voulez les grouper par leur position supérieure, par exemple. au sein de chaque conteneur:

$('.columns').equalHeight({ groupByTop: true });
0
répondu strictlyk3v 2016-05-23 23:08:36
function setEqualHeight(columns) {
  var tallestColumn = 0;

  columns.each(function(){
    var currentHeight = $(this).height();

    if(currentHeight > tallestColumn){
      tallestColumn  = currentHeight;
    }
  });

  columns.height(tallestColumn);
}

=> setEqualHeight($('.column'));
0
répondu Sky Yip 2016-09-19 08:11:38
// Select and loop the container element of the elements you want to equalise
        $('.equal').each(function(){  

          // Cache the highest
          var highestBox = 0;

          // Select and loop the elements you want to equalise
          $('.col-lg-4', this).each(function(){

            // If this box is higher than the cached highest then store it
            if($(this).height() > highestBox) {
              highestBox = $(this).height(); 
            }

          });  

          // Set the height of all those children to whichever was highest 
          $('.col-lg-4',this).height(highestBox);

        }); 

    });
0
répondu Shahzaib khan 2017-04-10 15:35:33
<div class('a')>
   <div class('.cols-to-eq')></div>
   <div class('.cols-to-eq')></div>
   <div class('.cols-to-eq')></div>
   <div class('.cols-to-eq')></div>
</div>
<div class('b')>
   <div class('.cols-to-eq')></div>
   <div class('.cols-to-eq')></div>
   <div class('.cols-to-eq')></div>
   <div class('.cols-to-eq')></div>
</div>
var a = ['.a','.b'];
a.forEach(function(value) {
    var column = 0;
    $(value).find('.cols-to-eq').each(function(){
        if($(this).height() > column){
            column = $(this).height();
        }
    });
    $(value).find('.cols-to-
    eq').attr('style','height:'+column+'px');
   });
0
répondu Franko Loshe 2017-09-07 13:02:49