原生JS運(yùn)動(dòng)實(shí)現(xiàn)輪播圖
原生JS運(yùn)動(dòng)實(shí)現(xiàn)輪播圖
**基本原理:**通過控制包含n張圖片的ul的left值來實(shí)現(xiàn)圖片自動(dòng)運(yùn)動(dòng)的效果,其中列表中l(wèi)i元素的個(gè)數(shù)為n,第一個(gè)li和最后一個(gè)li里存放的圖片應(yīng)為同一張圖片,當(dāng)圖片運(yùn)動(dòng)到最后一張時(shí),將ul的left值設(shè)為0,即可達(dá)到圖片無線輪播的效果。
運(yùn)動(dòng)函數(shù)的實(shí)現(xiàn)
函數(shù)需傳入元素(即需要參與運(yùn)動(dòng)的元素)、目標(biāo)值(以對(duì)象的形式呈現(xiàn),如{left: 300})、callback(回調(diào)函數(shù))。
//多物體多值運(yùn)動(dòng)+回調(diào)機(jī)制
function startMove(dom, attrObj, callback) {
var key = true;
var iSpeed = null,
iCur = null;
clearInterval(dom.timer);
if (key) {
dom.timer = setInterval(function() {
//bStop用來判斷是否開始執(zhí)行回調(diào)函數(shù)
var bStop = true;
//判斷傳入目標(biāo)值中的“鍵”類型是否為opacity
for (var attr in attrObj) {
//若要改變的樣式為opacity,則將元素的opacity擴(kuò)大100被進(jìn)行操作
if (attr === 'opacity') {
iCur = parseFloat(getStyle(dom, attr)) * 100;
} else {
iCur = parseInt(getStyle(dom, attr));
}
//運(yùn)動(dòng)速度設(shè)為目標(biāo)值減去當(dāng)前值的一半,即當(dāng)前狀態(tài)離目標(biāo)值越接近,運(yùn)動(dòng)速度越小
iSpeed = (attrObj[attr] - iCur) / 2;
//對(duì)速度進(jìn)行取整
iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
if (attr === 'opacity') {
dom.style.opacity = (iCur + iSpeed) / 100;
} else {
dom.style[attr] = iCur + iSpeed + 'px';
}
if (iCur !== attrObj[attr]) {
bStop = false;
}
}
//當(dāng)bStop為true時(shí),元素的所有樣式均已達(dá)到目標(biāo)值,清理定時(shí)器并執(zhí)行回調(diào)函數(shù)
if (bStop) {
clearInterval(dom.timer);
typeof callback == 'function' && callback();
}
}, 30)
}
if (!key) {
}
}
//用來獲取元素實(shí)時(shí)的樣式值
function getStyle(elem, prop){
if (window.getComputedStyle){
return window.getComputedStyle(elem, null)[prop];
}
}
HTML部分
HTML中包含一個(gè)div,用來顯示當(dāng)前要播放的圖片,該div中又包含一個(gè)ul(用來存放所有包含圖片的li)、三個(gè)div(其中兩個(gè)充當(dāng)圖片左右切換的按鈕,第三個(gè)存放圖片索引點(diǎn),通過點(diǎn)擊索引也可切換到要查看的圖片),代碼如下:
<div class="wrapper"> <ul class="sliderPage"> <li> <img src="./image/dog/阿拉斯加.jpeg"/> </li> <li> <img src="./image/dog/比熊.jpeg"/> </li> <li> <img src="./image/dog/邊牧.jpeg"/> </li> <li> <img src="./image/dog/柯基.jpeg"/> </li> <li> <img src="./image/dog/阿拉斯加.jpeg"/> </li> </ul> <div class="btn leftBtn"><</div> <div class="btn rightBtn">></div> <div class="sliderIndex"> <span class="active"></span> <span></span> <span></span> <span></span> </div> </div>
CSS代碼
此處采用的為內(nèi)聯(lián)樣式表
<style>
*{
margin: 0;
padding: 0;
list-style: none;
}
.wrapper{
position: relative;
margin: 100px auto 0;
width: 600px;
height: 360px;
overflow: hidden;
}
.wrapper .sliderPage{
position: absolute;
left: 0;
width: 3000px;
height: 360px;
}
.wrapper .sliderPage li{
width: 600px;
height: 360px;
float: left;
}
.wrapper .sliderPage li img{
width: 100%;
height: 100%;
}
.btn{
position: absolute;
top: 50%;
width: 20px;
height: 20px;
color: #fff;
text-align: center;
line-height: 20px;
background-color: #000;
opacity: 0.2;
cursor: pointer;
}
.leftBtn{
left: 5px;
}
.rightBtn{
right: 5px;
}
.wrapper:hover .btn{
opacity: 0.8;
}
.sliderIndex{
position: absolute;
width: 100%;
bottom: 10px;
cursor: pointer;
text-align: center;
}
span{
width: 8px;
height: 8px;
background-color: #cccccc;
border-radius: 50%;
display: inline-block;
margin-right: 5px;
}
.active{
background-color: orange;
}
</style>
圖片自動(dòng)運(yùn)動(dòng)及點(diǎn)擊運(yùn)動(dòng)事件綁定
要點(diǎn):
1、當(dāng)圖片運(yùn)動(dòng)到最后一張時(shí)(顯示圖片為第一張圖片),將ul的left值設(shè)為0即可實(shí)現(xiàn)無限輪播;
2、圖片每次運(yùn)動(dòng)的值為li的寬度;
3、圖片的運(yùn)動(dòng)需要一定的時(shí)間,因此在圖片運(yùn)動(dòng)過程中應(yīng)禁止產(chǎn)生其它定時(shí)器,否則會(huì)造成運(yùn)動(dòng)尺寸混亂而導(dǎo)致圖片輪播出現(xiàn)問題,這里用lock來進(jìn)行實(shí)現(xiàn),在ul運(yùn)動(dòng)過程中將lock值設(shè)為false,運(yùn)動(dòng)結(jié)束后又將lock值設(shè)為true;
4、通過index值來實(shí)現(xiàn)索引顯示圖片功能,圖片輪播過程中,index初始值為0,當(dāng)圖片向右輪播時(shí)index值加1,圖片向左輪播時(shí),index值減1,index值為0時(shí),若讓圖片向左輪播,則將index值設(shè)為n(li個(gè)數(shù))并進(jìn)行輪播,而當(dāng)index值為3且圖片向右輪播時(shí),在ul運(yùn)動(dòng)完成后將index值設(shè)為0;
var timer = null;
var sliderPage = document.getElementsByTagName('ul')[0];
var moveWidth = sliderPage.children[0].offsetWidth;
var num = sliderPage.children.length - 1;
var leftBtn = document.getElementsByClassName('leftBtn')[0];
var rightBtn = document.getElementsByClassName('rightBtn')[0];
var lock = true;
var index = 0;
var indexArray = document.getElementsByClassName('sliderIndex')[0].getElementsByTagName('span');
//索引切換
for (var i = 0; i < indexArray.length; i ++){
(function(myindex){
indexArray[myindex].onclick = function(){
lock = false;
clearTimeout(timer);
index = myindex;
changeIndex(index);
startMove(sliderPage, {left: -index * moveWidth}, function(){
lock = true;
timer = setTimeout(autoMove, 3000);
})
}
}(i))
}
//圖片運(yùn)動(dòng)過程中改變index點(diǎn)的樣式
function changeIndex(index){
for (var i = 0; i < indexArray.length; i++){
indexArray[i].className = '';
}
indexArray[index].className = 'active';
}
timer = setTimeout(autoMove, 3000);
//向左翻
leftBtn.onclick = function (){
autoMove('right->left');
}
//向右翻
rightBtn.onclick = function (){
autoMove('left->right');
}
//direction
//默認(rèn)輪播方向 'left->right' / undefined
//點(diǎn)擊left按鈕 'right->left'
function autoMove(direction){
clearTimeout(timer);
if (lock){
lock = false;
if (!direction || direction === 'left->right'){
index++;
startMove(sliderPage, {left: sliderPage.offsetLeft - moveWidth}, function(){
if (sliderPage.offsetLeft === - num * moveWidth){
index = 0;
sliderPage.style.left = '0px';
}
timer = setTimeout(autoMove, 3000);
lock = true;
changeIndex(index);
});
}else if(direction === 'right->left'){
if (sliderPage.offsetLeft === 0){
index = num;
sliderPage.style.left = - num * moveWidth + 'px';
}
index--;
startMove(sliderPage, {left: sliderPage.offsetLeft + moveWidth}, function () {
timer = setTimeout(autoMove, 3000);
lock = true;
changeIndex(index);
})
}
}
}
以上即為通過原生JS運(yùn)動(dòng)所實(shí)現(xiàn)的圖片輪播。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js實(shí)現(xiàn)輪播圖的完整代碼
- 原生js實(shí)現(xiàn)輪播圖的示例代碼
- js實(shí)現(xiàn)支持手機(jī)滑動(dòng)切換的輪播圖片效果實(shí)例
- js實(shí)現(xiàn)點(diǎn)擊左右按鈕輪播圖片效果實(shí)例
- JS輪播圖實(shí)現(xiàn)簡單代碼
- JS實(shí)現(xiàn)左右無縫輪播圖代碼
- JS實(shí)現(xiàn)自動(dòng)輪播圖效果(自適應(yīng)屏幕寬度+手機(jī)觸屏滑動(dòng))
- 原生js實(shí)現(xiàn)無限循環(huán)輪播圖效果
- 使用html+js+css 實(shí)現(xiàn)頁面輪播圖效果(實(shí)例講解)
- 基于vue.js輪播組件vue-awesome-swiper實(shí)現(xiàn)輪播圖
相關(guān)文章
JavaScript將字符串轉(zhuǎn)換為整數(shù)的方法
這篇文章主要介紹了JavaScript將字符串轉(zhuǎn)換為整數(shù)的方法,涉及javascript中parseInt函數(shù)的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
JavaScript實(shí)現(xiàn)頁面無操作倒計(jì)時(shí)退出
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)頁面無操作倒計(jì)時(shí)退出,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
ExtJS實(shí)現(xiàn)文件下載的方法實(shí)例
這篇文章介紹了ExtJS實(shí)現(xiàn)文件下載的方法實(shí)例,有需要的朋友可以參考一下2013-11-11
JS的鼠標(biāo)監(jiān)聽mouseup鼠標(biāo)抬起失效原因及解決
這篇文章主要為大家介紹了JS的鼠標(biāo)監(jiān)聽mouseup鼠標(biāo)抬起失效原因及解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
javascript使用輸出語句實(shí)現(xiàn)網(wǎng)頁特效代碼
這篇文章主要介紹javascript使用輸出語句實(shí)現(xiàn)網(wǎng)頁特效,有需要的朋友可以參考下2015-08-08
多個(gè)表單中如何獲得這個(gè)文件上傳的網(wǎng)址實(shí)現(xiàn)js代碼
假設(shè)一個(gè)網(wǎng)頁里有多個(gè)表單,其中一個(gè)表單里有文件上傳,問題是如何獲得這個(gè)文件上傳的網(wǎng)址呢,接下來為大家介紹下實(shí)現(xiàn)的js代碼,感興趣的朋友可以參考下哈,希望可以幫助到你2013-03-03
JS實(shí)現(xiàn)顏色梯度與漸變效果完整實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)顏色梯度與漸變效果,結(jié)合完整實(shí)例形式分析了js顏色漸變所涉及的數(shù)學(xué)運(yùn)算與頁面樣式動(dòng)態(tài)操作相關(guān)技巧,需要的朋友可以參考下2016-12-12

