Матвей Земсков

Заметки веб-мастера

Четверг, 04 сентября 2014 16:56

Элементы списка одинаковой высоты

Оцените материал
(5 голосов)

Иногда может понадобиться вывести на странице блоки с информацией в несколько столбцов и колонок. Например, это может быть список товаров из какой-нибудь категории или анонсы каких-то мероприятий. Обычно в каждом блоке содержится: название, краткий анонс, картинка для анонса и краткое описание. И тут возникает проблема: блоки получаются разными по высоте, что выглядит некрасиво. Кроме того, из-за разной высоты они могут смещаться и «наезжать» друг на друга. Как же решить эту проблему? Если с картинками еще можно что-то сделать: установить им одинаковую высоту, то с текстом ничего не получится, даже если выводить в блоке текст заданного размера. В этой заметке я расскажу, как можно выровнять элементы блоков по высоте.

Итак, начнем с разметки и стилей.

HTML

	<div class="wrap">
		<ul class="clients-list clearfix j-pagination-content">
			<li class="client-item">
				<div class="client-logo">
					<img width="100" height="85" title="Клиент №1" alt="Клиент №1" src="/img/cl1.png" />
				</div>
				<h4 class="client-name">Клиент №1</h4>
				<div class="client-descr"></div>
				<div class="b-gline"></div>
			</li>
			<!-- … -->
			<li class="client-item">
				<div class="client-logo">
					<img width="100" height="85" title="Клиент №6" alt="Клиент №6" src="/img/cl6.png" />
				</div>
				<h4 class="client-name">Клиент №6</h4>
				<div class="client-descr"></div>
				<div class="b-gline"></div>
			</li>
		</ul>	
	</div>

CSS

	div.wrap{width:1000px; margin:0 auto;background:#e9e9e9; padding:25px;}
	h1{font-size:25px; text-align: center; margin-bottom:15px; margin-top:15px; color:#8b8a8a;}
	ul.clients-list {margin-left: -15px; padding: 0 20px;}
	ul.clients-list > li {background: none repeat scroll 0 0 #fff; padding: 15px 15px 30px; position: relative;}
	li.client-item {border-radius: 3px; box-shadow: 0 5px 5px 0 rgba(0, 0, 0, 0.1); float: left; margin: 0 0 25px 15px; width: 280px;}
	.client-logo {margin-bottom: 30px; text-align: center;}
	.client-name {font-size: 17px; margin-bottom: 20px; text-align: center;}
	h4 {line-height: 20px;}
	.b-gline {background: #c7c7c7; bottom: 2px; height: 1px; left: 0; position: absolute; width: 310px;}

Затем, чтобы выровнять элементы списка по высоте, необходимо использовать JavaScript. Без него не обойтись, так как ни одно правило CSS в этом случае не поможет. К страничке необходимо подключить следующий JS-код, который размещен в файле script.js

JavaScript

	function ListMng(p)
	{
		var o = this;
		this.root = $(p.root);
		this.itemsBox = $(p.itemsBox, this.root);
		this.items = $(p.items, this.itemsBox);
		this.colRowItems = p.colRowItems;
		this.setItemsHeight = function()
		{
			var windowWidth = $(document).width();
			var items =  o.itemsBox.find('.client-item');
			while(items.length) {
				var curRowItems = $(items.splice(0,o.colRowItems));
				var maxHeight = 0;
				curRowItems.each(function(){
					var item = $(this);
					var height = item.outerHeight();
					if(height > maxHeight)
					{
						maxHeight = height;
					}
				});
				curRowItems.css({height: maxHeight});
			}
		}
		this.init = function()
		{
			o.setItemsHeight();
			$(window).on('resize', o.setItemsHeight);
		}
		this.init();
	}
	$(function(){
		new ListMng({
			root: '.wrap',
			itemsBox: '.clients-list',
			items: '.client-item',
			colRowItems: 3
		});
	}); 

Обращу внимание читателя на то, что перед подключением скрипта к странице необходимо подключить jQuery.

Ознакомившись с кодом скрипта можно увидеть, что функция конструктор ListMng состоит из 2 функции (методов) и получает на входе объект с параметрами.

Параметрами являются:

  • имя класса родительского элемента (root)
  • имя класса списка (itemsBox)
  • имя класса элементов списка (items)
  • количество элементов в одной строке (colRowItems)

Функция setItemsHeight является основной, с ее помощью рассчитывается значение высоты самого высокого блока в первой «строке», а затем это значение присваивается все остальным элементам первой «строки». Таким образом все элементы в «строке» становятся одинакового размера. То же самое происходит и со всеми остальными «строками», расположенными ниже.

Функция init «запускает» процесс расчета высоты блоков после загрузки страницы, а также при изменении размеров окна браузера.

В заключении заметки, хотелось бы отметить, что данный скрипт порой очень помогает при разработке сайтов.

Демо-страничка спримером из заметки

Прочитано 9875 раз
Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

Скачать

Предлагаю вашему вниманию:

Наверх