《HTML + CSS + JS 打造炫酷輪播圖詳解》

《HTML + CSS + JS 打造炫酷輪播圖詳解》

一、項目概述

本次項目旨在使用 HTML、CSS 和 JavaScript 實現一個具有基本功能的輪播圖,包括圖片自動輪播、上一張 / 下一張按鈕切換、小圓點指示與切換等功能,以提升網頁的交互性和視覺吸引力。

二、實現步驟

(一)圖片拼接做出架構

1、HTML 結構搭建

  • 在 HTML 文件中,首先創建一個 div 容器,設置 idbanner,作為輪播圖的整體框架。
  • banner 內部,創建一個無序列表 ulidlist,用于存放輪播的圖片。每個圖片項為 li 元素,li 內部嵌套 img 標簽引入圖片資源,如:
<div id="banner"><ul id="list"><li><img src="./img/p2.jpg"></li><li><img src="./img/p3.jpg"></li><li><img src="./img/p2 - 副本.jpg"></li><li><img src="./img/p3 - 副本.jpg"></li><li><img src="./img/p2.jpg"></li></ul>
</div>
  • 接著創建另一個無序列表 ulidicolist,用于存放小圓點,每個小圓點為 li 元素,初始內容為數字序號,用于標識對應的圖片:
<ul id="icolist"><li>1</li><li>2</li><li>3</li><li>4</li>
</ul>
  • 最后,創建兩個 div 元素,分別作為向前和向后的按鈕,設置 idprenex,并添加相應的箭頭符號作為內容:
<div class="prev" id="pre"></div>
<div class="next" id="nex"></div>

2、CSS 樣式設置

  • 使用通配符選擇器 * 對所有元素進行初始化,去除默認的 margin、padding 和列表樣式:
* {margin: 0;padding: 0;list-style: none;
}
  • banner 容器設置寬度 650px、高度 250px,添加 2px 灰色邊框,設置相對定位 position: relative,并隱藏超出部分 overflow: hidden,使其水平居中 margin:100px auto 0;
#banner {width: 650px;height: 250px;border: 2px solid #999;position: relative;overflow: hidden;margin:100px auto 0;
}
  • 對于圖片列表 #list,設置寬度 3500px(考慮到圖片數量和切換效果,確保足夠寬度容納所有圖片移動),高度 250px,使其內部的 li 元素左浮動 float: left,圖片寬度 700px、高度 250px 以適應容器:
#list {width: 3500px;height: 250px;
}
#list li {float: left;
}
#list li img {width: 700px;height: 250px;
}
  • 向前按鈕 .prev 和向后按鈕 .next,設置寬度 30px、高度 40px,背景色為灰色 #999,文字顏色白色 color: aliceblue,水平垂直居中 text-align: center; line-height: 40px,絕對定位在容器底部左右兩側合適位置,設置 cursor: pointer 以顯示手型指針:
.prev{width:30px;height:40px;background-color: #999;color: aliceblue;text-align: center;line-height: 40px;position:absolute;bottom:45%;left:5px;cursor: pointer;
}
.next{width:30px;height:40px;background-color: #999;color: aliceblue;text-align: center;line-height: 40px;position:absolute;bottom:45%;right:5px;cursor: pointer;
}
  • 小圓點 #icolist 列表設置絕對定位在容器右下角,li 元素設置寬度 30px、高度 30px,圓形 border-radius: 50%,灰色背景 background: #999,白色文字 color: #fff,水平垂直居中,左浮動并設置一定間距 margin-left: 5px,同樣設置 cursor: pointer
#icolist {position: absolute;right:10px;bottom: 10px;
}
#icolist li{width:30px;height:30px;border-radius: 50%;background: #999;color: #fff;text-align: center;line-height: 30px;float: left;margin-left: 5px;cursor: pointer;
}

(二)定時器實現簡單輪播效果

1、在 JavaScript 代碼中,首先等待頁面加載完成,使用 window.onload 事件:

window.onload = function() {// 后續代碼將寫在此處
}

2、在 window.onload 函數內部,獲取圖片列表元素 eimglist 和用于控制輪播的變量 left(初始為 0,表示圖片列表的初始偏移量),并定義定時器相關變量 timer

var eimglist = document.querySelector('#list');
var left = 0;
var timer;

3、創建run函數,用于實現圖片的自動輪播邏輯:

  • 首先判斷如果圖片向左滾動到最后一張(即 left < -2800,因為每張圖片寬度 700px,共 4 張圖片循環,總偏移量為 -2800px),則將 left 重置為 0,實現循環效果:
