我正在尝试制作一个字幕 - 通过jQuery,就像Pandora的。
如果
,我希望它只能开始滚动1)元素的宽度将被切断 2)如果你将鼠标悬停在元素上。
鼠标移开时应恢复正常。
这是我到目前为止所做的,几乎有效:
var h3 = $('h3:first'), h3Width = h3.width();
if( h3.get(0).scrollWidth > h3Width ) {
$(h3).addClass('department-scroll-container').css( 'width', h3.width() + 'px' ).wrapInner( '<span style="width: ' + h3Width + 'px; position: relative; display:block" />' );
$('span:first', h3).clone().appendTo( h3 ).hide();
// Create the event
h3.mouseover( function() {
var h3 = $(this), h3Width = $(this).width();
$(this).find('span:first').animate({ 'right': h3Width + 'px' }, 5000 );
var interval = setInterval( function() {
var visible_span = $('span:visible:first', h3);
$('span:hidden', h3).css( 'right', parseInt( -h3Width ) + 'px' ).show().animate({ 'right': h3Width + 'px' }, 5000, 'linear' );
visible_span.hide();
}, 5000 );
$(this).data( 'interval', interval );
}).mouseout( function() {
var interval = $(this).data( 'interval' );
clearInterval( interval );
$(this).find('span:first').css( 'right', '0' ).end().find('span:last').hide();
});
}
问题是,使其滚动一次。
我认为mouseout会因为其中的跨度而被触发 - 我需要一种方法来使这更顺畅,并以某种方式工作。
有什么想法吗?
更新
感谢下面的答案,我得到了一个解决方案,见下文:
var h3 = $('h3:first', department), h3Width = h3.width();
// Marquee
if( h3.get(0).scrollWidth > h3Width ) {
$(h3).addClass('department-scroll-container').css( 'width', h3.width() + 'px' ).wrapInner( '<span style="width: ' + h3Width + 'px; position: relative; display:block" />' );
$('span:first', h3).clone().appendTo( h3 ).hide();
// Create the event
h3.mouseenter( function() {
var h3 = $(this), h3Width = $(this).width();
$(this).data( 'animate', true ).find('span:first').animate({ 'right': h3Width + 'px' }, 2500, 'linear' );
setTimeout( function() {
// Don't continue if it's been stopped
if( !h3.data('animate') )
return;
var visible_span = $('span:visible:first', h3);
$('span:hidden', h3).css( 'right', parseInt( -h3Width ) + 'px' ).show().animate({ 'right': h3Width + 'px' }, 5000, 'linear' );
visible_span.hide();
var interval = setInterval( function() {
// Don't continue if it's been stopped
if( !h3.data('animate') )
return;
var visible_span = $('span:visible:first', h3);
$('span:hidden', h3).css( 'right', parseInt( -h3Width ) + 'px' ).show().animate({ 'right': h3Width + 'px' }, 5000, 'linear' );
visible_span.hide();
}, 5000 );
}, 2500 );
$(this).data( 'interval', interval );
}).mouseleave( function() {
$(this).data( 'animate', false );
var interval = $(this).data( 'interval' );
clearInterval( interval );
$(this).find('span:first').stop().css( 'right', '0' ).show().end().find('span:last').stop().hide();
});
}