js實(shí)現(xiàn)圖片無(wú)縫滾動(dòng)特效
首先,無(wú)縫滾動(dòng)的第一個(gè)重點(diǎn)就是——?jiǎng)?。關(guān)于怎么讓頁(yè)面的元素節(jié)點(diǎn)動(dòng)起來(lái),這就得學(xué)明白關(guān)于JavaScript中定時(shí)器的相關(guān)知識(shí)。
JS中的創(chuàng)建定時(shí)器的方法包括兩種:setTimeout和setInterval。首先它們接收的參數(shù)相同:第一個(gè)參數(shù)是一個(gè)函數(shù),用于定時(shí)器執(zhí)行,第二個(gè)參數(shù)是一個(gè)數(shù)字,代表過(guò)多少毫秒之后定時(shí)器執(zhí)行函數(shù)。它們的不同在于:setTimeout 是在經(jīng)過(guò)指定的時(shí)間之后,只執(zhí)行一次函數(shù),而setInterval,則是每間隔指定時(shí)間,就執(zhí)行函數(shù)一次,說(shuō)簡(jiǎn)單點(diǎn)的話,就是setInterval是setTimeout的循環(huán)版。
關(guān)于定時(shí)器還有一個(gè)用法:消除定時(shí)器,方法同樣有兩種:clearTimeout 和 clearInterval,它們分別對(duì)應(yīng)不同類型的定時(shí)器。另外,它們都只接收一個(gè)參數(shù),這個(gè)參數(shù)是定時(shí)器返回的一個(gè)值(我在chrome中調(diào)試發(fā)現(xiàn)這個(gè)返回值都是數(shù)字),用于指定消除那個(gè)定時(shí)器。
定時(shí)器的知識(shí)掌握之后,就開(kāi)始分析怎樣使用定時(shí)器讓元素動(dòng)起來(lái)。其實(shí)這個(gè)很簡(jiǎn)單,就是類似電影的原理一樣,讓元素在很短的時(shí)間內(nèi)發(fā)生連續(xù)的位移,我們看起來(lái)的話這個(gè)元素就想是在不停地運(yùn)動(dòng)啦。關(guān)于怎么讓元素產(chǎn)生位移,通過(guò)JS修改元素的樣式就可以實(shí)現(xiàn),例如
oUl.style.left = oUl.offsetLeft + speed + 'px';
上面的代碼中speed就是每次產(chǎn)生的位移。關(guān)于speed使用還挺有意思的:我們可以修改speed的正負(fù)值來(lái)修改滾動(dòng)的方向。
另外,關(guān)于元素的屬性 offsetLeft 我個(gè)人認(rèn)為需要注意兩點(diǎn):offsetLeft的值由它自己通過(guò)定位的left和自己設(shè)定的margin的和、offsetLeft它是相對(duì)于它的包含層的距離(offsetTop類似)。當(dāng)然這都是我自己的理解,肯定不是很準(zhǔn)確,這個(gè)坑記著,下次專門解決它。
讓元素動(dòng)起來(lái)的原理基本就是這樣,下面開(kāi)始分析這個(gè)無(wú)縫滾動(dòng)展示圖片的實(shí)現(xiàn)方法,我舉得例子都是向左滾動(dòng)的,向右的原理一樣,代碼中有提到:
首先假設(shè)需要循環(huán)滾動(dòng)的圖片只有4張,為了滿足圖片滾動(dòng)起來(lái)有循環(huán)的要求,就需要把圖片如圖(1)這樣做:

這樣當(dāng)?shù)谝粡垐D片1滾動(dòng)出邊框時(shí),后面的圖片1則出現(xiàn)在圖片4的后面,這樣效果看起來(lái)就和循環(huán)一樣~
當(dāng)圖片滾動(dòng)到下面的這種情況時(shí):

