Уроки Mootools – Использование Fx.Morph, Fx.Options и Fx.Events – Урок 11


Mootools 1.2 Fx.Morph, Fx.Options, и Fx.Events

Сегодня продолжим исследовать раздел спец. эффектов нашей любимой библиотеки. Вначале, мы научимся тому, как использовать библиотеку Fx.Morph (которая, по сути, позволяет изменять несколько свойств объектов), после чего посмотрим на несколько примеров использования общих параметров спец. эффектов, применимых как к Fx.Tween и Fx.Morph. Ну а в конце, рассмотрим такие события раздела Fx как «onComplete» и «onStart«. Все эти параметры и события позволят нам получить больше контроля над анимированными переходами.

Fx.Morph

Создание нового эффекта Fx.Morph

Запуск нового превращения (morph с англ. – превращение) происходит примерно также, как и запуск нового эффекта tween, с той разницей, что указывать изменения нужно в нескольких свойствах.

//вначале, назначим нашему элементу переменную
var morphElement = $('morph_element');
 
//теперь создаем объект превращения
var morphObject = new Fx.Morph(morphElement);
 
//далее задаем параметры свойств, также как в случае с Fx.Tween
//только сейчас можно будет устанавливать несколько свойств
morphObject.set({
    'width': 100,
    'height': 100,
    'background-color': '#eeeeee'
});
 
//еще можно начать превращение также, как и в случае с tween
//с помощью функции start, но назначить изменения в нескольких свойствах
morphObject.start({
    'width': 300,
    'height': 300,
    'background-color': '#d3715c'
});

Вот это и есть тот минимум, который необходим для создания, настройки и запуска эффекта morph – превращения.

Ну, а для того, что бы сделать всё по-хорошему, нужно создать еще несколько переменных, отделить функции друг от друга, создать несколько событий и прослушек для хорошего контроля всего процесса:

var morphSet = function(){
	//далее задаем параметры свойств стилей, также как в случае с Fx.Tween
	//только сейчас можно будет устанавливать несколько свойств стилей
	this.set({
		'width': 100,
		'height': 100,
		'background-color': '#eeeeee'
	});
}
 
var morphStart = function(){
//еще можно начать превращение также, как и в случае с tween
//с помощью функции start, но назначить изменения в нескольких свойствах
	this.start({
		'width': 300,
		'height': 300,
		'background-color': '#d3715c'
	});
}
 
 
var morphReset = function(){
	//устанавливаем первоначальные значения
	this.set({
		'width': 0,
		'height': 0,
		'background-color': '#ffffff'
	});
}
 
window.addEvent('domready', function() {
	var morphElement = $('morph_element');
	var morphObject = new Fx.Morph(morphElement);
 
	//тут добавляем прослушку соответствующим кнопкам
	//и соединяем переменную morphObject с функцией
	//что позволяет нам использовать "this"
	$('morph_set').addEvent('click', morphSet.bind(morphObject));  
	$('morph_start').addEvent('click', morphStart.bind(morphObject));
	$('morph_reset').addEvent('click', morphReset.bind(morphObject));
});
<div id="morph_element"></div>
<button id="morph_set">Установить</button>
<button id="morph_start">Запустить</button>
<button id="morph_reset">Сбросить</button>



Fx Options

Вот несколько параметров, которые принимаются как Fx.Tween, так и Fx.Morph. Их просто использовать и они дают массу возможностей по управлению над вашими эффектами. Для использования этих настроек, нужно использовать конструкции такой формы:

//объявляем объекты morph и tween
//а все параметры вставляем в фигурные скобки
var morphObject = new Fx.Morph(morphElement, {
    //вначале объявляем название параметра
    //потом двоеточие - :
    //и значение параметра
    duration: 'long',
    transition: 'sine:in'
});

fps (frames per second) – кадры в секунду

Данный параметр определяет скорость анимации. По умолчанию скорость анимации установлена на 50 кадров в секунду и этот параметр может принимать данные в виде чисел и переменные, содержащие числа.

//определяем объект, а параметры в фигурные скобки { }
var morphObject = new Fx.Morph(morphElement, {
    fps: 60
});
 
//или
var framesPerSecond = 60;
 
var tweenObject = new Fx.Tween(tweenElement, {
    fps: framesPerSecond
});

unit

Параметр unit определяет единицу измерения. Например, нужно, чтобы число 100 означало px – пиксели, % – проценты или что-лобо еще.

//все как и выше
var morphObject = new Fx.Morph(morphElement, {
    unit: '%'
});

link

