jquery

Создание подвижной решеточной верстки (fluid grid layout) с помощью jQuery.

Март 17th, 2010

Решеточная верстка – это, возможно, самый удобный способ сделать веб-страницу похожей на страничку журнала. В данной статье будет показано, как с помощью CSS и Javascript создать подвижную решеточную верстку. Использованный алгоритм является очень простым и понятным. Существует множество современных способов оформления «под журнал», но нашей целью является понимание того, как создается такая верстка.

ШАГ 1. Подготовка html документа.

Сначала нужно создать базовую HTML структуру. Пример:

<html>
	<head>
		<title>Fluid grid</title>
		<script type="text/javascript" src="script/jquery-1.3.2.min.js"></script>
	</head>
	<body>
		<div class="box"><p><span>01</span>This is box number 1...</p></div>
		<div class="box alt"><p><span>02</span>This is box number 2...</p></div>
		<div class="box"><p><span>03</span>This is box number 3...</p></div>
		<div class="box alt"><p><span>04</span>This is box number 4...</p></div>
		<div class="box"><p><span>05</span>This is box number 5...</p></div>
		<div class="box alt"><p><span>06</span>This is box number 6...</p></div>
		<div class="box"><p><span>07</span>This is box number 7...</p></div>
		<div class="box alt"><p><span>08</span>This is box number 8...</p></div>
		<div class="box"><p><span>09</span>This is box number 9...</p></div>
	</body>
</html>

Div’ы могут быть всем: статьей, постом и т.д.

Чтобы лучше понять пример, рекомендуется заменить текст из примера ‘This is box number…’ на то, что вам нужно (рисунки, текст и т.д.). На картинках показывается результат выполнения кода со случайно сгенерированным в блоках текстом.

ШАГ 2: Создание небольшой HTML конструкции.

Каждый шаг будет объяснен и проиллюстрирован картинками, ширина которых меньше 600px.

<link rel="stylesheet" type="text/css" href="style/reset.css" />

	body {
		position: relative;
		width: 100%;
	}
	.box {
		background-color: #F0F0F0;
		color: #888;
		font-family: Arial, Tahoma, serif;
		font-size: 13px;
	}
	.box p {
				padding: 10px;
			}
	.box span {
		float: left;
		font-size: 26px;
		font-weight: bold;
	}
	div.alt {
		background-color: #CCC;
	}

ШАГ 3: JavaScript

Атрибуты

Ради улучшения эргономичности создадим собственное пространство имен «myFluidGrid» для избежания конфликтов с другими скриптами/библиотеками, использующими те же названия переменных.

var myFluidGrid = {
		COLNUMBER : 2, // Minimum column number.
		COLMARGIN : 10, // Margin (in pixel) between columns/boxes.
		COLWIDTH : 240 // Fixed width of all columns.
};

3.2. Практическая реализация.

doLayout : function() {
	var self = this;
	var pointer = 0;
	var arr = [];
	var columns = Math.max(this.COLNUMBER, parseInt($('body').innerWidth() / (this.COLWIDTH + this.COLMARGIN)));

	$('.box').css('position', 'absolute').css('width', this.COLWIDTH  + 'px');
	$('.box').each(function() {
		var tempLeft = (pointer * (self.COLWIDTH + self.COLMARGIN));
		$(this).css('left', tempLeft + 'px');

		var tempTop = 0;
		if (arr[pointer]) { tempTop = arr[pointer];	}
		$(this).css('top', tempTop + 'px');

		arr[pointer] = tempTop + $(this).outerHeight() + self.COLMARGIN;
		pointer++;
		if (pointer === columns) { pointer = 0; }
	});
}

Здесь мы производим итерации, беря каждый блок (box) и устанавливаем его ширину с помощью COLWIDTH.
Внутри цикла мы определяем новые позиции left и top для каждого блока. Определение позиции left производиться с помощью переменной-указателя. Переменная-указатель задает позицию текущего столбца: умножаем её на ширину блока и добавляем отступ. Не забывайте увеличивать данную переменную в новом шаге и обнулять её, когда она достигает значения, которое равно максимальному числу столбцов.