if (left < -2800) {left = 0;
}
  • 計算當前顯示圖片的序號 m,通過 Math.floor(-left/700),取整得到當前圖片是第幾張:
var m = Math.floor(-left/700);
  • 處理圖片滾動時的特殊情況,當圖片剛好滾動完一輪(即 left % 700 == 0),設置一個較小的偏移量 n = 1200,模擬快速切換到下一輪第一張圖片的效果,否則設置常規偏移量 n = 10
var n = (left % 700 == 0)? n = 1200 : n = 10;
  • 更新圖片列表的 marginLeft 屬性,實現圖片向左移動:
left -= 10;
list.style.marginLeft = left + 'px'
  • 使用 setTimeout 遞歸調用 run 函數,實現定時輪播,間隔時間為 n 毫秒:
timer = setTimeout(run,n);

(三)做出上一張下一張按鈕

(此時 banner 中 overflow:hidden 需要先注釋掉,要不然看不到那兩個按鈕),此時這個要做決定定位,并給他們添加點擊事件)

1、在 CSS 中,由于按鈕默認被 overflow:hidden 隱藏,暫時注釋掉 banner 容器的 overflow:hidden 屬性,以便能看到按鈕并調整位置:

/* #banner {overflow: hidden;
} */

2、在 JavaScript 中,獲取向前按鈕 prev_btn 和向后按鈕 next_btn

var prev_btn = document.getElementById('pre');
var next_btn = document.getElementById('nex');

3、給向前按鈕添加點擊事件處理函數:

  • 計算當前圖片的上一張圖片序號 prevgo,通過 Math.floor(-left/700)+1,并處理邊界情況,當 prevgo == 0(即已經是第一張圖片,點擊上一張應切換到最后一張),將 prevgo 設置為 3:
prev_btn.onclick = function() {let prevgo = Math.floor(-left/700)+1;if(prevgo == 0) {prevgo = 3;}// 后續調用圖片定位函數
}

4、給向后按鈕添加點擊事件處理函數:

  • 類似地,計算當前圖片的下一張圖片序號 nextgo,通過 Math.floor(-left/700)+1,并處理邊界情況,當 nextgo == 4(即已經是最后一張圖片,點擊下一張應切換到第一張),將 nextgo 設置為 0:
next_btn.onclick = function() {let nextgo = Math.floor(-left/700)+1;if(nextgo == 4) {nextgo = 0;}// 后續調用圖片定位函數
}

(四)實現上一張下一張代碼

我們做一個 imgchange() 圖片定位函數

1、在 JavaScript 中,創建imgchange函數:

  • 函數接收一個參數 n,表示要切換到的圖片序號,根據序號計算圖片列表需要的偏移量 lt,通過 -(n*700),并更新圖片列表的 marginLeft 屬性,同時更新全局變量 left
function imgchange(n) {let lt = -(n*700);list.style.marginLeft = lt + 'px';left = lt;
}

2、在向前按鈕和向后按鈕的點擊事件處理函數中,分別調用 imgchange 函數傳入計算好的 prevgonextgo

prev_btn.onclick = function() {let prevgo = Math.floor(-left/700)+1;if(prevgo == 0) {prevgo = 3;}imgchange(prevgo);
}
next_btn.onclick = function() {let nextgo = Math.floor(-left/700)+1;if(nextgo == 4) {nextgo = 0;}imgchange(nextgo);
}

(五)做出輪播圖上的四個小圓點

1、在 HTML 結構中的 #icolist 列表已經創建了四個 li 元素作為小圓點,初始內容為數字 1 - 4,用于標識圖片序號。

2、在 CSS 樣式中,已經對 #icolist 及其內部 li 元素進行了樣式設置,使其呈現為圓形、灰色背景、白色文字并在輪播圖右下角合理排列,且鼠標懸停時有手型指針效果。

(六)小圓點跟著圖片滾動變紅,做一個 icochange() 圓點跟隨函數

1、在 JavaScript 中,創建icochange函數:

  • 首先使用 for 循環遍歷所有小圓點 esico(通過 document.getElementById('icolist').getElementsByTagName('li') 獲取),將它們的背景色清空:
function icochange(m) {for(let index = 0; index < esico.length; index++) {esico[index].style.backgroundColor = '';}
  • 然后根據傳入的當前圖片序號 m,判斷如果 m 小于小圓點數量 esico.length,將對應序號的小圓點背景色設置為紅色:
if(m < esico.length) {esico[m].style.backgroundColor = 'red';
}
}

2、在 run 函數中,每次圖片切換時調用 icochange 函數傳入當前圖片序號 m,實現小圓點跟隨圖片變色:

function run() {// 其他代碼...icochange(m);// 其他代碼...
}

