jQuery Marquee - 就像潘多拉一样
我正在尝试通过 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();
});
}
问题是,这使它滚动一次。
我认为鼠标移开是因为其中的跨度而被触发的——我需要一种方法来使其更平滑并且以某种方式工作。
有什么想法吗?
更新
感谢下面的答案,我得到了一个解决方案,见下文:
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();
});
}
I'm trying to make a marquee -- via jQuery, that is like Pandora's.
I want it to make it only start scrolling if
1) The width of the element would be cut off
2) If you're hovering over the element.
It should revert back to normal when you mouseoff it.
Here is what I have so far, which almost works:
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();
});
}
The problem is, this makes it scroll once.
I think the mouseout is getting triggered because of the span that is within it as well -- I need a way to make this smoother and somehow work.
Any ideas?
UPDATE
Thanks to the answer below, I got a solution, see below:
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();
});
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论