Блоки равной высоты на jQuery

В процессе работы столкнулся с интересной задачкой. Нужно было выровнять несколько блоков по одной высоте, но с разными входными данными. Понятно, что CSS тут не поможет, поэтому пришлось написать функцию на jQuery, которая решает эту задачу.

Сложность была в том, что нужно выровнять 4 блока в одном контейнере, а потом по этой высоте выровнять еще 2 блока. Изначальная высота блоков не известна, поэтому приходится, что называется, плясать от печки. Вот скриншот, чтобы было понятно (кликабельно):

Результатом решения стала функция на jQuery:

function setEqualHeight(blocks, etalon, correction){
	blocks = $(blocks);
	if ( blocks.length > 1 ) { // Проверяем наличие блоков
		var tallest = 0;
		blocks.each(function(){ // Проходим по всем блокам и находим самый высокий
			var height = $(this).outerHeight(true);
			if (tallest < height) tallest = height;
		});
		if (etalon && tallest < etalon) { // Сравниваем с эталоном
			result = etalon;
		} else {
			result = tallest;
		}
		if (correction) result = result + correction; // Подгоняем
		blocks.height(result); // Выравниваем
	}
}

Опишу входные параметры:

  • blocks — селекторы блоков, которые нужно выровнять
  • etalon — высота блока, с которым нужно сравнивать результат
  • correction — значение коррекции, при сложной верстке можно простым подбором подогнать нужное значение, может получать отрицательное значение

Примеры вызова функции:

setEqualHeight('#tabbed .box');
setEqualHeight('.report', $('#tabbed').outerHeight(true), -50);

Если данное решение вам понравилось, интересно узнать ваше мнение или критику.

Метки: ,

Комментарии

  1. san4ez 02.11.2011 в 14:10 #

    Встречал подобное в некоторых «журнальных» wp-темах.

    Спасибо, мб пригодится.

  2. Alex 02.11.2011 в 14:35 #

    Пригодился уже, спасибо

  3. Андрей 09.12.2011 в 15:31 #

    >>Понятно, что CSS тут не поможет, поэтому пришлось написать функцию на jQuery, которая решает эту задачу.

    а табличка, не?..

  4. Руслан 18.02.2012 в 16:33 #

    Слишком много лишнего кода, вот написал плагин.

    $.fn.equalHeight = function () {
      var max = Math.max.apply(this, this.map(function() {
        return $(this).innerHeight();
      }));
    
      return this.each(function () {
        $(this).height(max - parseFloat($(this).css('paddingTop')) - parseFloat($(this).css('paddingBottom')));
      });
    }
    

Ваше мнение

Если вам нужно вставить код, оберните его в специальный шорткод [php], [html], [css], [js].
Например: [js]Ваш код[/js]