2013-02-26 48 views
1

我試圖做一個自己的自定義js文本滾動(我希望文本滾動到一個div內的左側,然後重複滾動一次又一次)。試圖創建自定義jQuery文本滾動

但我有一些問題。我真的不能把我的手指放在我做錯了什麼地方,或者我需要新的功能。我能得到的所有幫助都是受歡迎的。

這裏有一個小提琴例如:http://jsfiddle.net/Na373/

的HTML:

<div class="wrap"> 
    <div class="scroll"> 
     <ul class="active"> 
      <li>Hello World</li> 
      <li>Hello World</li> 
      <li>Hello World</li> 
      <li>Hello World</li> 
      <li>Hello World</li> 
      <li>Hello World</li> 
      <li>Hello World</li> 
      <li>Hello World</li> 
      <li>Hello World</li> 
      <li>Hello World</li> 
     </ul> 
    </div> 

的JS:

$ul = $('.scroll ul'); 
//copys the existing ul and appends it after the existing one 
$('.scroll').append($ul.clone().removeClass().addClass('not_active')); 

function scroll() { 
    $active = $('.scroll ul.active'); 

    $active.each(function() { 
     $not_active = $('.scroll ul.not_active'); 

     // foreach time the function runs the ul goes "left: -1px;" 
     var current_position = parseInt($(this).css('left')); 
     var new_position = current_position - 1; 
     $(this).css('left', new_position+'px'); 

     var parent_width = $(this).parent().outerWidth(); // gets the width of ".scroll" 
     var width = $(this).outerWidth(); // gets the width of the "ul" 
     var shown_all = current_position + width; 

     // if the right corner of the "ul" are att the right corner of ".scroll" 
     // this if statement executes and adds new existing class on the "ul.not_active" 
     // and adds class ".active" instead 
     // this means that there are 2 ul with the class active 
     //running simultaneously 
     if (shown_all == parent_width) { 
      $not_active.removeClass().addClass('active'); 
     } 

     // here it checks if the "ul.active" have past its own length to left 
     // Here im trying to make it "not_active" and put it after the existing ".active" 
     // 
     // <ul class="active">....</ul> ----> <ul class="not_active">...</ul> 
     // 
     // then put it after the other "ul.active" 
     // 
     //   <ul class="active 
     // ---------> <ul class="not_active"></ul> 
     // 
     // So it all beginns from the beginning 
     if (current_position == '-'+width) { 
      $(this).removeClass().addClass('not_active').css('left', '0'); 
      $(this).insertAfter($('.scroll ul').next()); 
     } 
    }); 
}; 
// And here I run the function 
setInterval(scroll, 10); 

CSS:

.wrap { 
    position: relative; 
    padding: 10px 10px 10px; 
    height: 18px; 
    background: #000; 
    color: #fff; 
    overflow: hidden; 
    width: 500px; 
} 
.scroll { 
    width: 500px; 
    white-space: nowrap; 
} 
.scroll ul { 
    left: 0; 
    position: relative; 
    margin: 0; 
    padding: 0; 
    display: inline; 
    list-style: none; 
} 
.scroll ul li { 
    padding: 0; 
    margin: 0; 
    display: inline; 
} 

回答

1

我覺得你的問題是在下面的if語句

if (shown_all == parent_width) { 

據我所知,shown_all = current_position + width,意味着shown_all將在0 +寬UL的開始,並將在0結束的條件。用當前的代碼,if語句永遠不會是真的。

如果您更改的if語句if (shown_all == 0)或更改您如何設置可變shown_allvar shown_all = -current_position + width;,我想你會看到一個更好的結果。

+0

我明白你的意思。但是如果這個陳述是真的,它將其他'ul'設置爲'.active'。所以有兩個'ul.active runnng同時。因爲我希望他們互相重疊,所以從來沒有空的空間。對不起,如果我沒有在描述中更好地解釋它。 – Oscar 2013-02-26 15:25:12

+0

您希望在第一個ul即將「耗盡」時激活其他ul。你現在的方式,它永遠不會被激活。我猜你必須嘗試一下這些值才能確定它何時平穩過渡。另外,您可能還想將右邊的第二個偏移量偏移,以便過渡看起來是無縫的。 – 2013-02-26 16:14:12

0

我現在來到這裏工作的例子: http://jsfiddle.net/s8TnL/

所有的反應是更受歡迎。我很高興收到有關性能和功能的回覆。

HTML:

<div class="wrap"> 
<div class="scroll"> 
    <ul class="active"> 
     <li>Hello World</li> 
     <li>Hello World</li> 
     <li>Hello World</li> 
     <li>Hello World</li> 
     <li>Hello World</li> 
     <li>Hello World</li> 
     <li>Hello World</li> 
    </ul> 
</div> 

CSS:

.wrap { 
    position: relative; 
    padding: 10px 10px 10px; 
    height: 18px; 
    background: #0BF397; 
    color: #fff; 
    overflow: hidden; 
    width: 500px 
} 
.scroll { 
    display: block; 
    white-space: nowrap; 
} 
.scroll ul { 
    position: relative; 
    margin: 0; 
    padding: 0; 
    display: inline; 
    list-style: none; 
} 
.scroll ul li { 
    padding: 0; 
    margin: 0; 
    display: inline; 
} 

JS:

$ul = $('.scroll ul'); 
$('.scroll').append($ul.clone().removeClass().addClass('not_active')); 

$ul.hover(function() { 
    clearInterval(activate); 
}, function() { 
    activate = setInterval(scroll, 10); 
}); 

function scroll() { 
    $active = $('.scroll ul.active'); 

    $active.each(function() { 
     $not_active = $('.scroll ul.not_active'); 
     var offset = $(this).offset(); 

     var current_position = offset.left; 
     var new_position = current_position - 1; 
     $(this).offset({ 
      left: new_position 
     }); 

     var parent_width = $(this).parent().outerWidth(); 
     var width = $(this).outerWidth(); 

     var shown_all = current_position + width; 

     if (shown_all == parent_width) { 
      $not_active.removeClass().addClass('active').offset({ 
       left: parent_width 
      }); 
     } 

     if (current_position == '-' + width) { 
      $(this).removeClass().addClass('not_active'); 
     } 
    }); 
}; 

activate = setInterval(scroll, 10);