展現界面 & github源碼javascript
// 這裏咱們先添加小圓點,讓頁面顯示完整,之所用js添加小圓點,
是由於小圓點的數量應該由圖片張數決定的。
for(let i = 0; i < len;i++){
var a_li = document.createElement('li');//建立li元素節點
a_li.className = 'quiet';//給li添加類名quiet
litCir_ul.appendChild(a_li);
}
複製代碼
/*獲取HTML中的對象*/
var parent = document.getElementById("parent");
var img_ul = document.getElementById("img_ul");
var litCir_ul = document.getElementById("litCir_ul");
var buttons = document.getElementById("buttons");
var cLis =litCir_ul.children; //children 屬性返回元素的子元素的集合
//定義一些變量
var len = img_ul.children.length; //圖片張數
var width = parent.offsetWidth; //每張圖片的寬度
var rate = 15; //一張圖片的切換速度, 單位爲px
var times = 1; //切換速度的倍率
var gap = 2000; //自動切換間隙, 單位爲毫秒
var timer = null; //初始化一個定時器
var picN = 0; //當前顯示的圖片下標
var cirN = 0; //當前顯示圖片的小圓點下標
var temp;
複製代碼
function Roll(distance){ //參數distance:滾動的目標點(必爲圖片寬度的倍數)
clearInterval(img_ul.timer); //每次運行該函數必須清除以前的定時器!
var speed = img_ul.offsetLeft < distance ? rate : (0-rate); //判斷圖片移動的方向 此處用了三元運算符 ? 前面的不等式成立時爲rate,不成立時爲0-rete
// console.log(speed)
img_ul.timer = setInterval(function(){ //設置定時器,每隔10毫秒,調用一次該匿名函數
img_ul.style.left = img_ul.offsetLeft + speed + "px"; //每一次調用滾動到的地方 (速度爲 speed px/10 ms) offsetLeft爲元素邊框外側到父元素邊框內側的距離
var leave = distance - img_ul.offsetLeft; //距目標點剩餘的px值
/*接近目標點時的處理,滾動接近目標時直接到達, 避免rate值設置不當時不能完整顯示圖片*/
if (Math.abs(leave) <= Math.abs(speed)) {
clearInterval(img_ul.timer);
img_ul.style.left = distance + "px";
}
},10);
}
複製代碼
img_ul.appendChild(img_ul.children[0].cloneNode(true));//克隆第一張圖片至列表尾部
複製代碼
function autoRun(){
picN++
cirN++
//若是輪播完克隆項應該輪播回第二張照片上,由於克隆項和第一張圖片同樣
if(picN > len) {
img_ul.style.left = 0;//改變left至真正的第一項處,這個過程是時間太快過短因此能夠忽略不計而後馬上
picN = 1; //從第二張開始顯示
}
// 自動輪播,當圖片爲第一張時應該自動到第二張上去,因此要傳入第二張的picN值,依次類推
Roll(-picN*width)
//判斷是否到了最後一個圓點,當圓點到了最後一個時,應該變回第一個點進行輪播
if (cirN > len - 1) {
cirN = 0;
}
for(var i = 0; i < len;i++) {
cLis[i].className = 'quiet';//讓全部圓點背景色變爲默認色
}
cLis[cirN].className = 'active';
}
複製代碼
開始自動滾動:
timer = setInterval(autoRun, gap); //定時器
複製代碼
for(let j = 0;j < len ;j++){
cLis[j].index = j;//給每一個圓點一個索引值
cLis[j].onmouseover = function() {
for(var k = 0; k < len;k++) {
cLis[k].className = 'quiet';//讓全部圓點背景色變爲默認色
}
this.className = 'active';
temp = cirN;
picN = cirN = this.index;
times = Math.abs(this.index - temp);//距離上個小圓點的距離
rate = rate*times;//根據距離改變切換速率
Roll(-this.index * width);
rate = 15;
}
}
複製代碼
//觸及輪播圖區域,清除定時器
parent.onmouseover = function(){
clearInterval(timer);
buttons.style.display = 'block';
}//離開該區域時,從新開始定時器的自動輪播
parent.onmouseout = function(){
buttons.style.display = 'none';
timer = setInterval(autoRun, gap);
}
複製代碼
//給左邊按鈕添加點擊事件
buttons.children[0].onclick = function() {
picN--;
cirN--;
if(picN < 0){
img_ul.style.left = -len*width + 'px';
picN = len - 1;
}
Roll(-picN*width);
if(cirN < 0){
cirN = len - 1;
}
for(var i = 0; i < len; i++) {
cLis[i].className = 'quiet';
}
cLis[cirN].className = 'active';
}
//給右邊按鈕添加點擊事件
buttons.children[1].onclick = autoRun;
//自動播放就是間隔必定時間不斷調用函數「下一張」的過程,因此這裏的
按鈕right下一張的實現就是上面的autoRun函數。
複製代碼
原本想寫兩種方式實現輪播圖的,因爲第一次在掘金社區裏寫文章,沒有控制好字數,感受寫的太長太多了,因此這裏先寫第一種原生js方式的實現輪播圖。若是想了解第二種原生js是如何實現輪播圖的話,我會繼續更新的哦!請持續關注,這也是筆者的第一篇文章,若是各位看官喜歡請點贊收藏,這對筆者是莫大的鼓勵😊。css