繼續(xù)滾動(dòng)就會(huì)導(dǎo)致圖片后面出現(xiàn)空白,就不是循環(huán)滾動(dòng)的效果了,其實(shí)這點(diǎn)也是程序的關(guān)鍵所在,每當(dāng)圖片滾動(dòng)到圖(2)這種情況時(shí),就應(yīng)該讓圖片重新回到圖(1)那種狀態(tài)再繼續(xù)滾動(dòng),這樣的話就形成了無(wú)縫循環(huán)滾動(dòng)的效果。
另外拓展一下程序?qū)懥耸髽?biāo)移入圖片停止?jié)L動(dòng),移出繼續(xù)滾動(dòng)的效果,就是利用消除定時(shí)器的方法實(shí)現(xiàn)的,代碼很簡(jiǎn)單就不介紹了。還有我為了樣式好看一點(diǎn),把圖片都設(shè)置為160*120的尺寸使用的,大家運(yùn)行代碼是需要自己準(zhǔn)備圖片。
代碼如下:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
#div1{
width: 640px;
height: 120px;
margin: 100px auto;
background-color: #646464;
position: relative;
overflow: hidden;
}
#div1 ul{
position:absolute;
left:0;
top:0;
overflow: hidden;
background-color: #3b7796;
}
#div1 ul li{
float: left;
width: 160px;
height: 120px;
list-style: none;
}
</style>
<script>
window.onload = function(){
var oDiv = document.getElementById('div1');
var oUl = document.getElementById('ul1');
var speed = 2;//初始化速度
oUl.innerHTML += oUl.innerHTML;//圖片內(nèi)容*2-----參考圖(2)
var oLi= document.getElementsByTagName('li');
oUl.style.width = oLi.length*160+'px';//設(shè)置ul的寬度使圖片可以放下
var oBtn1 = document.getElementById('btn1');
var oBtn2 = document.getElementById('btn2');
function move(){
if(oUl.offsetLeft<-(oUl.offsetWidth/2)){//向左滾動(dòng),當(dāng)靠左的圖4移出邊框時(shí)
oUl.style.left = 0;
}
if(oUl.offsetLeft > 0){//向右滾動(dòng),當(dāng)靠右的圖1移出邊框時(shí)
oUl.style.left = -(oUl.offsetWidth/2)+'px';
}
oUl.style.left = oUl.offsetLeft + speed + 'px';
}
oBtn1.addEventListener('click',function(){
speed = -2;
},false);
oBtn2.addEventListener('click',function(){
speed = 2;
},false);
var timer = setInterval(move,30);//全局變量 ,保存返回的定時(shí)器
oDiv.addEventListener('mouseout', function () {
timer = setInterval(move,30);
},false);
oDiv.addEventListener('mousemove', function () {
clearInterval(timer);//鼠標(biāo)移入清除定時(shí)器
},false);
}
</script>
</head>
<body>
<input id="btn1" type="button" value="向左">
<input id="btn2" type="button" value="向右">
<div id="div1">
<ul id="ul1">
<li><img src="img/img_1.jpg"></li>
<li><img src="img/img_2.jpg"></li>
<li><img src="img/img_3.jpg"></li>
<li><img src="img/img_4.jpg"></li>
</ul>
</div>
</body>
</html>
以上就是js實(shí)現(xiàn)無(wú)縫滾動(dòng)特效的詳細(xì)代碼,希望對(duì)大家的學(xué)習(xí)有所幫助。
- 徹底搞懂JS無(wú)縫滾動(dòng)代碼
- div+css+js實(shí)現(xiàn)無(wú)縫滾動(dòng)類似marquee無(wú)縫滾動(dòng)兼容firefox
- js 實(shí)現(xiàn)無(wú)縫滾動(dòng) 兼容IE和FF
- js向上無(wú)縫滾動(dòng),網(wǎng)站公告效果 具體代碼
- jcarousellite.js 基于Jquery的圖片無(wú)縫滾動(dòng)插件
- javascript實(shí)現(xiàn)的左右無(wú)縫滾動(dòng)效果
- js實(shí)現(xiàn)可控制左右方向的無(wú)縫滾動(dòng)效果
- js實(shí)現(xiàn)文字列表無(wú)縫滾動(dòng)效果
- JQuery插件Marquee.js實(shí)現(xiàn)無(wú)縫滾動(dòng)效果
- JavaScript定時(shí)器實(shí)現(xiàn)無(wú)縫滾動(dòng)圖片
相關(guān)文章
js數(shù)組實(shí)現(xiàn)權(quán)重概率分配
今天寫了一個(gè)js控制頁(yè)面輪播的功能,如果僅僅使用隊(duì)列很簡(jiǎn)單,但是考慮到為每一個(gè)頁(yè)面分配權(quán)重的是否變的異常復(fù)雜,使用switch和if else也無(wú)法解決,于是想到使用js數(shù)組實(shí)現(xiàn)2017-09-09
TypeScript利用TS封裝Axios實(shí)戰(zhàn)
這篇文章主要介紹了TypeScript利用TS封裝Axios實(shí)戰(zhàn),TypeScript封裝一遍Axios,能進(jìn)一步鞏固TypeScript的基礎(chǔ)知識(shí),需要的小伙伴可以參考一下2022-06-06
JavaScript使用prototype原型實(shí)現(xiàn)的封裝繼承多態(tài)示例
這篇文章主要介紹了JavaScript使用prototype原型實(shí)現(xiàn)的封裝繼承多態(tài),涉及javascript prototype與面向?qū)ο蟪绦蛟O(shè)計(jì)相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
javascript實(shí)現(xiàn)根據(jù)函數(shù)名稱字符串動(dòng)態(tài)執(zhí)行函數(shù)的方法示例
這篇文章主要介紹了javascript實(shí)現(xiàn)根據(jù)函數(shù)名稱字符串動(dòng)態(tài)執(zhí)行函數(shù)的方法,結(jié)合實(shí)例形式分析了JS函數(shù)名的判斷及函數(shù)動(dòng)態(tài)調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2016-12-12
使用Axios結(jié)合Typescript二次封裝完整詳細(xì)場(chǎng)景使用案例
本文詳細(xì)介紹了如何使用TypeScript對(duì)Axios進(jìn)行二次封裝,以提高HTTP請(qǐng)求的統(tǒng)一管理和可維護(hù)性,通過(guò)創(chuàng)建Axios實(shí)例、封裝請(qǐng)求和響應(yīng)處理、錯(cuò)誤處理以及創(chuàng)建特定的API服務(wù),可以實(shí)現(xiàn)更加一致和方便的API調(diào)用,需要的朋友可以參考下2024-11-11
Javascript中Microtask和Macrotask鮮為人知的知識(shí)點(diǎn)
這篇文章主要為大家介紹了Javascript中Microtask和Macrotask鮮為人知的知識(shí)點(diǎn)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04