Параметр link позволяет управлять несколькими вызовами эффекта. Например, если имеется объект с эффектом mouseover, вы же не хотите начинать его каждый раз, как пользователь наводит на него указатель? Или, если пользователь наводит мышь на объект дважды, нужно ли игнорировать следующий вызов эффекта или его нужно поставить в очередь и запустить сразу по окончании первого вызова? У параметра link есть 3 возможных значения:

  • ‘ignore’ (по умолчанию) – это значение игнорирует все вызовы пока предыдущее выполнение эффекта не выполнено.
  • ‘calcel’ – отменяет текущее выполнение эффекта и запускает его с начала.
  • ‘chain’ – позволяет чередовать вызовы эффектов и выполнять каждый из них по очереди.
//и снова назначаем объект в переменную
var morphObject = new Fx.Morph(morphElement, {
    link: 'chain'
});

duration – длительность

Параметр duration определяет длительности анимации. Этот параметр не является идентичным параметру speed (скорость), но пока всей разницы лично я пока не понял. Может кто объяснит? :) Этот параметр принимает числа (милисекунды), переменную, содержащую числа, или же одно из ключевых слов, обозначающих длительность в милисекундах:

  • ’short’ = 250
  • ‘normal’ = 500 (по умолчанию)
  • ‘long’ = 1000
//определяем объект и вставляем его параметры в фигурные скобки
var morphObject = new Fx.Morph(morphElement, {
    duration: 'long'
});
 
//или
var morphObject = new Fx.Morph(morphElement, {
    duration: 1000
});

transition – переход

И последний параметр, который мы рассмотрим, это параметр transition, который определяет тип перехода. Например, это должен быть плавный переход или он должен начинаться плавно, а потом ускориться под конец. В полиграфии есть штука под названием «пантонница». Предлагаю вашему вниманию «транзитницу» библиотеки Mootools :) :

var tweenObject = new Fx.Tween(tweenElement, {
    transition: 'quad:in'
});

Примечание: Первая полоса перехода оснащена зарядом красного highlight, переходящий в оранжевый highlight (мы о нем говорили в прошлом уроке). А вот и она, «транзитница», собственно:

‘quad:in’
‘quad:out’
‘quad:in:out’
‘cubic:in’
‘cubic:out’
‘cubic:in:out’
‘quart:in’
‘quart:out’
‘quart:in:out’
‘quint:in’
‘quint:out’
‘quint:in:out’
‘expo:in’
‘expo:out’
‘expo:in:out’
‘circ:in’
‘circ:out’
‘circ:in:out’
’sine:in’
’sine:out’
’sine:in:out’
‘back:in’
‘back:out’
‘back:in:out’
‘bounce:in’
‘bounce:out’
‘bounce:in:out’
‘elastic:in’
‘elastic:out’
‘elastic:in:out’

Всего существует 30 видов переходов, которые состоят из 10 основных типов, имеющих каждый по 3 параметра.

Основные типы:

  • Quad
  • Cubic
  • Quart
  • Quint
  • Expo
  • Circ
  • Shine
  • Back
  • Bounce
  • Elastic

Параметры:

  • Ease In
  • Ease Out
  • Ease In Out

Эти три параметра отвечают за следующее: при использовании параметра In спец.эффект перехода будет использоваться только при увеличении некоторых свойств объекта, тогда как параметр Out отвечает за спец.эффект перехода при уменьшении свойствf (знаю, что звучит немного непонятно, но обратите внимание на то, как себя ведут объекты с переходом одного типа с параметрами in и out нашей «транзитницы» при наведении курсора и при его заборе с объекта). InOut, соответственно, определяет использование спец. эффекта перехода, в обоих случаях, т.е. как при увеличении определенных свойств, так и при их уменьшении.

Fx Events – события

События спец. эффектов позволяют выполнять определенный код в различные стадии анимационного эффекта. Эти события могут быть очень полезны для создания обратной связи с пользователями и создает еще один уровень управления над своими эффектами:

  • onStart – срабатывает при начале эффекта
  • onCancel – срабатывает при отмене эффекта
  • onComplete – срабатывает при завершении эффекта
  • onChainComplete – срабатывает при завершении поочередных эффектов.

При создании эффекта tween или morph, события определяются по тому же принципу, что и параметры эффекта, только в качестве значения событию передается функция:

//определяем новый объект переменной
//и объявляем его новым объектом класса Fx.Tween
quadIn = new Fx.Tween(quadIn, {
        //тут выставляем опции
	link: 'cancel',
	transition: ‘quad:in,
 
       //несколько событий
	onStart: function(passes_tween_element){
                //эти события применяются к нашему объекту
                //потому эффект "highlight" применяется к
                //началу анимации
	        passes_tween_element.highlight('#C54641');
	},
 
        //обратите внимание на разделители между функциями, в виде запятых,
        //тогда как, после последнего параметра или события
        //запятые не ставятся
        onComplete: function(passes_tween_element){
                //а тут мы применяем эффекст highlight к завершению анимации 
	        passes_tween_element.highlight('#C54641');
	}
});

