I'm the author of vTicker.
I see the same behaviour in Webkit and if this is a webkit bug it probably won't get fixed any time soon!
My suggestion is to add some events to vTicker (before and after ticker animates) and then set the desired effects using jQuery.
Have a look at this:
/*
Vertical News Ticker 1.15 (pre-release)
Original by: Tadas Juozapaitis ( kasp3rito [eta] gmail (dot) com )
http://www.jugbit.com/jquery-vticker-vertical-news-ticker/
Forked/Modified by: Richard Hollis @richhollis - richhollis.co.uk
*/
(function($){
var defaults = {
speed: 700,
pause: 4000,
showItems: 1,
mousePause: true,
height: 0,
animate: true,
margin: 0,
padding: 0,
startPaused: false
};
var internal = {
moveUp: function(state, attribs) {
internal.animate(state, attribs, 'up');
},
moveDown: function(state, attribs){
internal.animate(state, attribs, 'down');
},
animate: function(state, attribs, dir) {
var height = state.itemHeight;
var options = state.options;
var el = state.element;
var obj = el.children('ul');
var selector = (dir === 'up') ? 'li:first' : 'li:last';
state.element.trigger("vticker.beforeTick");
var clone = obj.children(selector).clone(true);
if(options.height > 0) height = obj.children('li:first').height();
height += (options.margin) + (options.padding*2); // adjust for margins & padding
if(dir==='down') obj.css('top', '-' + height + 'px').prepend(clone);
if(attribs && attribs.animate) {
if(state.animating) return;
state.animating = true;
var opts = (dir === 'up') ? {top: '-=' + height + 'px'} : {top: 0};
obj.animate(opts, options.speed, function() {
$(obj).children(selector).remove();
$(obj).css('top', '0px');
state.animating = false;
state.element.trigger("vticker.ticked");
});
} else {
obj.children(selector).remove();
obj.css('top', '0px');
state.element.trigger("vticker.ticked");
}
if(dir==='up') clone.appendTo(obj);
},
nextUsePause: function() {
var state = $(this).data('state');
var options = state.options;
if(state.isPaused || state.itemCount < 2) return;
methods.next.call( this, {animate:options.animate} );
},
startInterval: function() {
var state = $(this).data('state');
var options = state.options;
var initThis = this;
state.intervalId = setInterval(function(){
internal.nextUsePause.call( initThis );
}, options.pause);
},
stopInterval: function() {
var state = $(this).data('state');
if(!state) return;
if(state.intervalId) clearInterval(state.intervalId);
state.intervalId = undefined;
},
restartInterval: function() {
internal.stopInterval.call(this);
internal.startInterval.call(this);
}
};
var methods = {
init: function(options) {
// if init called second time then stop first, then re-init
methods.stop.call(this);
// init
var defaultsClone = jQuery.extend({}, defaults);
var options = $.extend(defaultsClone, options);
var el = $(this);
var state = {
itemCount: el.children('ul').children('li').length,
itemHeight: 0,
itemMargin: 0,
element: el,
animating: false,
options: options,
isPaused: (options.startPaused) ? true : false,
pausedByCode: false
};
$(this).data('state', state);
el.css({overflow: 'hidden', position: 'relative'})
.children('ul').css({position: 'absolute', margin: 0, padding: 0})
.children('li').css({margin: options.margin, padding: options.padding});
if(isNaN(options.height) || options.height === 0)
{
el.children('ul').children('li').each(function(){
var current = $(this);
if(current.height() > state.itemHeight)
state.itemHeight = current.height();
});
// set the same height on all child elements
el.children('ul').children('li').each(function(){
var current = $(this);
current.height(state.itemHeight);
});
// set element to total height
var box = (options.margin) + (options.padding * 2);
el.height(((state.itemHeight + box) * options.showItems) + options.margin);
}
else
{
// set the preferred height
el.height(options.height);
}
var initThis = this;
if(!options.startPaused) {
internal.startInterval.call( initThis );
}
if(options.mousePause)
{
el.bind("mouseenter", function () {
//if the automatic scroll is paused, don't change that.
if (state.isPaused === true) return;
state.pausedByCode = true;
// stop interval
internal.stopInterval.call( initThis );
methods.pause.call( initThis, true );
}).bind("mouseleave", function () {
//if the automatic scroll is paused, don't change that.
if (state.isPaused === true && !state.pausedByCode) return;
state.pausedByCode = false;
methods.pause.call(initThis, false);
// restart interval
internal.startInterval.call( initThis );
});
}
},
pause: function(pauseState) {
var state = $(this).data('state');
if(!state) return undefined;
if(state.itemCount < 2) return false;
state.isPaused = pauseState;
if(pauseState) $(this).addClass('paused');
else $(this).removeClass('paused');
},
next: function(attribs) {
var state = $(this).data('state');
if(!state) return undefined;
if(state.animating || state.itemCount < 2) return false;
internal.restartInterval.call( this );
internal.moveUp(state, attribs);
},
prev: function(attribs) {
var state = $(this).data('state');
if(!state) return undefined;
if(state.animating || state.itemCount < 2) return false;
internal.restartInterval.call( this );
internal.moveDown(state, attribs);
},
stop: function() {
var state = $(this).data('state');
if(!state) return undefined;
internal.stopInterval.call( this );
},
remove: function() {
var state = $(this).data('state');
if(!state) return undefined;
internal.stopInterval.call( this );
var el = state.element;
el.unbind();
el.remove();
}
};
$.fn.vTicker = 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 ' + method + ' does not exist on jQuery.vTicker' );
}
};
})(jQuery);
jQuery(function() {
function setInitialOpacities() {
var ul = jQuery('#home-tick ul');
ul.children('li:nth-child(1)').css("opacity", .15);
ul.children('li:nth-child(2)').css("opacity", .15);
ul.children('li:nth-child(3)').css("opacity", .23);
ul.children('li:nth-child(4)').css("opacity", 1);
ul.children('li:nth-child(5)').css("opacity", .23);
ul.children('li:nth-child(6)').css("opacity", .15);
ul.children('li:nth-child(7)').css("opacity", .15);
}
jQuery('#home-tick').vTicker({showItems: 7});
setInitialOpacities();
jQuery('#home-tick').on('vticker.beforeTick', function() {
var ul = jQuery('#home-tick ul');
var interval = 500;
ul.children('li:nth-child(1)').animate({opacity: .15}, interval);
ul.children('li:nth-child(2)').animate({opacity: .15}, interval);
ul.children('li:nth-child(3)').animate({opacity: .23}, interval);
ul.children('li:nth-child(4)').animate({opacity: .23}, interval);
ul.children('li:nth-child(5)').animate({opacity: 1}, interval);
ul.children('li:nth-child(6)').animate({opacity: .23}, interval);
ul.children('li:nth-child(7)').animate({opacity: .15}, interval);
ul.children('li:nth-child(8)').css("opacity", .15);
});
jQuery('#home-tick').on('vticker.ticked', function() {
});
});
If this gives you what you need then please mark as answer and I will update vTicker release accordingly.
Richard