摘要:效果實(shí)現(xiàn)原理純粹只使用了發(fā)現(xiàn)還是比較簡(jiǎn)單的,并不需要借助別的插件或類庫(kù)來(lái)實(shí)現(xiàn)核心是把圖片組合成一行序列,通過(guò)左右移動(dòng),以及父元素的來(lái)決定顯示的圖片簡(jiǎn)單畫(huà)了一下搭建基本界面這里主要分成三個(gè)部分,兩個(gè)向左向右的箭頭,圓點(diǎn)序列,圖片序列全
效果 實(shí)現(xiàn)原理
純粹只使用了html+css+JS
發(fā)現(xiàn)還是比較簡(jiǎn)單的,并不需要借助別的插件或類庫(kù)來(lái)實(shí)現(xiàn)
核心是把圖片組合成一行序列,通過(guò)左右移動(dòng),以及父元素的overflow:hidden來(lái)決定顯示的圖片
簡(jiǎn)單畫(huà)了一下:
這里主要分成三個(gè)部分,兩個(gè)向左向右的箭頭,圓點(diǎn)序列,圖片序列
全部運(yùn)用絕對(duì)定位對(duì)其布局,通過(guò)z-index確定他們的層疊關(guān)系
事先定義圖片的寬度高度作為css變量,方便各元素計(jì)算確定高度寬度
#box { position:relative; width:var(--imageWidth); height:var(--height); overflow: hidden; } #multi-circles { position:absolute; right:30px; bottom:10px; z-index: 2; } #multi-images { position:absolute; left:0; top:0; z-index: 1; width:calc(var(--imageWidth)*5); height:var(--height); } #arrow-right, #arrow-left { position: absolute; top:50%; margin-top:-20px; height:40px; z-index: 3; } #arrow-right { right:0; } #arrow-left { left:0; }確定圖片序號(hào)
為了實(shí)現(xiàn)輪播,我們得知道現(xiàn)在應(yīng)該要顯示哪一張圖片
在js中定義變量currentIndex,表示當(dāng)前顯示圖片的序號(hào),初始為0
當(dāng)點(diǎn)擊箭頭,或者鼠標(biāo)移動(dòng)到圓點(diǎn)上時(shí),只要改變序號(hào)就可以了
//先dom操作,獲取html組件 var arrowLeft = document.getElementById("arrow-left"); var arrowRight = document.getElementById("arrow-right"); var multiImages = document.getElementById("multi-images"); var circles = document.getElementById("multi-circles").getElementsByTagName("li"); var box=document.getElementById("box"); //為箭頭和圓點(diǎn)綁定事件 arrowLeft.addEventListener("click", preMove); arrowRight.addEventListener("click", nextMove); for (let i = 0; i < circles.length; i++) { circles[i].setAttribute("id", i); circles[i].addEventListener("mouseenter", overCircle); } //滑過(guò)圓點(diǎn) function overCircle() { currentIndex = parseInt(this.id); } //左箭頭 function preMove() { if (currentIndex != 0) { currentIndex--; } else { currentIndex = 4; } } //右箭頭 function nextMove() { if (currentIndex != 4) { currentIndex++; } else { currentIndex = 0; } }滑動(dòng)
現(xiàn)在我們已經(jīng)知道了現(xiàn)在應(yīng)該顯示哪一張圖片,那要怎么顯示呢?
上面我們已經(jīng)說(shuō)過(guò)了滑動(dòng)的原理是改變圖片序列的位置,左右移動(dòng)
加上父元素的overflow:hidden來(lái)只顯示對(duì)應(yīng)圖片
于是只要寫(xiě)這樣一個(gè)函數(shù),加到之前的事件里
function moveImage() { multiImages.style.left = -currentIndex * 400 + "px"; }
這樣是生硬的跳動(dòng),為了實(shí)現(xiàn)滑動(dòng)
網(wǎng)上有自己編寫(xiě)animate函數(shù),或者用jquery的函數(shù)的方法
這里我想到了直接用css3的transition屬性
只要在圖片序列的css類下加一句
#multi-images { transition: 1s; }
就可以實(shí)現(xiàn)自然的滑動(dòng)
圓點(diǎn)顏色我們希望當(dāng)顯示圖片的時(shí)候,對(duì)應(yīng)圓點(diǎn)的顏色可以變?yōu)榧t色
把現(xiàn)在的圓點(diǎn)變色很簡(jiǎn)單,只要currentIndex這一個(gè)變量就可以幫助實(shí)現(xiàn)
但還要把前一個(gè)顯示的圓點(diǎn)變回白色
誠(chéng)然,可以先用一個(gè)for循環(huán),把所有圓點(diǎn)都變成白色
但這樣就出現(xiàn)了多余的工作,我們明明只要變一個(gè)圓點(diǎn)的顏色就好
于是新定義一個(gè)變量preIndex,記錄前一個(gè)顯示的圖片
只要在先前綁定的事件函數(shù)中,第一句先令preIndex=currentIndex
就在圖片序號(hào)改變前保存到了前一個(gè)序號(hào)
然后在事件末尾添加這樣一個(gè)函數(shù)
function changeCircleColor(preIndex, currentIndex) { circles[preIndex].style.backgroundColor = "rgb(240, 240, 240)"; circles[currentIndex].style.backgroundColor = "rgb(245, 40, 40)"; }懸浮箭頭
我們希望當(dāng)鼠標(biāo)放到輪播圖上時(shí),左右箭頭才顯示
于是先讓箭頭的display為none
#arrow-right, #arrow-left { display:none; }
給box添加mouseover事件
box.addEventListener("mouseover",function() { arrowLeft.style.display="block"; arrowRight.style.display="block"; });
鼠標(biāo)放到箭頭上時(shí),鼠標(biāo)變成點(diǎn)擊樣式
#arrow-right, #arrow-left { cursor:pointer; }自動(dòng)輪播
目前為止已經(jīng)完成了基本的工作
不過(guò)我們還希望它可以自動(dòng)輪播
當(dāng)鼠標(biāo)放到輪播圖上時(shí),輪播暫停
于是我們建立一個(gè)定時(shí)器
當(dāng)鼠標(biāo)放到box上,清除定時(shí)器,離開(kāi)則重新建立
timer=setInterval(nextMove,2000); box.addEventListener("mouseover",function() { clearInterval(timer); }); box.addEventListener("mouseout",function() { timer=setInterval(nextMove,2000); });小插曲
在制作的時(shí)候,還遇到了一個(gè)很奇怪的bug
是鼠標(biāo)移動(dòng)到圓點(diǎn)的左邊一點(diǎn)點(diǎn)時(shí),也會(huì)觸發(fā)事件變色
后來(lái)?yè)Q了淺色背景,才發(fā)現(xiàn)是因?yàn)?li>的默認(rèn)樣式
圓點(diǎn)的左邊還有一個(gè)很小的圓點(diǎn)
去除這個(gè)樣式即可
ul, li { list-style: none; }完整代碼
代碼地址:https://github.com/ssevenk/Ca...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/109264.html
摘要:效果實(shí)現(xiàn)原理純粹只使用了發(fā)現(xiàn)還是比較簡(jiǎn)單的,并不需要借助別的插件或類庫(kù)來(lái)實(shí)現(xiàn)核心是把圖片組合成一行序列,通過(guò)左右移動(dòng),以及父元素的來(lái)決定顯示的圖片簡(jiǎn)單畫(huà)了一下搭建基本界面這里主要分成三個(gè)部分,兩個(gè)向左向右的箭頭,圓點(diǎn)序列,圖片序列全 效果 showImg(https://segmentfault.com/img/bVbqHhE?w=479&h=235); 實(shí)現(xiàn)原理 純粹只使用了html...
摘要:效果實(shí)現(xiàn)原理純粹只使用了發(fā)現(xiàn)還是比較簡(jiǎn)單的,并不需要借助別的插件或類庫(kù)來(lái)實(shí)現(xiàn)核心是把圖片組合成一行序列,通過(guò)左右移動(dòng),以及父元素的來(lái)決定顯示的圖片簡(jiǎn)單畫(huà)了一下搭建基本界面這里主要分成三個(gè)部分,兩個(gè)向左向右的箭頭,圓點(diǎn)序列,圖片序列全 效果 showImg(https://segmentfault.com/img/bVbqHhE?w=479&h=235); 實(shí)現(xiàn)原理 純粹只使用了html...
摘要:的代碼代碼代碼定義每次滑動(dòng)的距離定義當(dāng)前滑動(dòng)的索引位置,輪播圖的個(gè)數(shù)向左滑動(dòng)執(zhí)行的方法當(dāng)輪播圖滑動(dòng)最后一個(gè)位置時(shí),當(dāng)前輪播圖位置不變當(dāng)輪播不在最后一個(gè)位置時(shí),輪播圖位置變化方法向右滑動(dòng) Html的代碼: ...
摘要:的代碼代碼代碼定義每次滑動(dòng)的距離定義當(dāng)前滑動(dòng)的索引位置,輪播圖的個(gè)數(shù)向左滑動(dòng)執(zhí)行的方法當(dāng)輪播圖滑動(dòng)最后一個(gè)位置時(shí),當(dāng)前輪播圖位置不變當(dāng)輪播不在最后一個(gè)位置時(shí),輪播圖位置變化方法向右滑動(dòng) Html的代碼: ...
摘要:的代碼代碼代碼定義每次滑動(dòng)的距離定義當(dāng)前滑動(dòng)的索引位置,輪播圖的個(gè)數(shù)向左滑動(dòng)執(zhí)行的方法當(dāng)輪播圖滑動(dòng)最后一個(gè)位置時(shí),當(dāng)前輪播圖位置不變當(dāng)輪播不在最后一個(gè)位置時(shí),輪播圖位置變化方法向右滑動(dòng) Html的代碼: ...
閱讀 2565·2021-11-23 09:51
閱讀 3360·2021-11-22 15:22
閱讀 1873·2021-11-18 13:22
閱讀 2257·2021-09-24 09:48
閱讀 1312·2019-08-29 13:58
閱讀 1303·2019-08-26 13:39
閱讀 2448·2019-08-26 10:48
閱讀 3035·2019-08-26 10:21