Как мне сохранить несколько DIV одинаковой высоты, используя jQuery? - PullRequest
5 голосов
/ 29 апреля 2009

У меня есть несколько тегов DIV с различным количеством текстового содержимого.

HTML:

<div id="boxes">
    <div id="boxone">
        <p>...</p>
    </div>
    <div id="boxtwo">
        <p>...</p>
    </div>
    <div id="boxthree">
        <p>...</p>
    </div>
    <div id="boxfour">
        <p>...</p>
    </div>
</div>

Они расположены по схеме "два на два", а их ширина плавная:

CSS:

div#boxes {
    width: 100%;
}

div#boxes div {
    width: 49.9%;
    float: left;
}

Я хочу, чтобы они все были одного роста.

Итак, я перебираю их и нахожу высоту самой высокой. Затем я повторяю цикл и устанавливаю их все на эту высоту.

JQuery:

$(function() {
    var maxHeight = 0;
    $('div#boxes div').each(function(){
        if (maxHeight < $(this).height()) {maxHeight = $(this).height()}
    });
    $('div#boxes div').each(function(){
        $(this).height(maxHeight);
    });
});

Это хорошо работает, если высоту div больше не нужно менять.

Но произойдет сбой при изменении размера окна браузера:

  1. Если я (а) сделаю браузер шире, то (б) мой DIVs становятся шире, затем (с) их текст содержимое переносится меньше раз, а затем (d) мои DIV слишком высокие.

  2. Если я (б) сделаю браузер более узким, тогда (б) мои DIV становятся уже, затем (в) их текстовое содержимое оборачивается больше, и тогда (d) мои DIV слишком короткие.

Как мне (1) автоматически изменять размер DIV по высоте их содержимого, как обычно, но также (2) сохранять эти несколько DIV одинаковой высоты?

Ответы [ 5 ]

5 голосов
/ 11 июля 2012

Для других, кто, как и я, пришел сюда в поиске решения для Google: первая часть принятого ответа работает только тогда, когда первый div самый высокий. Я внес в него некоторые изменения, и теперь он работает во всех случаях.

var highest = 0;
function sortNumber(a,b)    {
    return a - b;
}

function maxHeight() {
    var heights = new Array();
    $('#wrapper2>div').each(function(){
        $(this).css('height', 'auto');
        heights.push($(this).height());
        heights = heights.sort(sortNumber).reverse();
    });        
        highest = heights[0]; 
    $('#wrapper2>div').each(function(){
        $(this).css('height', highest);
    });

}

$(document).ready(function() {
    maxHeight();
})

$(window).resize(maxHeight);
4 голосов
/ 30 апреля 2009

Обновление ... полностью переписываем этот ответ после экспериментов и нахождения другого, по-видимому, работоспособного способа сделать это:

function sortNumber(a,b)    {
    return a - b;
}

function maxHeight() {
    var heights = new Array();
    $('div#boxes div').each(function(){
        $(this).css('height', 'auto');
        heights.push($(this).height());
        heights = heights.sort(sortNumber).reverse();
        $(this).css('height', heights[0]);
    });        
}

$(document).ready(function() {
    maxHeight();
})

$(window).resize(maxHeight);

Одна вещь, которую я заметил, заключается в том, что IE действительно имеет проблемы с округлением с плавающими div с шириной 50% ... рендеринг был бы намного лучше, если я изменил их на 49%.

Этот jQuery работает ...

// global variables

doAdjust = true;
previousWidth = 0;

// raise doAdjust flag every time the window width changes

$(window).resize(function() {
    var currentWidth = $(window).width();
    if (previousWidth != currentWidth) {
        doAdjust = true;
    }
    previousWidth = currentWidth;
})

// every half second

$(function() {
    setInterval('maybeAdjust()', 500);
});

// check the doAdjust flag

function maybeAdjust() {
    if (doAdjust) {
        adjustBoxHeights();
        doAdjust = false;
    }
}

// loop through the DIVs and find the height of the tallest one
// then loop again and set them all to that height

function adjustBoxHeights() {
    var maxHeight = 0;
    $('div#boxes div').each(function(){
        $(this).height('auto');
        if (maxHeight < $(this).height()) {maxHeight = $(this).height()}
    });
    $('div#boxes div').each(function(){
        $(this).height(maxHeight);
    });
}
2 голосов
/ 29 апреля 2009

Проверьте этот jQuery плагин , который позволяет вам контролировать свойство CSS, такое как высота.

0 голосов
/ 23 февраля 2016

Я нашел, что это решение немного более аккуратно для моей ситуации. Это работает независимо от того, какой div является самым высоким. На основе этого старого сообщения Криса Койера на CSS Tricks .

function maxHeight() {
    var maxHeight = 0;
    $(".container > .post-box").each(function(){
       if ($(this).height() > maxHeight) { maxHeight = $(this).height(); }
    });
    $(".container > .post-box").height(maxHeight);
}

$(document).ready(function() {
    maxHeight();
}

$(window).bind('resize', function () {
    $(".container > .post-box").css('height', 'auto');
    maxHeight();
}).trigger('resize');

Однако мне нужно было установить высоту на авто при изменении размера, прежде чем снова запустить функцию. Мне не нужно было устанавливать его в исходной функции, потому что он был установлен в CSS.

0 голосов
/ 14 октября 2013

Если вы хотите, чтобы он работал при изменении размера и т. Д. ... Сделайте это так:

function sortNumber(a,b) {
    return a - b;
}

var highest = 0;

function maxHeight() {
    var heights = new Array();
    $('.equalheight div').css('height', 'auto');
    $('.equalheight div').each(function(){
        heights.push($(this).height());
    });        
    heights = heights.sort(sortNumber).reverse();
    highest = heights[0]; 
    $('.equalheight div').css('height', highest);
}

$(document).ready(maxHeight);
$(window).resize(maxHeight);
...