學習中的記錄,為了就是把復習當天學習的內容,不廢話了,先看結構:
為什么最后一個需要放入一個重復的圖片呢?后面js中會講到,圖片路徑可替換成自己的本地圖片
<div class="box" id="screen"> <ul> <li><img src="images/01.jpg" alt=""/></li> <li><img src="images/02.jpg" alt=""/></li> <li><img src="images/03.jpg" alt=""/></li> <li><img src="images/04.jpg" alt=""/></li> <li><img src="images/01.jpg" alt=""/></li> </ul> </div>
再把用css稍微修飾一下,不然沒法看,簡單的寫一下css
* { margin: 0; padding: 0; } ul { list-style: none; } img { vertical-align: top; } /*取消圖片底部3像素距離*/ .box { width: 300px; height: 200px; margin: 100px auto; background-color: pink; position: relative; /*這里為了看起來明顯一點就先不溢出隱藏了*/ /*overflow: hidden;*/ } .box ul li { float: left; } .box ul { width: 1500px; position: absolute; left: 0; top: 0; }
下面就開始寫js,寫js之前我們先把思路理一理,也就是實現的原理是什么?
首先需要我們要清楚,所謂的滾動,就是整個ul在box盒子中進行運動,所以我們只需要改變ul的left值就行。用定時器控制每次移動left值。
我們用個公式來分析圖片滾動的距離 leader(最終位置) = leader(開始位置) + step(每次滾動的距離); 這里第一個leader表示最終滾動到的位置,第二個表示ul開始距離的位置,step表示每次需要滾動多少個像素。
我們先獲取當前ul的位置,也就是距離左邊的位置 ul.offsetLeft;再設置每次滾動的距離,也就是step,因為left是往負方向移動,所以這兒的step是負值;接下來就是最終的位置leader。
然后我們進行判斷,如果最終的位置大於整個ul的寬度減去一個圖片的寬度時,這也就是為什么我們在結構中多放一個第一張圖,最多跑到假的第一張圖片的時候,立刻讓ul回到第一張的位置,然后設置ul滾動的最終位置。
否則,我們讓ul的left直接滾動一個step的距離,這樣雖然還會有一點點的抖動,但是不影響最終的用戶體驗。
//獲取頁面元素 var screen = document.getElementById("screen"); var ul = screen.children[0]; var timer = setInterval(function () { //leader = leader +step; var leader = ul.offsetLeft; var step = -1; leader += step; //最多跑到假的第一張顯示的時候 ,最多就是ul的寬減去一張圖的寬度 if (leader > -(ul.offsetWidth - ul.children[0].offsetWidth)) { //設置ul的left值,讓ul運動 ul.style.left = leader + "px"; } else { ul.style.left = step + "px"; } }, 17);
菜鳥一枚,多多指教!!!