Здесь мы сделаем отличный эффект для сайта. Оживим мир ссылок. Сделаем так, чтобы символы менялись один за другим при наведении курсора мыши на ссылку. Можно использовать тоже слово, а можно заменить новыми символами.
В демонстрационном примере используется меню, которое состоит из таких ссылок:
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-w 1 { |
32 |
text-shadow : 0px 0px 1px #fff ; |
35 |
.sl_examples a span span.sl-w 2 { |
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' ); |