(七)點擊小圓點切圖,完成最終效果

1、在 JavaScript 中,給小圓點列表eicolist

添加點擊事件處理函數:

  • 獲取點擊的目標元素 tg,通過 event.target,并從目標元素的 innerHTML 中獲取點擊的小圓點序號 ico,注意要減 1 以匹配圖片序號(因為小圓點內容從 1 開始,而圖片序號從 0 開始):
eicolist.onclick = function () {var tg = event.target;var ico = tg.innerHTML - 1;// 后續調用圖片定位和小圓點變色函數
}

2、在點擊事件處理函數中,分別調用 imgchange 函數傳入 ico 實現圖片切換,調用 icochange 函數傳入 ico 實現對應小圓點變色:

eicolist.onclick = function () {var tg = event.target;var ico = tg.innerHTML - 1;imgchange(ico);icochange(ico);
}

3、最后,為了優化用戶體驗,當鼠標懸停在圖片列表上時,停止輪播,移開后繼續輪播:

  • 給圖片列表 eimglist 添加 onmouseover 事件處理函數,在其中使用 clearTimeout 停止定時器:
eimglist.onmouseover = function() {clearTimeout(timer);
}
  • 給圖片列表 eimglist 添加 onmouseout 事件處理函數,在其中調用 run 函數重新啟動輪播:
eimglist.onmouseout = function() {run();
}

三、全部代碼

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><style type="text/css">* {margin: 0;padding: 0;list-style: none;}#banner {width: 650px;height: 250px;border: 2px solid #999;position: relative;overflow: hidden;margin:100px auto 0;}/* 輪播圖列表圖片 */#list {width: 3500px;height: 250px;}#list li {float: left;}#list li img {width: 700px;height: 250px;}/* 向前的按鈕 */.prev{width:30px;height:40px;background-color: #999;color: aliceblue;text-align: center;line-height: 40px;position:absolute;bottom:45%;left:5px;cursor: pointer;}/* 向后按鈕 */.next{width:30px;height:40px;background-color: #999;color: aliceblue;text-align: center;line-height: 40px;position:absolute;bottom:45%;right:5px;cursor: pointer;}/* 小圓點 */#icolist{position: absolute;right:10px;bottom: 10px;}#icolist li{width:30px;height:30px;border-radius: 50%;background: #999;color: #fff;text-align: center;line-height: 30px;float: left;margin-left: 5px;cursor: pointer;}</style><script>window.onload = function() {var prev_btn=document.getElementById('pre')var next_btn=document.getElementById('nex')// 獲取小圓點的li標簽var esico=document.getElementById('icolist').getElementsByTagName('li');var eicolist=document.querySelector('#icolist');// 獲取圖片列表元素var eimglist=document.querySelector('#list');var left = 0;var timer;run()function run() {// 如果滾動完,重新開始if (left < -2800) {left = 0;}// 常見變量m獲取當前圖片序號var m=Math.floor(-left/700);// 此時輪播圖尾部有一張空白,我們需要補接第一張才不會有空,我們添加一張圖片,修改圖片列表寬度var n = (left % 700== 0) ? n = 1200 : n = 10;left -= 10;list.style.marginLeft = left + 'px'timer = setTimeout(run,n);// 調用icochange進行小圓點變化icochange(m);}// 我們做一個圖片定位函數function imgchange(n){let lt=-(n*700);list.style.marginLeft=lt+'px';left=lt;}prev_btn.onclick=function(){let prevgo=Math.floor(-left/700)+1;if(prevgo==0){prevgo=3;}imgchange(prevgo)}next_btn.onclick=function(){let nextgo=Math.floor(-left/700)+1;if(nextgo==4){nextgo=0;}imgchange(nextgo)}// icochange()圓點跟隨函數function icochange(m){// 通過for循環所有li元素背景色清空for(let index=0;index<esico.length;index++){esico[index].style.backgroundColor='';}// 當圖片所在的小圓點設置背景色為紅色if(m<esico.length){esico[m].style.backgroundColor='red';}}// 創建列表元素點擊事件eicolist.onclick=function (){// tg獲取事件目標元素var tg=event.target;// 通過ico獲取點擊的序號var ico=tg.innerHTML-1;imgchange(ico);icochange(ico);}// 鼠標在圖片列表上時輪播停止,移開后又啟動eimglist.onmouseover=function(){clearTimeout(timer);}eimglist.onmouseout=function(){run();}}</script></head><body><div id="banner"><ul id="list"><li><img src="./img/p2.jpg"></li><li><img src="./img/p3.jpg"></li><li><img src="./img/p2 - 副本.jpg"></li><li><img src="./img/p3 - 副本.jpg"></li><li><img src="./img/p2.jpg"></li></ul><!-- 小圓點 --><ul id="icolist"><li>1</li><li>2</li><li>3</li><li>4</li></ul><!-- 向前向后按鈕 --><div class="prev" id="pre"></div><div class="next" id="nex"></div></div></body>
</html>