Пример

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

//эту функцию будем запускать по событию mouseenter
var enterFunction = function() {
	this.start('width', '700px');
}
 
//эту функцию будем запускать по событию mouseleave
var leaveFunction = function() {
	this.start('width', '300px');
}
 
window.addEvent('domready', function() {
    //определим переменными некоторые элементы на странице
    var quadIn = $('quadin');
    var quadOut = $('quadout');
    var quadInOut = $('quadinout');
 
    //потом создаем по одному элементу tween каждой переменной, объявленной выше
    quadIn = new Fx.Tween(quadIn, {
	link: 'cancel',
	transition: Fx.Transitions.Quad.easeIn,
	onStart: function(passes_tween_element){
		passes_tween_element.highlight('#C54641');
	},
	onComplete: function(passes_tween_element){
		passes_tween_element.highlight('#E67F0E');
	}	
    });
 
   quadOut = new Fx.Tween(quadOut, {
	link: 'cancel',
	transition: 'quad:out'
    });
 
    quadInOut = new Fx.Tween(quadInOut, {
	link: 'cancel',
	transition: 'quad:in:out'
    });
 
    //теперь добавим каждому элементу по прослушке на события
    //обратите внимание на использование функции .addEvents
    //которая работает также, как и .addEvent
    //только можно добавлять несколько событий, используя определённый шаблон
    $('quadin').addEvents({
        //вначале нужно объявить событие, поместив его в единичные кавычки,
        //отделить их двоеточием (":")
        //и объявить функцию, которая будет выполняться при этом событии.
        //в данном случае, это функция, которая связана с эффектом tween
        //разделения событий производится с помощью запятой;
        //после последнего события запятая НЕ ИСПОЛЬЗУЕТСЯ
        'mouseenter': enterFunction.bind(quadIn),
        'mouseleave': leaveFunction.bind(quadIn)
    });
 
    $('quadout').addEvents({
        //обратите внимание, как мы снова используем те же функции в этом коде
        'mouseenter': enterFunction.bind(quadOut),
        'mouseleave': leaveFunction.bind(quadOut)
    });
 
    $('quadinout').addEvents({
        //тут мы также используем те же функции
        //просто они каждый раз вызываются для работы с событием над разными элементами
        //и привязаны они к разным объектам tween
        'mouseenter': enterFunction.bind(quadInOut),
        'mouseleave': leaveFunction.bind(quadInOut)
    });

, , , , ,

  1. #1 by астромэн on 29.12.2009 - 9:58 дп

    хорошие уроки! мне нравится. в этом уроке отдельное спасибо за примеры со всеми эффектами. Наконец их можно рассмотреть вблизи и понять, что каждый из них делает. жаль только нельзя их запускать одновременно… с в общем, спасибо!

  2. #2 by SDemon on 16.02.2010 - 5:39 пп

    Очень понравился урок!
    Спасибо ))

    Пытаюсь усложнить конструкцию для отображения скрытого html блока.
    Использовал \»transition: Fx.Transitions.Sine.easeInOut\»
    В контейнере \»sineinout\» создал еще два блока (для отображения блока с заголовком и блока для html кода).
    Сам контейнер \»sineinout\» отлично работает, но html код в закрытом состоянии уходит под блок с заголовком, а в раздвинутом состоянии все OK!

    Как можно спрятать вложенный блок?
    Т.е. показывать его только в раскрытом состоянии.

    Пытался создавать на \»Fx.Slide\», с html блоком все в порядке, а вот в остальном ужас (

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

    Посоветуйте, что можно сделать?

  3. #3 by SDemon on 17.02.2010 - 2:02 пп

    Все получилось :)

    Блоку с html кодом установил «display: none», а потом для «new Fx.Tween» задал дополнительное значение «.setStyle(’display’, ‘block’);», а для того чтобы блок опять исчезал пришлось создать второй «new Fx.Tween» для «mouseleave» состояния мышки, где опять увожу блок в .setStyle(’display’, ‘none’);

    Но на этом я не остановился и сделал плавное появление html кода, «.fade(’in’);» – поставил на «mouseenter» состояние мыши. И получилось все супер! ))
    В комментариях поддерживаются BB код, чтобы можно было выложить рабочий вариант кода?

    Да еще одна проблемка осталась!
    У меня будет около 10 таких блоков и сейчас для каждого блока своя конструкция, которая идентична, различия только в «id» блоков и все!
    С массивами урок читал, но прикрутить массив к этому решению не могу (( В принципе и так работает, но код, конечно очень длинный и лимит с количеством контейнеров, жесткий ((

    Спасибо Вам за уроки! Благодаря им у меня получилось сделать то, что я бы сам никогда ни сделал!

(никто не узнает)
Код на картинке: