Pull to refresh

jQuery плагин для Постройки мозаики из блоков

Reading time 3 min
Views 8.4K
Добрый день. Возможно, это не самая полезная статья, но я довольно часто я сталкивался с тем, что на сайте требовалось выстроить блоки в «мозаику», и всегда изобретал всякие велосипеды.

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

Для начала давайте создадим jQuery плагин


(function( $ ) {
  $.fn.mozaika= function() {
  };
})(jQuery);


Как и в большинстве плагинов, в нашем будут настройки. Давайте определимся с ними:

  • Количество столбиков
  • Отступы между блоками
  • Поле (padding) сверху и снизу поля с «пазлами»
  • Класс для блоков
  • Класс для блоков с двойной шириной
  • Класс для блоков с тройной шириной
  • нижний Padding ячейки


Имеем


(function( $ ) {
  $.fn.mozaika= function() {
    var set = $.extend( {
	  'n': 4,
	  'margin': 4,
	  'padding' : 30,
	  'item' : 'item',
	  'citem2' : 'item-w2',
	  'citem3' : 'item-w3',
	  'itembot' : 0
   }, options);
  };
})(jQuery);

Создадим массив для высоты каждой колонки:

var cols = new Array() // Массив для высоты колонки
for(i = 0; i < set.n; i++)
	cols[i] = 0;

Найдём ширину элемента с мозаикой:

var width = this.width(); // ширина элемента с мозаикой

Следующим шагом нужно вычислить ширину одной ячейки (с обычной шириной):

var one = (width - set.margin * (set.n - 1))/set.n; 
	// ширина одного элемента
var left = 0; // позиция по Х

Следующим шагом стоит найти все ячейки и построить наш «пазл». Для этого нужно проверить, не являются ли наши ячейки — ячейками с двойной или тройной шириной. Если вдруг элемент с двойной шириной будет строиться на четвёртой колонке из четырёх, нужно перенести его в первую. Так-же для случаев с не одинарной шириной, нужно будет строить ячейку в самом низу большей из колонок. Так-что найдём максимальную высоту, из колонок которые затрагиваются.

Дальше зададим координаты нашей ячейке.

Следующим шагом запишем новую высоту нашего столбика(столбиков), и новые координаты по оси x. Если строка закончилась, переходим на новую. В конце — задаём высоту блока для наших ячеек.

(function( $ ) {
  $.fn.mozaika= function(options) {
	 var set = $.extend( {
		  'n': 4,
		  'margin': 4,
		  'padding' : 30,
		  'item' : 'item',
		  'citem2' : 'item-w2',
		  'citem3' : 'item-w3',
		  'itembot' : 0
		}, options);
	
	var cols = new Array() // Массив для высоты колонки
	for(i = 0; i < set.n; i++)
		cols[i] = 0;
	var width = this.width(); // ширина элемента с мозайкой
	var one = (width - set.margin * (set.n - 1))/set.n; 
	// ширина одного элемента
	var left = 0; // позиция по Х
	var moz = this.children('.'+set.item); // ячейки
	i = 0;
	$(moz).each(function( k, v ) {
		if($(v).hasClass(set.citem2)){
			w = one*2+set.margin;
			q=2;
		}else if($(v).hasClass(set.citem3)){
			w = one*3+set.margin*2;
			q=3;
		}else{
			w = one;
			q = 1;
		}
		if(i+q>set.n){
			i = 0;
		}
		var mx = cols[i];
		var mn = i;
		for(e = i; e <i+q; e++)
			if(cols[e] > mx){
				mx = cols[e];
				mn = e;
			}
  		$(v).css({'position':'absolute', 'width' : w+'px'});
		$(v).css({'left' : left+'px', 'top':mx, 'padding-bottom':set.itembot});
		$(v).animate({opacity:1},1000);
		hg = cols[i];
		for(e = i; e < i+q; e++){
			cols[e] = hg + $(v).height() + set.margin + set.itembot;
			//console.log('n ' + i + ' q ' + q + ' cols[' + e + '] ' + cols[e]);
		}
		left = left + set.margin + w;
		i = i+q;
		if(i>=set.n){
			i=0;
			left = 0;
		}
	});
	mx = cols[0];
		for(e = 0; e <set.n; e++)
			if(cols[e] > mx){
				mx = cols[e];
			}
	if(this.height()<(mx+set.padding*2))
		this.height(mx+set.padding*2);
  };
})(jQuery);

Вызываем:

$(document).ready(function(e) {
	$(".catalog").moZaika({
		'n': 4,
		'margin': 2,
		'item' : 'cat-item',
		'citem2' : 'cat-w2',
		'citem3' : 'cat-w3',
		'itembot' : 20,
		'padding' : 0
	});
});

Готово, всё работает!

image

Единственное с чем осталось побороться, это с перестроением при изменении ширины поля для мозаики. Для этого я пока-что ещё раз вызываю плагин в $(window).resize().
Tags:
Hubs:
+4
Comments 18
Comments Comments 18

Articles