139 lines
2.6 KiB
JavaScript
139 lines
2.6 KiB
JavaScript
/*jslint browser:true */
|
|
/*global $*/
|
|
$(function() {
|
|
|
|
var ACTION_FILL = 1,
|
|
ACTION_ERASE = 2;
|
|
|
|
var defaultOptions = {
|
|
strings: [
|
|
"Hello!",
|
|
"How are you?"
|
|
],
|
|
waitFillDuration: 200,
|
|
waitEraseDuration: 2000,
|
|
animateDuration: 400,
|
|
easing: 'swing'
|
|
};
|
|
|
|
function FluidType ($userElem, userOptions) {
|
|
var _$other,
|
|
_$elem = $userElem,
|
|
_pauseRequested = false,
|
|
_currentAction = ACTION_ERASE,
|
|
_currentString = 0,
|
|
_options = $.extend({}, defaultOptions, userOptions),
|
|
_self = this;
|
|
|
|
this.animateFill = function() {
|
|
var str = _options.strings[_currentString];
|
|
_$elem.html(str);
|
|
_$elem.parent().find(_$other).remove();
|
|
_$other = _$elem.clone();
|
|
_$other.css({
|
|
width: '',
|
|
position: 'absolute',
|
|
visibility: 'hidden',
|
|
display: 'block',
|
|
left: '-300%',
|
|
});
|
|
_$elem.parent().append(_$other);
|
|
|
|
_$elem.velocity(
|
|
{
|
|
width: _$other.width()
|
|
},
|
|
{
|
|
duration: _options.animateDuration,
|
|
easing: _options.easing,
|
|
complete: _self.next
|
|
}
|
|
);
|
|
};
|
|
|
|
/*
|
|
* Erase
|
|
*/
|
|
this.animateErase = function() {
|
|
_$elem.velocity(
|
|
{
|
|
width: 0 //'= ' + _$other.width()
|
|
},
|
|
{
|
|
duration: _options.animateDuration,
|
|
easing: _options.easing,
|
|
complete: _self.next
|
|
}
|
|
);
|
|
|
|
};
|
|
|
|
/*
|
|
* Switch to the next action.
|
|
* Pause request does not affect Erase => Fill switch
|
|
*/
|
|
this.next = function() {
|
|
_currentString = (_currentString + 1) % _options.strings.length;
|
|
|
|
switch (_currentAction) {
|
|
case ACTION_ERASE:
|
|
_currentAction = ACTION_FILL;
|
|
setTimeout(
|
|
_self.animateFill.bind(_self),
|
|
_options.waitFillDuration
|
|
);
|
|
break;
|
|
case ACTION_FILL:
|
|
if (!_pauseRequested) {
|
|
_currentAction = ACTION_ERASE;
|
|
setTimeout(
|
|
_self.animateErase.bind(_self),
|
|
_options.waitEraseDuration
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
};
|
|
|
|
|
|
/*
|
|
* Start animation (again)
|
|
*/
|
|
this.start = function() {
|
|
// choose next string
|
|
_pauseRequested = false;
|
|
_self.next();
|
|
};
|
|
|
|
/*
|
|
* Request animation stop
|
|
*/
|
|
this.stop = function() {
|
|
_pauseRequested = true;
|
|
};
|
|
|
|
/*
|
|
* Set up element properties
|
|
*/
|
|
function initialize() {
|
|
_$elem.css({
|
|
boxSizing: 'border-box',
|
|
display: 'inline-block',
|
|
overflow: 'hidden',
|
|
whiteSpace: 'nowrap',
|
|
verticalAlign: 'bottom',
|
|
width: 0
|
|
});
|
|
_self.start();
|
|
}
|
|
initialize();
|
|
|
|
}
|
|
|
|
$.fn.fluidType = function(userOptions) {
|
|
var $target = $(this);
|
|
var fluidType = new FluidType($target, userOptions);
|
|
return fluidType;
|
|
};
|
|
});
|
|
|