Сегодня речь пойдет о решении такой проблемы как создание колонок одинаковой высоты. Для тех кто не в курсе данной проблемы ее описание внутри…
Допустим у нас есть простой 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(); });