Часто заказчики высказывают пожелание о создании интерактивного анимированного меню на основе технологии Flash, так как эта технология позволяет создавать красивые эффекты, которые могут привлекать внимание пользователей и позволяют стать запоминаемым элементом дизайна всего сайта. И поспорить с этим нельзя, так как Flash – это действительно мощная и качественная технология. Однако у нее есть ряд недостатков. Многие браузеры, особенно мобильные, не поддерживают работу Adobe Flash, размер файлов анимации с использованием этой технологии довольно велик, а быстродействие на слабых машинах может быть недостаточным. Данная технология не бесплатна и стоит довольно дорого
В качестве замены этой технологии может быть анимация, созданная средствами скриптов, написанных на JavaScript, и в частности, с использованием фреймворка jQuery.
В данной статье мы рассмотрим пример создания горизонтальной навигации с анимационным эффектом в виде перемещающегося блока-указателя. Сделаем это с применением бесплатных технологий HTML, CSS, JavaScript. Все этапы создания будут максимально простыми, поскольку наша цель создать базовую анимацию.
Для начала создадим разметку HTML-кода. Представим наше горизонтальное меню в виде неупорядоченного списка с id="navigation"
:
‹ul id="navigation"› ‹li›‹a href="#"›Home‹/a›‹/li› ‹li›‹a href="#"›About Us‹/a›‹/li› ‹li›‹a href="#"›Shop‹/a›‹/li› ‹li›‹a href="#"›Contacts‹/a›‹/li› ‹/ul›
Добавим определения css-правил для стилизации объектов на странице:
#navigation { margin: 0 0 10px 0; padding: 0; list-style-type: none; position: relative; z-index: 1; float: none; width: 100%; } #navigation ul { margin: 0; padding: 0; } #navigation li { display: inline; margin: 0; padding: 0; } #navigation a { color: #015287; display: inline-block; padding: 5px; text-decoration: none; } #blob { top: 0; background-color: #c0ffee; position: absolute; z-index: -1; }
Фоновый блок будет представлять собой пустой элемент ‹div›
, который мы будем размещать за текстом ссылки. Таким образом, на этом этапе мы будем создавать этот элемент и помещать его на документ. Используем следующий код:
$('‹div id="blob"›‹/div›').css({ width: 0, height: $('#navigation li:first a').height() + 10 }).appendTo('#navigation');
Теперь проанализируем этот код. В этом скрипте мы создаем новый элемент ‹div›
и присоединяем его в конец к элементу ‹div id="navigation"›
. При создании этого элемента мы устанавливаем для него ширину 0 и высоту равную высоте ссылки внутри первого элемента li в блоке с id="navigation"
. Также добавляем к высоте 10 пикселей, чтобы фоновый блок был по размеру немного крупнее, чем ссылка.
Мы определили шарик, теперь необходимо создать триггер, который будет реагировать на поведение указателя мыши и тем самым приводить в движение блок. Для этих целей нам потребуется встроенная в jQuery функция hover()
. Она принимает два параметра: Функцию, которая будет выполняться при событии onMouseOver
(наведение указателя на объект) и onMouseOut
(при выводе указателя с объекта). Вот общая схема обработчика событий:
$('#navigation').hover( function() { // Действия для события onMouseOver }, function() { // Действия для события onMouseOut });
Теперь напишем сценарии для выполнения во время событий. Для начала рассмотрим ситуацию, когда мышь наведена на пункт меню:
$('#navigation a').hover( function () { $('#blob').animate( { width: $(this).width() + 10, left: $(this).position().left }, { duration: 'slow', easing: 'easeOutElastic', queue: false } );
Данная функция будет анимировать фоновый блок таким образом, что он будет менять свой размер и положение, пока мышь будет наведена на ссылку. При этом анимации не ставятся в очередь, что означает, что если мышь переместится, то анимация не будет ждать завершения предыдущей анимации и будут выполняться параллельно.
Когда пользователь будет убирать указатель с элемента, то будет выполняться следующий код:
$('#blob').animate( { left: $('#navigation li:first a').position().left, width: $('#navigation li:first a').width() + 10, }, 'fast' );
В данном случае указатель просто будет возвращаться к первому элементу меню и принимать его размер.