1
Уроки Анимированные вкладки на JavaScript
23 декабря 2013
2171
Анимированные вкладки, JavaScript

Анимированные вкладки на JavaScript

Сложность Рубрика JavaScript Браузеры
Демонстрация » Скачать »

В данном уроке Вы увидите, как можно сделать анимированные вкладки без использования сторонних библиотек. Начнем мы конечно же с структуры объектов HTML. Состоит она из двух основных частей (переключатели и вкладки):

 

<div id="tabs-wrap">

<ul id="tabs-head">
<li class="active" data-tab="#first">Первый</li>
<li data-tab="#second">Второй</li>
<li data-tab="#third">Третий</li>
</ul>

<ul id="tabs-body">
<li id="first" class="active"></li> 
<li id="second"></li>
<li id="third"></li>
</ul>

</div>

 

Стили переключателей не несут никакой функциональности, так что их можно оформлять «по вкусу». В стилях же вкладок, есть моменты, которые играют важную роль в переключении. Все из вкладок по умолчанию не отображаются.

Увидеть можно только активную вкладку. Все изменения происходят за счет переопределения значения свойства display путем использования вспомогательного класса «active». Код приведен ниже.

 

#tabs-body li{
         display:none;
}

#tabs-body li.active{
         display:block;
}

 

Теперь приступим к написанию JavaScript кода. Для начала создадим несколько функций эмулирующих знакомые большинству функции из jQuery ($ и each), необходимых исключительно для удобства работы с DOM элементами:

 

var $ = document.querySelectorAll.bind(document); 

Object.prototype.each = function(func){
         for(var i=0; i < this.length; i++){
                  func(i, this[i]);
         }
};

 

Кроме этого, дополнительно подключим функции по работе с cookie из урока сохрание Cookie JavaScript для сохранения состояния вкладок. Благодаря объявленным выше функциям, следующий код выглядит достаточно понятным для тех, чьи познания в js ограничиваются одним лишь  jQuery:

 

$("#tabs-head li").each(function(index, element){
         element.onclick = function(event){
                  // Сохранение в  cookie  id текущей вкладки
                   setCookie("activeTab", this.getAttribute("data-tab"), {expires: 14});

                   $("#tabs-head li").each(function(index, element){
                            element.className = '';
                   });
                   this.className = "active";
                   // Функция с реализацией анимации перехода между вкладок

                   tabChange($(this.getAttribute("data-tab"))[0], $("#tabs-body>li.active")[0]);
         }
});

 

 

Для создания анимации я использовал функцию requestAnimationFrame, и поскольку в ранних версиях некоторых браузеров ее названия могут быть разными, я создал указатель на ту, которая существует следующим образом:

 

var raf = window.requestAnimationFrame || 
window.mozRequestAnimationFrame || 
window.webkitRequestAnimationFrame || 
window.msRequestAnimationFrame;

 

 

Ниже представлена функция, которая описывает переключение между вкладками:

 

function tabChange(newTab, oldTab){
         var i = 0;
// Увеличивая или уменьшая значение данной переменной можно
// соответственно увеличить/уменьшить продолжительность анимации
         var k = 50

         function show(){
                   newTab.style.opacity = ++i/k;
                   if (i < k) {
                   raf(show);
                   }
         }

         oldTab.style.opacity = 0;

         oldTab.className = '';
         newTab.className = "active";

         raf(show);
}

 

 

Последним шагом в данном уроке будет функция «выгрузки» состояния вкладок из cookie:

 

function setActive(){
         var activeId = getCookie("activeTab")

         if(typeof activeId !== "undefined"){
                   $("#tabs-head>li.active")[0].className = "";
                   $("#tabs-body>li.active")[0].className = "";
 
                   $(activeId)[0].className = "active";
                   $("#tabs-head>li[data-tab="" + activeId + """)[0].className = "active";
         }
}

 

 

Есть еще чем то похожий урок на тему JQuery закладки, там тоже происходит все анимированно. На этом все, урок окончен. Благодарю за Ваше внимание!





Евгений Болдырев