/*
* jQuery liMarquee v 3.8
*
* Copyright 2013, Linnik Yura | LI MASS CODE | http://masscode.ru
* http://masscode.ru/index.php/k2/item/44-limarquee
* Free to use
*
* 04.12.2013
*/
(function ($) {
var methods = {
init: function (options) {
var p = {
direction: 'left', //Указывает направление движения содержимого контейнера (left | right | up | down)
loop: -1, //Задает, сколько раз будет прокручиваться содержимое. "-1" для бесконечного воспроизведения движения
scrolldelay: 0, //Величина задержки в миллисекундах между движениями
scrollamount: 50, //Скорость движения контента (px/sec)
circular: true, //Если "true" - строка непрерывная
drag: true, //Если "true" - включено перетаскивание строки
runshort: true, //Если "true" - короткая строка тоже "бегает", "false" - стоит на месте
hoverstop: true, //true - строка останавливается при наведении курсора мыши, false - строка не останавливается
xml: false //Путь к xml файлу с нужным текстом
};
if (options) {
$.extend(p, options);
}
return this.each(function () {
var
loop = p.loop,
strWrap = $(this).addClass('str_wrap'),
fMove = false;
var code = function () {
if(!$('.str_move',strWrap).length){
strWrap.wrapInner($('
').addClass('str_move'));
}
var
strMove = $('.str_move', strWrap).addClass('str_origin'),
strMoveClone = strMove.clone().removeClass('str_origin').addClass('str_move_clone'),
time = 0;
if (!p.hoverstop) {
strWrap.addClass('noStop');
}
var circCloneHor = function(){
strMoveClone.clone().css({
left:'100%',
right:'auto',
width: strMove.width()
}).appendTo(strMove);
strMoveClone.css({
right: '100%',
left:'auto',
width: strMove.width()
}).appendTo(strMove);
}
var circCloneVert = function(){
strMoveClone.clone().css({
top: '100%',
bottom:'auto',
height: strMove.height()
}).appendTo(strMove);
strMoveClone.css({
bottom: '100%',
top:'auto',
height:strMove.height()
}).appendTo(strMove);
}
if (p.direction == 'left') {
strWrap.height(strMove.outerHeight())
if (strMove.width() > strWrap.width()) {
var leftPos = -strMove.width();
if (p.circular) {
if (!p.xml) {
circCloneHor()
leftPos = -(strMove.width() + (strMove.width() - strWrap.width()));
}
}
if (p.xml) {
strMove.css({
left:strWrap.width()
})
}
var
strMoveLeft = strWrap.width(),
k1 = 0,
timeFunc1 = function () {
var
fullS = Math.abs(leftPos),
time = (fullS / p.scrollamount) * 1000;
if (parseFloat(strMove.css('left')) != 0) {
fullS = (fullS + strWrap.width());
time = (fullS - (strWrap.width() - parseFloat(strMove.css('left')))) / p.scrollamount * 1000;
}
return time;
},
moveFuncId1 = false,
moveFunc1 = function () {
if (loop != 0) {
strMove.stop(true).animate({
left: leftPos
}, timeFunc1(), 'linear', function () {
$(this).css({
left: strWrap.width()
});
if (loop == -1) {
moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay);
} else {
loop--;
moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay);
}
});
}
};
moveFunc1();
if (p.hoverstop) {
strWrap.on('mouseenter', function () {
$(this).addClass('str_active');
clearTimeout(moveFuncId1);
strMove.stop(true);
}).on('mouseleave', function () {
$(this).removeClass('str_active');
$(this).off('mousemove');
moveFunc1();
});
if (p.drag) {
strWrap.on('mousedown', function (e) {
strMoveLeft = strMove.position().left;
k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
$(this).on('mousemove', function (e) {
fMove = true;
strMove.stop(true).css({
left: k1 + (e.clientX - strWrap.offset().left)
});
}).on('mouseup', function () {
$(this).off('mousemove');
setTimeout(function () {
fMove = false
}, 50)
}).on('click', function () {
if (fMove) {
return false
}
});
return false;
});
} else {
strWrap.addClass('no_drag');
};
}
} else {
if (p.runshort) {
strMove.css({
left: strWrap.width()
});
var
strMoveLeft = strWrap.width(),
k1 = 0,
timeFunc = function () {
time = (strMove.width() + strMove.position().left) / p.scrollamount * 1000;
return time;
};
var moveFunc = function () {
var leftPos = -strMove.width();
strMove.animate({
left: leftPos
}, timeFunc(), 'linear', function () {
$(this).css({
left: strWrap.width()
});
if (loop == -1) {
setTimeout(moveFunc, p.scrolldelay);
} else {
loop--;
setTimeout(moveFunc, p.scrolldelay);
}
});
};
moveFunc();
if (p.hoverstop) {
strWrap.on('mouseenter', function () {
$(this).addClass('str_active');
strMove.stop(true);
}).on('mouseleave', function () {
$(this).removeClass('str_active');
$(this).off('mousemove');
moveFunc();
});
if (p.drag) {
strWrap.on('mousedown', function (e) {
strMoveLeft = strMove.position().left;
k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
$(this).on('mousemove', function (e) {
strMove.stop(true).css({
left: k1 + (e.clientX - strWrap.offset().left)
});
}).on('mouseup', function () {
$(this).off('mousemove');
});
return false;
});
} else {
strWrap.addClass('no_drag');
};
}
} else {
strWrap.addClass('str_static');
}
};
};
if (p.direction == 'right') {
strWrap.height(strMove.outerHeight())
strWrap.addClass('str_right');
strMove.css({
left: -strMove.width(),
right: 'auto'
})
if (strMove.width() > strWrap.width()) {
var leftPos = strWrap.width();
if (p.circular) {
if (!p.xml) {
circCloneHor()
//Определяем крайнюю точку
leftPos = strMove.width();
}
}
var
k2 = 0;
timeFunc = function () {
var
fullS = strWrap.width(), //крайняя точка
time = (fullS / p.scrollamount) * 1000; //время
if (parseFloat(strMove.css('left')) != 0) {
fullS = (strMove.width() + strWrap.width());
time = (fullS - (strMove.width() + parseFloat(strMove.css('left')))) / p.scrollamount * 1000;
}
return time;
};
var moveFunc = function () {
if (loop != 0) {
strMove.animate({
left: leftPos
}, timeFunc(), 'linear', function () {
$(this).css({
left: -strMove.width()
});
if (loop == -1) {
setTimeout(moveFunc, p.scrolldelay);
} else {
loop--;
setTimeout(moveFunc, p.scrolldelay);
};
});
};
};
moveFunc();
if (p.hoverstop) {
strWrap.on('mouseenter', function () {
$(this).addClass('str_active');
strMove.stop(true);
}).on('mouseleave', function () {
$(this).removeClass('str_active');
$(this).off('mousemove');
moveFunc();
});
if (p.drag) {
strWrap.on('mousedown', function (e) {
strMoveLeft = strMove.position().left;
k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
$(this).on('mousemove', function (e) {
strMove.stop(true).css({
left: k2 + e.clientX - strWrap.offset().left
});
});
return false;
}).on('mouseup', function () {
$(this).off('mousemove');
});
} else {
strWrap.addClass('no_drag');
};
}
} else {
if (p.runshort) {
var k2 = 0;
var timeFunc = function () {
time = (strWrap.width() - strMove.position().left) / p.scrollamount * 1000;
return time;
};
var moveFunc = function () {
var leftPos = strWrap.width();
strMove.animate({
left: leftPos
}, timeFunc(), 'linear', function () {
$(this).css({
left: -strMove.width()
});
if (loop == -1) {
setTimeout(moveFunc, p.scrolldelay);
} else {
loop--;
setTimeout(moveFunc, p.scrolldelay);
};
});
};
moveFunc();
if (p.hoverstop) {
strWrap.on('mouseenter', function () {
$(this).addClass('str_active');
strMove.stop(true);
}).on('mouseleave', function () {
$(this).removeClass('str_active');
$(this).off('mousemove');
moveFunc();
});
if (p.drag) {
strWrap.on('mousedown', function (e) {
strMoveLeft = strMove.position().left;
k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
$(this).on('mousemove', function (e) {
strMove.stop(true).css({
left: k2 + e.clientX - strWrap.offset().left
});
});
return false;
}).on('mouseup', function () {
$(this).off('mousemove');
});
} else {
strWrap.addClass('no_drag');
};
}
} else {
strWrap.addClass('str_static');
}
};
};
if (p.direction == 'up') {
strWrap.addClass('str_vertical');
if (strMove.height() > strWrap.height()) {
var topPos = -strMove.height();
if (p.circular) {
if (!p.xml) {
circCloneVert();
topPos = -(strMove.height() + (strMove.height() - strWrap.height()));
}
}
if (p.xml) {
strMove.css({
top:strWrap.height()
})
}
var
k2 = 0;
timeFunc = function () {
var
fullS = Math.abs(topPos),
time = (fullS / p.scrollamount) * 1000;
if (parseFloat(strMove.css('top')) != 0) {
fullS = (fullS + strWrap.height());
time = (fullS - (strWrap.height() - parseFloat(strMove.css('top')))) / p.scrollamount * 1000;
}
return time;
};
var moveFunc = function () {
if (loop != 0) {
strMove.animate({
top: topPos
}, timeFunc(), 'linear', function () {
$(this).css({
top: strWrap.height()
});
if (loop == -1) {
setTimeout(moveFunc, p.scrolldelay);
} else {
loop--;
setTimeout(moveFunc, p.scrolldelay);
};
});
};
};
moveFunc();
if (p.hoverstop) {
strWrap.on('mouseenter', function () {
$(this).addClass('str_active');
strMove.stop(true);
}).on('mouseleave', function () {
$(this).removeClass('str_active');
$(this).off('mousemove');
moveFunc();
});
if (p.drag) {
strWrap.on('mousedown', function (e) {
strMoveTop = strMove.position().top;
k2 = strMoveTop - (e.clientY - strWrap.offset().top);
$(this).on('mousemove', function (e) {
strMove.stop(true).css({
top: k2 + e.clientY - strWrap.offset().top
});
});
return false;
}).on('mouseup', function () {
$(this).off('mousemove');
});
} else {
strWrap.addClass('no_drag');
};
}
} else {
if (p.runshort) {
strMove.css({
top: strWrap.height()
});
var k2 = 0;
var timeFunc = function () {
time = (strMove.height() + strMove.position().top) / p.scrollamount * 1000;
return time;
};
var moveFunc = function () {
var topPos = -strMove.height();
strMove.animate({
top: topPos
}, timeFunc(), 'linear', function () {
$(this).css({
top: strWrap.height()
});
if (loop == -1) {
setTimeout(moveFunc, p.scrolldelay);
} else {
loop--;
setTimeout(moveFunc, p.scrolldelay);
};
});
};
moveFunc();
if (p.hoverstop) {
strWrap.on('mouseenter', function () {
$(this).addClass('str_active');
strMove.stop(true);
}).on('mouseleave', function () {
$(this).removeClass('str_active');
$(this).off('mousemove');
moveFunc();
});
if (p.drag) {
strWrap.on('mousedown', function (e) {
strMoveTop = strMove.position().top;
k2 = strMoveTop - (e.clientY - strWrap.offset().top);
$(this).on('mousemove', function (e) {
strMove.stop(true).css({
top: k2 + e.clientY - strWrap.offset().top
});
});
return false;
}).on('mouseup', function () {
$(this).off('mousemove');
});
} else {
strWrap.addClass('no_drag');
};
}
} else {
strWrap.addClass('str_static');
}
};
};
if (p.direction == 'down') {
strWrap.addClass('str_vertical').addClass('str_down');
strMove.css({
top: -strMove.height(),
bottom: 'auto'
})
if (strMove.height() > strWrap.height()) {
var topPos = strWrap.height();
if (p.circular) {
if (!p.xml) {
circCloneVert();
topPos = strMove.height();
}
}
if (p.xml) {
strMove.css({
top:-strMove.height()
})
}
var
k2 = 0;
timeFunc = function () {
var
fullS = strWrap.height(), //крайняя точка
time = (fullS / p.scrollamount) * 1000; //время
if (parseFloat(strMove.css('top')) != 0) {
fullS = (strMove.height() + strWrap.height());
time = (fullS - (strMove.height() + parseFloat(strMove.css('top')))) / p.scrollamount * 1000;
}
return time;
};
var moveFunc = function () {
if (loop != 0) {
strMove.animate({
top: topPos
}, timeFunc(), 'linear', function () {
$(this).css({
top: -strMove.height()
});
if (loop == -1) {
setTimeout(moveFunc, p.scrolldelay);
} else {
loop--;
setTimeout(moveFunc, p.scrolldelay);
};
});
};
};
moveFunc();
if (p.hoverstop) {
strWrap.on('mouseenter', function () {
$(this).addClass('str_active');
strMove.stop(true);
}).on('mouseleave', function () {
$(this).removeClass('str_active');
$(this).off('mousemove');
moveFunc();
});
if (p.drag) {
strWrap.on('mousedown', function (e) {
strMoveTop = strMove.position().top;
k2 = strMoveTop - (e.clientY - strWrap.offset().top);
$(this).on('mousemove', function (e) {
strMove.stop(true).css({
top: k2 + e.clientY - strWrap.offset().top
});
});
return false;
}).on('mouseup', function () {
$(this).off('mousemove');
});
} else {
strWrap.addClass('no_drag');
};
}
} else {
if (p.runshort) {
var k2 = 0;
var timeFunc = function () {
time = (strWrap.height() - strMove.position().top) / p.scrollamount * 1000;
return time;
};
var moveFunc = function () {
var topPos = strWrap.height();
strMove.animate({
top: topPos
}, timeFunc(), 'linear', function () {
$(this).css({
top: -strMove.height()
});
if (loop == -1) {
setTimeout(moveFunc, p.scrolldelay);
} else {
loop--;
setTimeout(moveFunc, p.scrolldelay);
};
});
};
moveFunc();
if (p.hoverstop) {
strWrap.on('mouseenter', function () {
$(this).addClass('str_active');
strMove.stop(true);
}).on('mouseleave', function () {
$(this).removeClass('str_active');
$(this).off('mousemove');
moveFunc();
});
if (p.drag) {
strWrap.on('mousedown', function (e) {
strMoveTop = strMove.position().top;
k2 = strMoveTop - (e.clientY - strWrap.offset().top);
$(this).on('mousemove', function (e) {
strMove.stop(true).css({
top: k2 + e.clientY - strWrap.offset().top
});
});
return false;
}).on('mouseup', function () {
$(this).off('mousemove');
});
} else {
strWrap.addClass('no_drag');
};
}
} else {
strWrap.addClass('str_static');
}
};
};
}
if (p.xml) {
$.ajax({
url: p.xml,
dataType: "xml",
success: function (xml) {
var xmlTextEl = $(xml).find('text');
var xmlTextLength = xmlTextEl.length;
for(var i = 0; i < xmlTextLength; i++){
var xmlElActive = xmlTextEl.eq(i);
var xmlElContent = xmlElActive.text();
var xmlItemEl = $('').text(xmlElContent).appendTo(strWrap);
if(p.direction == 'left' || p.direction == 'right'){
xmlItemEl.css({display:'inline-block',textAlign:'right'});
if(i > 0){
xmlItemEl.css({width:strWrap.width()+xmlItemEl.width()});
}
}
if(p.direction == 'down' || p.direction == 'up'){
xmlItemEl.css({display:'block',textAlign:'left'});
if(i > 0){
xmlItemEl.css({paddingTop:strWrap.height()});
}
}
}
code();
}
});
} else {
code();
}
strWrap.data({
ini:code
})
});
},
update: function () {
var el = $(this);
var str_origin = $('.str_origin',el);
var str_move_clone = $('.str_move_clone',el);
str_origin.stop(true);
str_move_clone.remove();
el.data('ini')();
}
};
$.fn.liMarquee = function (method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error('Метод ' + method + ' в jQuery.liMarquee не существует');
}
};
})(jQuery);