iT邦幫忙

1

jQuery 做跑馬燈

  • 分享至 

  • xImage

大家好:
想請問第一次載入第一則訊息不重複兩遍
https://jsfiddle.net/tnxa7dsr/1/

html

<body>
	<div class="abgne-news-scroll">
		<ul>
			<li>圖書管理系統 - 預算約 20 萬元</li>
			<li>WordPress 投票系統 - 預算 3 萬元</li>
			<li>Joomla 網站設計整合 - 預算 4 萬元</li>
			<li>網頁文案 - 請報價</li>
		</ul>
	</div>
</body>

css

.abgne-news-scroll {
	border: 1px solid #f39;
	width: 320px;
	height: 120px;
	overflow: hidden;
	position: relative;
}
.abgne-news-scroll li {
	background: url(arr.jpg) no-repeat 5px 10px;
	padding: 5px 0 5px 19px;
}
$(function(){
	// 先取得 .abgne-news-scroll ul 及 li 的高度
	// 並設定訊息移動, 淡入及輪播時間
  $('.abgne-news-scroll ul li:not(:first)').hide();
	var $news = $('.abgne-news-scroll ul'), 
		scrollHeight = $news.find('li').outerHeight(true), 
		scrollSpeed = 600, fadeInSpeed = 600, 
		timer, speed = 3000;
 
	// 用來控制輪播用
	function newsScroll(){
		// 先把 .abgne-news-scroll ul 往下移
		$news.animate({
			top: scrollHeight + 'px'
		}, scrollSpeed, function(){
			// 當 .abgne-news-scroll ul 移動到定點後
			// 先找出最後一個 li
      $('.abgne-news-scroll ul li:not(:first)').hide();
			var $last = $news.find('li:first');
			// 複製一份並先隱藏起來
			// 接著把它加到 .abgne-news-scroll ul 中的第一個項目
			// 最後用淡入的方式顯示, 當顯示完後繼續輪播
			$last.clone().hide().appendTo($news).fadeIn(fadeInSpeed, function(){
				timer = setTimeout(newsScroll, speed);
			});
			// 馬上把 .abgne-news-scroll ul 第一個li 移到 buttom 等於 0 的位置
			$news.css('bottom', 0);
			// 把 $last 移除掉
			$last.remove();
		});
	}
 
	// 啟動輪播計時器
	timer = setTimeout(newsScroll, speed);
});
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
froce
iT邦大師 1 級 ‧ 2021-04-27 22:20:26
最佳解答
.abgne-news-scroll li {
  display: none;
}

css加這個就不會重複了。
要不然你newScroll那邊不要從第一項開始,從第二項開始。


改了一下,把寫死的部份拿出來
https://jsfiddle.net/etbyxg0j/

$(function(){
	
  const news = [
      "圖書管理系統 - 預算約 20 萬元xxxxxxxxxxxxxxxx",
      "WordPress 投票系統 - 預算 3 萬元",
      "Joomla 網站設計整合 - 預算 4 萬元",
      "網頁文案 - 請報價"
  ]
  const $news = $('.abgne-news-scroll>ul')
  const fadeInTime = 600,
        fadeOutTime = 600,
        fadeDelay = 1500,
        interval = 3000
  
  let current = news[0]
  
  function startScroll(data, $elm, fadeInTime, fadeOutTime, fadeDelay){
  
    function _next(current){
      return data.length - 1 == data.indexOf(current)? data[0] : data[data.indexOf(current) + 1]
    }
    
    function show(){
      $elm.html(`<li>${current}</li>`)
      $elm.find('li')
        .fadeIn(fadeInTime)
        .delay(fadeDelay)
        .fadeOut(fadeOutTime)
      current = _next(current)
    }
    show()
  }
  
  setInterval(function(){startScroll(news, $news, fadeInTime, fadeOutTime, fadeDelay)}, interval)
	
});

我是會這樣寫啦。

mayyola iT邦研究生 1 級 ‧ 2021-04-27 22:22:28 檢舉

好的,我再測試看看,我剛剛又測試如下,結果好了@@若有別的寫法也歡迎~
https://jsfiddle.net/fsab3pc9/

0
Samuel
iT邦好手 1 級 ‧ 2021-04-28 00:28:50

以前都用marquee後來改用css animation了
https://coolmandiary.blogspot.com/2021/03/marqueecss.html

0

提示一下:

多個index值。利用JQUERY的EQ取位。
你的程式會省很多。

而一般來說,第一個因為是直接顯示了。
所以理論上來說,第一次輪因該是 1 -> 2
所以第一次要動態的資料不會是第1個。

以上提示完成,思考一下改一下程式碼。我就不PO了

froce iT邦大師 1 級 ‧ 2021-04-28 08:12:02 檢舉

應該說本來第一個就已經顯示了,沒把他設成 display:none,然後又從第一個開始輪,當然會2次。

其實我連他的code就懶得看,答案就給他了,後面的code才是想說寫出來玩的。XD

不過這種我是建議不要把資料放在html啦,以後要動態新增會蠻麻煩的。
放在程式區塊你真的要還可以ajax取回來,多好改。

mayyola iT邦研究生 1 級 ‧ 2021-04-28 08:55:12 檢舉

我把ul的css,不過會字超過就會遮住,我再參考一下f大的 謝謝
height: 50px;
overflow: hidden;

我要發表回答

立即登入回答