四、總結

通過以上步驟,逐步構建了一個完整的輪播圖功能。從最初的 HTML 結構搭建,到 CSS 樣式美化,再到 JavaScript 實現復雜的交互邏輯,包括定時器控制自動輪播、按鈕點擊切換、小圓點指示與交互等。在實現過程中,需要注意變量的管理、邊界情況的處理以及元素的樣式和定位協調,以確保輪播圖的流暢運行和良好展示效果。同時,這種實現方式也為進一步擴展輪播圖功能,如添加動畫效果、響應式設計等提供了基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73182.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

257. 二叉樹的所有路徑(遞歸+回溯)

257. 二叉樹的所有路徑 力扣題目鏈接(opens new window) 給定一個二叉樹&#xff0c;返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 思路&#xff1a;在葉子節點收割結果&#xff0c;如果不是葉子節點&#xff0c;則依次處理左右子樹&a…

【架構差異】SpringとSpringBoot:Bean機制的深入剖析與自動配置原理

目錄標題 SpringBoot框架中Bean機制的深入剖析與自動配置原理摘要1. 引言2. SpringBoot與Spring的架構差異2.1 從Spring到SpringBoot的演進2.2 SpringBoot中的Bean容器體系 3. SpringBoot的自動配置機制3.1 SpringBootApplication解析3.2 自動配置原理深度解析3.2.1 自動配置類…

CSDN博客:Markdown編輯語法教程總結教程(中)

?個人主頁&#xff1a;折枝寄北的博客 Markdown編輯語法教程總結 前言1. 列表1.1 無序列表1.2 有序列表1.3 待辦事項列表1.4 自定義列表 2. 圖片2.1 直接插入圖片2.2 插入帶尺寸的圖片2.3 插入寬度確定&#xff0c;高度等比例的圖片2.4 插入高度確定寬度等比例的圖片2.5 插入居…

ChebyKAN0、ChebyKAN1 網絡閱讀

目錄 ChebyKAN0 Chebyshev Polynomial-Based Kolmogorov-Arnold Networks: An Efficient Architecture for Nonlinear Function Approximation 參考文獻 文章內容 文章詳細結構 5. Experiments and Results 5.1 Digit Classification on MNIST 5.2 Function Approximat…

RK3588部署YOLOv8(2):OpenCV和RGA實現模型前處理對比

目錄 前言 1. 結果對比 1.1 時間對比 1.2 CPU和NPU占用對比 2. RGA實現YOLO前處理 2.1 實現思路 2.2 處理類的聲明 2.3 處理類的實現 總結 前言 RK平臺上有RGA (Raster Graphic Acceleration Unit) 加速&#xff0c;使用RGA可以減少資源占用、加速圖片處理速度。因此…

破局者登場:中國首款AI原生IDE Trae深度解析--開啟人機協同編程新紀元

摘要 字節跳動于2025年3月3日正式發布中國首款AI原生集成開發環境Trae國內版&#xff0c;以動態協作、全場景AI賦能及本土化適配為核心優勢。Trae內置Doubao-1.5-pro與DeepSeek R1/V3雙引擎&#xff0c;支持基于自然語言生成端到端代碼框架、實時上下文感知與智能Bug修復&…

【PyCharm】Python和PyCharm的相互關系和使用聯動介紹

李升偉 整理 Python 是一種廣泛使用的編程語言&#xff0c;而 PyCharm 是 JetBrains 開發的專門用于 Python 開發的集成開發環境&#xff08;IDE&#xff09;。以下是它們的相互關系和使用聯動的介紹&#xff1a; 1. Python 和 PyCharm 的關系 Python&#xff1a;一種解釋型、…

SNIPAR:快速實現親緣個體的基因型分離與推斷

SNIPAR&#xff1a;快速實現親緣個體的基因型分離與推斷 近日&#xff0c;英國劍橋大學研究團隊在Nature Genetics上發表了最新研究成果——SNIPAR&#xff08;SNP-based Inference of Pedigree relationship, Ancestry, and Recombination&#xff09;。這一強大的工具可以幫助…

3.11記錄

leetcode刷題&#xff1a; 1. 334. 遞增的三元子序列 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;使用貪心算法求解 class Solution(object):def increasingTriplet(self, nums):first nums[0]second float(inf)for i in nums:if i>second:return Truee…

