Здесь мы сделаем отличный эффект для сайта. Оживим мир ссылок. Сделаем так, чтобы символы менялись один за другим при наведении курсора мыши на ссылку. Можно использовать тоже слово, а можно заменить новыми символами.
В демонстрационном примере используется меню, которое состоит из таких ссылок:
1
|
<div class="sl_examples">
|
2 |
<a href="#" id="example1" data-hover="Фантазия">Иллюстрации</a> |
3 |
<a href="#" id="example4">Коллекции</a> |
Используется атрибут
data-hover для индикации слова, которое должно появиться при наведении курсора мыши. Если его нет, то будет изменяться тоже самое слово, которое используется в ссылке.
Для воспроизведения эффекта используются следующие стили:
03 |
font-family: 'EB Garamond', arial, serif; |
08 |
text-transform:uppercase; |
17 |
.sl_examples a > span{ |
23 |
.sl_examples a span span{ |
30 |
.sl_examples a span span.sl-w1{ |
32 |
text-shadow:0px 0px 1px #fff; |
35 |
.sl_examples a span span.sl-w2{ |
37 |
text-shadow:-1px 1px 2px #9f0633; |
Класс “sl-w1? - для символов первого слова, а “sl-w2? - для символов второго слова.
Нужно также вызывать плагин:
1
|
$(window).load(function(){
|
2 |
$('#example1').hoverwords({ delay:50 }); |
Используются следующие установки для плагина (их можно поменять, передав новые значения при вызове):
1
|
delay : false, // каждый символ использует различное время анимации
|
2 |
speed : 300, // скорость анимации |
3 |
easing : 'jswing', // эффект анимации |
4 |
dir : 'leftright', // направление выскальзывания символа: leftright - слева направо || rightleft - справа налево, |
5 |
overlay : false, // выскальзывающее слово появляется поверх текущего |
6
|
opacity : true // анимация прозрачности символов
|
А полный код плагина выглядит следующим образом:
007 |
toggleChars : function($el, settings) { |
008 |
var $wrappers = $el.find('.sl-wrapper'), |
009 |
total = $wrappers.length, |
010 |
c1 = $el.hasClass('sl-w1') ? 'sl-w2' : 'sl-w1', |
011 |
c2 = $el.hasClass('sl-w1') ? 'sl-w1' : 'sl-w2'; |
013 |
$el.addClass(c1).removeClass(c2); |
015 |
$wrappers.each(function(i) { |
016 |
var $wrapper = $(this), |
019 |
switch(settings.dir) { |
020 |
case 'leftright' : interval = i * settings.delay; break; |
021 |
case 'rightleft' : interval = (total - 1 - i) * settings.delay; break; |
025 |
setTimeout(function() { |
026 |
aux.switchChar($wrapper, $el, settings, c1, c2); |
030 |
aux.switchChar($wrapper, $el, settings, c1, c2); |
033 |
switchChar : function($wrapper, $el, settings, c1, c2) { |
034 |
var $newChar = $wrapper.find('span.' + c1), |
035 |
$currentChar = $wrapper.find('span.' + c2), |
036 |
nextWrapperW = $currentChar.width(); |
039 |
nextWrapperW = $newChar.width(); |
041 |
//Новый символ добавляется |
042 |
if($newChar.length) { |
043 |
var param = {left : '0px'}; |
044 |
if(!$.browser.msie && settings.opacity) |
047 |
$newChar.stop().animate(param, settings.speed, settings.easing); |
049 |
//анимация для ширины контейнера |
050 |
$wrapper.stop().animate({ |
051 |
width : nextWrapperW + 'px' |
055 |
//Текущий символ убирается |
056 |
if(!settings.overlay || c1 === 'sl-w1') { |
057 |
if(settings.dir === 'leftright') |
058 |
var param = {left : -$currentChar.width() + 'px'}; |
060 |
var param = {left : nextWrapperW + 'px'}; |
062 |
if(!$.browser.msie && settings.opacity) |
064 |
$currentChar.stop().animate(param, settings.speed, settings.easing); |
069 |
init : function(options) { |
074 |
delay : false, // каждый символ использует различное время анимации |
075 |
speed : 300, // скорость анимации |
076 |
easing : 'jswing', // эффект анимации |
077 |
dir : 'leftright', // направление выскальзывания символа: leftright - слева направо || rightleft - справа налево, |
078 |
overlay : false, // выскальзывающее слово появляется поверх текущего |
079 |
opacity : true // анимация прозрачности символов |
082 |
return this.each(function(){ |
084 |
// Объединение заданных опций со значениями по умолчанию |
086 |
$.extend( settings, options ); |
089 |
var $el = $(this).addClass('sl-w1'), |
090 |
word = $el.data('hover') || $el.html(); // Если атрибут data-hover установлен, используем заданное слово, иначе используем текущее слово |
092 |
if($el.data('hover')) settings.overlay = false; // Опция используется только для случая одного и того же слова |
094 |
$el.lettering(); // используем плагин lettering.js |
096 |
var $chars = $el.children('span').addClass('sl-w1'), |
097 |
$tmp = $('<span>' + word + '</span>').lettering(); |
099 |
$chars.each(function(i) { |
102 |
$char.wrap( $('<span/>').addClass('sl-wrapper') ) // Устнавливаем контейнер с классом для каждого символа и ширину контейнера равной ширине символа |
104 |
width : $char.width() + 'px' |
108 |
$tmp.children('span').each(function(i) { |
110 |
$wrapper = $el.children('.sl-wrapper').eq(i); |
112 |
if($wrapper.length) // Проверяем наличие контейнера для вставки символа |
113 |
$wrapper.prepend( $char.addClass('sl-w2') ); |
114 |
else { // Если его нет, создаем |
116 |
$('<span></span>').prepend( $char.addClass('sl-w2') ) |
120 |
width : $char.width() + 'px' |
124 |
if(!$.browser.msie && settings.opacity) |
125 |
$char.css('opacity', 0); |
128 |
if(settings.dir === 'leftright') |
129 |
$char.css('left', - $char.width() + 'px'); |
131 |
$char.css('left', $char.parent().width() + 'px'); |
134 |
// События mouseenter / mouseleave - переключаемся на другое слово |
135 |
$el.bind('mouseenter.hoverwords mouseleave.hoverwords', function(e) { |
136 |
aux.toggleChars($el, settings); |
144 |
$.fn.hoverwords = function(method) { |
145 |
if ( methods[method] ) { |
146 |
return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); |
147 |
} else if ( typeof method === 'object' || ! method ) { |
148 |
return methods.init.apply( this, arguments ); |
150 |
$.error( 'Метод ' + method + ' не существеут в плагине jQuery.hoverwords' ); |