HTML, JavaScript: Делаем блоки одинаковой высоты

Сегодня речь пойдет о решении такой проблемы как создание колонок одинаковой высоты. Для тех кто не в курсе данной проблемы ее описание внутри…

Допустим у нас есть простой html файл примерно следующего содержания:

<html>
<head>
</head>
<body>
 <div style="width:150px;">
  <div class="column" style="float:left;width:50px;background:#ff0000;">
  1  
  </div> 
  <div class="column" style="float:left;width:50px;background:#00ff00;">
  2
  </div>
  <div class="column" style="float:left;width:50px;background:#0000ff;">
  3 
  </div>
 </div>
</body>
</html>

Примечание: Класс у колонок указан не просто так, для чего это нужно будет понятно далее!

На первый взгляд все будет выглядеть хорошо. Но стоит добавить в какой-нибудь блок побольше текста, как мы увидим картину, когда наши блоки превращаются в красочную диаграмму. Собственно в этом и есть проблема. На данный момент нет однозначного решения, позволяющего растянуть все три блока по высоте максимального.

Решение данной проблемы может быть в лоб с использованием вместо элемента div старый добрый table. Еще одно решение может заключаться с использовании css и свойства display. Однако мы рассмотрим вариант решения с помощью скриптов на примере jquery и без него.

Первое что нам необходимо это назначить нашим колонкам какой-нибудь уникальный класс (это в примере уже сделано) для того чтобы можно было получить список всех колонок, с которыми нужно работать.
Ну а далее в работу вступает скрипт:

JQuery

$(document).ready(function() {
  setTimeout(function() {
      var mainDivs = $(".column"); //Получаем все элементы с классом column
      var maxHeight = 0;
      for (var i = 0; i < mainDivs.length; ++i) {
        if (maxHeight < $(mainDivs[i]).height()) { //Находим максимальную высоту
          maxHeight = $(mainDivs[i]).height(); 
        }
      }
      for (var i = 0; i < mainDivs.length; ++i) {
        $(mainDivs[i]).height(maxHeight); //Устанавливаем всем элементам максимальную высоту
      }
    }, 1000);
});

Здесь стоит отметить момент, что скрипт вызывается не только после загрузки страницы, но еще и с небольшой задержкой. Связано это с тем, что браузер не всегда может успеть отобразить загруженные картинки, и как следствие высота некоторых блоков будет считаться неверно. Задержка же гарантирует, что картинки успеют показаться полностью.

Если вы не используете Jquery, то данный код можно записать на чистом Javascript:

window.onload = function() {
  setTimeout(function() {
      var mainDivs = document.getElementsByClassName("column");
      var maxHeight = 0;
      for (var i = 0; i < mainDivs.length; ++i) {
        if (maxHeight < mainDivs[i].clientHeight) {
          maxHeight = mainDivs[i].clientHeight; 
        }
      }
      for (var i = 0; i < mainDivs.length; ++i) {
        mainDivs[i].style.height = maxHeight + "px";
      }
    }, 1000);
}

Если же Вы привыкли использовать Jquery плагины, то для Вас код далее.

$.fn.setEqualHeight = function() {
    $this = this;
    setTimeout(function() {
      var maxHeight = 0;
      $this.each(function() {
        if (maxHeight < $(this).height()) {
          maxHeight = $(this).height(); 
        }
      });
      $this.each(function() {
        $(this).height(maxHeight);                                
      });
    }, 1000);
}
$(document).ready(function() {
  $(".column").setEqualHeight();
});
Запись опубликована в рубрике HTML, JavaScript с метками , , , , , , , , , , , , , . Добавьте в закладки постоянную ссылку.