FACE по мотивам проекта KuraFire

В пятницу лазил по сети и наткнулся на сайте KuraFire на один весьма забавный проект под названием FACE. Решил его поставить себе и поэкспериментировать с ним. На первый взгляд показалось, что все очень красиво и здорово, но при внимательном рассмотрении нашлась пара серьезных недостатков.

UPD 26.11.2014 Яркий пример того как НЕ надо писать плагины ;)

Самый серьезный из них то, что два таких рисунка нельзя поставить на одну страницу. Нет, я дочитал до конца и видел, как автор предлагает в первом диве для анимации указать все id дивов, которые будут анимированы, но этот способ не в счет, а что если я захочу создать блок на лету или прицепить анимацию на кнопку?! Тем более что таким образом анимация работает по очереди, сначала на первом, потом на втором элементе, а не на всех одновременно. Я пробовал переписать код на объектно-ориентированный, но решил, что дешевле написать новый из-за особенностей архитектуры скрипта. Я люблю описывать объект через прототип, и в очередной раз столкнулся с тем, что не могу вызвать метод объекта (из самого объекта используя this) по таймауту.

Вторым недостатком, на мой взгляд, было то, что в примере автор показывает квадрат, который заполняется спирально, а в версии для скачивания он заполняется рядами. Мне тоже захотелось спиралью (а еще столбиками), открыв CSS, я увидел, что каждый квадрат отпозиционирован отдельно. Вообщем, в этом ничего страшного нет, если большой квадрат состоит из 25-49 маленьких, а если, например, из 100? CSS разрастается в геометрической прогрессии, создавая неудобство разработчику и пользователю.

Это натолкнуло меня на написание плагина под jQuery, который бы обладал всеми вышеперечисленными свойствами, то есть быстрота создания, компактность, скорость, программируемость порядка заполнения. ВОТ ОН:

Для того чтобы запустить пример в работу нужно три строчки кода:


$.face.init(5,5,400,400,6,'#face1');
$.face.resort([0,1,2,3,4,9,14,19,24,23,22,21,20,15,10,5,6,7,8,13,18,17,16,11,12],'#face1');
$.face.start(50,'#face1');

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

Во второй задается порядок, в котором будет происходить анимация, в данном конкретном случае — по спирали (по часовой стрелке). Второй параметр нужен, если на странице находиться более одного квадрата.

Третья строчка, собственно, запускает анимацию, эту функцию можно прикрепить, например, к кнопке. Первый параметр — скорость заполнения при загрузке (оптимально от 25 до 100), второй — id

Теперь я приведу код собственно самого плагина:


jQuery.extend({
    face : {
        id : null,
        li : [],
        sort : [],
        init : function (cols,rows,width,height,border,id) {
            this.id = id || '#face';
            this.li[this.id] = [];
            for(var i=0,j=cols*rows,l=0,t=0,w=width/cols-border/2,h=height/rows-border/2;i<j;i++,l=i%cols?l+w+border/2:0,t+=i%cols?0:h+border/2)
                this.li[this.id][i] = '<li style="top:'+t+'px;left:'+l+'px;width:'+w+'px;height:'+h+'px;"><div style="width:'+(w-2)+'px;height:'+(h-2)+'px;"><div><div></div></div></div></li>';
            this.sort[id] = this.li[id];
        },
        resort : function (array, id) {
            jQuery(id).empty();
            var n = [];
            id = id || this.id;
              for(var key in array)
                n[key] = this.li[id][array[key]];
            this.sort[id] = n;
        },
        start : function (speed,id)
        {
            id = id || this.id;
            jQuery(id).append('<ul>'+this.sort[id].toString().replace(/,/g,'')+'</ul>');
            jQuery(id+' ul li div').mouseover(function(){jQuery('div',this).animate({opacity:1},'slow','',function(){jQuery(this).animate({opacity:0},'fast');});});
            jQuery.each(jQuery(id+' ul li div div'),function(i,e){setTimeout(function(){jQuery(e).animate({opacity:0},'normal')},i*(speed||50))});
        }
    }
});

Свойство id хранит в себе идентификатор последнего запущенного квадрата.

Свойство li хранит список всех маленьких квадратов в первоначальном порядке.

Свойство sort хранит уже отсортированный список маленьких квадратов.

Метод init производит все первоначальные расчеты размеров и позиций маленьких квадратов, образующих сетку.

Метод resort сортирует маленькие квадраты, в произвольном порядке.

Метод start запускает анимацию и добавляет анимацию по наведению мыши.

Если кому-то понравился этот плагин — пользуйтесь на здоровье как вам угодно, если нет — … ну что ж жаль, я старался.

Комментарий “FACE по мотивам проекта KuraFire

  1. <strong>Сверху в низ</strong> перепутано с <strong>С права на лево</strong> .

Комментарии закрыты