Задание позиции top для блока осуществляется с помощью переменной arr. В ней хранится значение позиции bottom блока, который был последним добавлен в столбец. Пусть блок 1 имеет высоту 80px, left=0, top=0. В этом случае arr[0] примет значение 80 + отступ. Это проиллюстрировано на рисунке:

Получаем: arr[0]= 80 + отступ, arr[1]= 69 +отступ, arr[2]= 81+отступ. Четвертый блок будет использовать arr[0] и так далее.

Используем функцию «doLayout» и зададим ее свойства на события загрузки и изменения размеров окна:

$(window).ready(function() {
	myFluidGrid.doLayout();
}).resize(function() {
	myFluidGrid.doLayout();
});

ШАГ 4: Собираем все вместе.

<html>
	<head>
		<title>Fluid grid</title>
		<link rel="stylesheet" type="text/css" href="style/reset.css" />
		<style type="text/css">
			body {
				position: relative;
				width: 100%;
			}
			.box {
				background-color: #F0F0F0;
				color: #888;
				font-family: Arial, Tahoma, serif;
				font-size: 13px;
			}
			.box p {
				padding: 10px;
			}
			.box span {
				float: left;
				font-size: 26px;
				font-weight: bold;
			}
			div.alt {
				background-color: #CCC;
			}
		</style>
		<script type="text/javascript" src="script/jquery-1.3.2.min.js"></script>
		<script type="text/javascript">
			var myFluidGrid = {
				COLNUMBER : 2, // Minimum column number.
				COLMARGIN : 10, // Margin (in pixel) between columns/boxes.
				COLWIDTH : 240, // Fixed width of all columns.
				doLayout : function() {
					var self = this;
					var pointer = 0;
					var arr = [];
					var columns = Math.max(this.COLNUMBER, parseInt($('body').innerWidth() / (this.COLWIDTH + this.COLMARGIN)));

					$('.box').css('position', 'absolute').css('width', this.COLWIDTH  + 'px');
					$('.box').each(function() {
						var tempLeft = (pointer * (self.COLWIDTH + self.COLMARGIN));
						$(this).css('left', tempLeft + 'px');

						var tempTop = 0;
						if (arr[pointer]) { tempTop = arr[pointer];	}
						$(this).css('top', tempTop + 'px');

						arr[pointer] = tempTop + $(this).outerHeight() + self.COLMARGIN;
						pointer++;
						if (pointer === columns) { pointer = 0; }
					});
				}
			};
			$(window).ready(function() {
				myFluidGrid.doLayout();
			}).resize(function() {
				myFluidGrid.doLayout();
			});
		</script>
	</head>
	<body>
		<div class="box"><p><span>01</span>This is box number 1...</p></div>
		<div class="box alt"><p><span>02</span>This is box number 2...</p></div>
		<div class="box"><p><span>03</span>This is box number 3...</p></div>
		<div class="box alt"><p><span>04</span>This is box number 4...</p></div>
		<div class="box"><p><span>05</span>This is box number 5...</p></div>
		<div class="box alt"><p><span>06</span>This is box number 6...</p></div>
		<div class="box"><p><span>07</span>This is box number 7...</p></div>
		<div class="box alt"><p><span>08</span>This is box number 8...</p></div>
		<div class="box"><p><span>09</span>This is box number 9...</p></div>
	</body>
</html>

Оставьте свой комментарий

', 1 => '', 2 => '', 3 => '', 4 => '', 5 => '', 6 => '', 7 => '', 8 => '', 9 => '', 10 => '', 11 => '', 12 => '', 13 => '', 14 => '', 15 => '', 16 => '', 17 => '', 18 => '', 19 => '', 20 => '', 21 => '', 22 => '', 23 => '', 24 => '', 25 => '', 26 => '', 27 => '', 28 => '', 29 => '', ), ) memory start/end/dif 23913496/24389952/476464 get_num_queries start/end/dif 6/9/3 iSapeDebugLogEnd --->