展現界面 & github源碼css
<div class="box-cirs-imgs">
<div class="box-imgs">
<ul class="imgs">
<li><img src="./images/App-4-D.jpg"></li>
<li><img src="./images/app-2-D.jpg"></li>
<li><img src="./images/App-3-D.jpg"></li>
<li><img src="./images/App-1-D.jpg"></li>
</ul>
</div>
<ul class="box-cirs"></ul>
</div>
複製代碼
.box-cirs-imgs {
position: relative;
}
.box-imgs {
display: inline-block;
background-color: rgb(165, 165, 165);
}
.imgs li {
width: 100%;
float: left;
}
img {
width: 100%;
height: 100%;
}
.ani {
animation: ani_img .5s ease 1; //給當前顯示的圖片添加一個類名,讓輪播效果更酷炫
}
@keyframes ani_img{//動畫腳本
0%{
opacity: 0;
}
50%{
opacity: 0.5;
}
100%{
opacity: 1;
}
}
.box-cirs {
position: absolute;
bottom: 10px;
right: 50%;
transform: translateX(50%);
}
.box-cirs li {
display: inline-block;
width: 8px;
height: 8px;
margin-right: 5px;
border-radius: 50%;
cursor: pointer;//改變鼠標觸及區域時光標樣式
}
.active {
background-color: #00bebe;//高亮的指示點
}
.quiet{
background-color: #00263c;//指示點的默認樣式
}
複製代碼
//這裏咱們先添加小圓點,讓頁面顯示完整,之所用js添加小圓點,
是由於小圓點的數量應該由圖片張數決定的。
for (var i = 0; i < len; i++) {
var c_li = document.createElement('li');
jsCirs_ul.appendChild(c_li);
}
複製代碼
/*獲取HTML中的對象*/
const jsImgs_box = document.querySelector('.box-imgs');
const jsImgs_ul = document.querySelector('.imgs');
const jsImg = jsImgs_ul.children;
const jsCirs_ul = document.querySelector('.box-cirs');
const jsCir = jsCirs_ul.children;
//定義一些變量
var len = jsImg.length;//圖片的張數
var timer = null; //初始化一個定時器
var picN = 0; //當前顯示的圖片下標
var cirN = 0; //當前顯示圖片的小圓點下標
hold = false; //初始化按下時的狀態,開關變量
let stratPointX = 0; //初始化按下時x軸座標
let endsetX = 0; //初始化按鍵離開時x軸座標
複製代碼
//定義一個函數,經過傳進來的要顯示的圖片的下標來控制顯示,會在autoRun函數中調用
function Roll(index, num) {
for (var i = 0; i < len; i++) {
jsImg[i].style.display = 'none';
jsCir[i].className = 'quiet';
jsImg[i].className = '';
}
jsImg[index].style.display = 'block';
jsCir[num].className = 'active';
jsImg[index].className = 'ani';
}
複製代碼
//設置自動播放函數autoRun(),只要傳入當前的圖片和圓點的索引值就會今後處開始自動輪播
function autoRun(pic, cir) {
// 當調用autoRun()函數,傳入的實參不是pic = 0,cir = 0;時,執行下面語句
if (pic != 0) {//當調用autoRun()傳進來的實參不爲0的時候的狀況
//當點擊最後一個圓點時,要先顯示最後一張圖片,再從第一張從新開始輪播
if (pic === len - 1) {
Roll(pic, cir);
pic = 0;
cir = 0;
time(pic, cir);//封裝一個time()函數,減小代碼複用
} else {//當點擊第2、三個圓點時,顯示當前點擊圓點的圖片和高亮,再進行循環
Roll(pic, cir);
++pic;
++cir;
time(pic, cir);
}
} else {//當頁面加載時,預先定義好的pic = 0,cir = 0實參會傳進來,執行下列語句,會自動輪播
Roll(pic, cir);//先顯示傳入實參的圖片和圓點的高亮
++pic
++cir
time(pic, cir);
}
}
複製代碼
//封裝自動播放函數autoRun裏的定時器內參數遞增,
function time(pi, ci) {
timer = setInterval(function () {
Roll(pi, ci);
pi++;
ci++;
if (pi > len - 1) {//當第四張圖片顯現時要回到第一張圖片輪播
pi = 0;
}
if (ci > len - 1) {
ci = 0;
}
}, 7200)
}
複製代碼
window.onload = autoRun(picN, cirN);
複製代碼
//用for循環給每一個圓點綁定一個點擊事件
for (var j = 0; j < len; j++) {
jsCir[j].index = j;//給每一個圓點一個索引值
//當點擊小圓點是高亮
jsCir[j].onclick = function () {
clearInterval(timer)//每次運行該函數必須清除以前的定時器!
var i = this.index; //將當前圓點的index索引值傳給i
autoRun(i, this.index) //傳入實參i,this.index,e,調用自動輪播函數autoRun()
}
}
複製代碼
// 鼠標摁下時執行的事件
jsImgs_box.onmousedown = function (e) {
e.preventDefault();
//注意:preventDefault()阻止輪播圖圖片被拖拽的默認行爲
hold = true;
clearInterval(timer);
// console.log('你點擊了鼠標');
stratPointX = e.clientX;
}
//其實這裏還能夠添加一個鼠標移動事件onmousemove,各位看官能夠添加試試。
//放開鼠標執行的事件
jsImgs_box.onmouseup = function (e) {
// console.log('你放開了鼠標');
endsetX = e.clientX;
if (hold) {
for (var j = 0; j < len; j++) {
jsImg[j].index = j;
}
if ((stratPointX - endsetX) > 400) {
moveleft();//封裝了左移函數
} else if ((endsetX - stratPointX) > 400) {
moveright();//封裝了右移函數
} else {// bug 修復 若是點擊了會清除定時器,這裏要從新開啓一下
n = document.querySelector('.ani').index
autoRun(n, n);
}
hold = false;
}
}
// 圖片左移函數
function moveleft() {
var i = document.querySelector('.ani').index - 1;
if (i < 0) {//bug處理,若是當前顯現的圖片是第一張時,移動後應該跳轉到第四張圖片
i = 3;
}
autoRun(i, i);
}
//圖片右移函數
function moveright() {
var i = document.querySelector('.ani').index + 1;
if (i > 3) {//bug處理,若是當前顯現的圖片是第四張時,移動後應該跳轉到第一張圖片
i = 0;
}
autoRun(i, i);
}
複製代碼
一直說要寫第二種原生JS方法實現輪播圖,如今終於完成了,總的來講輪播圖並不難實現,可是若是要寫卻有不少方法,用原生js、純css、RecyclerView、還可使用jquery插件...總之方法不少,可是若是是像我這樣的前端入門新手建議仍是能夠用原生JS手寫一個輪播圖,這樣便可以鍛鍊一下js,還能夠掌握一個網頁經常使用的組件手寫方法,一石二鳥,何樂而不爲呢?好啦,這篇文章到這裏已經寫完了,若是各位大佬發現個人方法還有缺陷,歡迎樓下評論告訴我,畢竟對於我這樣的新手來講,須要不停的發現問題!不停的改進!才能成長成爲像各位看官同樣的大牛!html