阿里云操作系統控制臺評測:國產AI+運維 一站式運維管理平臺

阿里云操作系統控制臺評測&#xff1a;國產AI運維 一站式運維管理平臺 引言 隨著云計算技術的飛速發展&#xff0c;企業在云端的運維管理面臨更高的要求。阿里云操作系統控制臺作為一款集運維管理、智能助手和系統診斷等多功能于一體的工具&#xff0c;正逐步成為企業高效管理…

大語言模型學習--向量數據庫Milvus實踐

Milvus是目前比較流行的開源向量數據庫&#xff0c;其官網地址 Milvus 是什么&#xff1f; | Milvus 文檔 1.Milvus簡介 Milvus 是一種高性能、高擴展性的向量數據庫。Milvus 提供強大的數據建模功能&#xff0c;能夠將非結構化或多模式數據組織成結構化的 Collections。它支…

DeepSeek Kimi詳細生成PPT的步驟

以下是使用 DeepSeek 和 Kimi 協作生成 PPT 的詳細步驟&#xff0c;結合了兩者的優勢實現高效創作&#xff1a; 第一步&#xff1a;使用 DeepSeek 生成 PPT 大綱或內容 明確需求并輸入提示詞 在 DeepSeek 的對話界面中&#xff0c;輸入具體指令&#xff0c;要求生成 PPT 大綱或…

Visual Studio 安裝及使用教程(Windows)【安裝】

文章目錄 一、 Visual Studio 下載1. 官網下載2. 其它渠道 二、Visual Studio 安裝三、Visual Studio 使用四、Visual Studio 其它設置1. 桌面快捷方式2. 更改主題、字體大小 軟件 / 環境安裝及配置目錄 一、 Visual Studio 下載 1. 官網下載 安裝地址&#xff1a;https://vi…

Java多線程與高并發專題——阻塞和非阻塞隊列的并發安全原理是什么?

引入 之前我們探究了常見的阻塞隊列的特點&#xff0c;在本文我們就以 ArrayBlockingQueue 為例&#xff0c;首先分析 BlockingQueue &#xff0c;也就是阻塞隊列的線程安全原理&#xff0c;然后再看看它的兄弟——非阻塞隊列的并發安全原理。 ArrayBlockingQueue 源碼分析 …

關于ngx-datatable no data empty message自定義模板解決方案

背景&#xff1a;由于ngx-dataable插件默認沒有數據時顯示的文案是no data to display&#xff0c;且沒有任何樣式。這里希望通過自定義模板來實現。但目前github中有一個案例是通過設置代碼&#xff1a; https://swimlane.github.io/ngx-datatable/empty** <ngx-datatable…

Matlab 雙線性插值(二維)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 雙線性插值是一種 二維插值方法,用于計算 柵格(Grid) 或 像素點 之間的插值值。它主要用于 圖像縮放、旋轉、變換 等操作,以在新像素位置估算灰度值或顏色值。 如上圖所示,假設存在一個二維離散函數(如圖像)…

coding ability 展開第二幕(雙指針——鞏固篇)超詳細!!!!

文章目錄 前言有效的三角形個數思路 查找總價格為目標值的兩個商品思路 兩數之和思路 三數之和思路 四數之和思路 總結 前言 本專欄的上篇&#xff0c;講述了雙指針的一些基礎的算法習題 今天我們來學習更進一步的雙指針用法吧 其實也是大相徑庭&#xff0c;和前面的差不多&…

L1-056 猜數字

L1-056 猜數字 - 團體程序設計天梯賽-練習集 (pintia.cn) 題解 這道題要求&#xff1a;一群人坐在一起&#xff0c;每人猜一個 100 以內的數&#xff0c;誰的數字最接近大家平均數的一半就贏。現在需要編寫程序來計算&#xff0c;其中需要存入玩家的名字&#xff08;字符串&a…

處理Java中的異常

處理Java中的異常 在 Java 中&#xff0c;異常處理是通過 try-catch-finally 語句來實現的。Java 提供了一種強大的機制&#xff0c;用于捕捉和處理程序運行中的各種錯誤和異常。通過這種方式&#xff0c;你可以有效地捕捉到可能導致程序崩潰的錯誤&#xff0c;并做出相應的處…

一維數組的增刪改查:對元素的影響

一維數組的增刪改查:對元素的影響(C語言) 在C語言中,一維數組是一種存儲一組相同類型元素的數據結構。它在內存中是連續存儲的,每個元素都可以通過索引來訪問和修改。在這篇博文中,我們將詳細探討一維數組的增、刪、改、查操作,并分析它們對數組元素的影響。 1. 一維數…