JavaScript實(shí)現(xiàn)無(wú)縫輪播圖的示例代碼
花費(fèi)一個(gè)下午從0到1實(shí)現(xiàn)的輪播圖,當(dāng)然還有很多需要改進(jìn)的地方(歡迎提出需要改進(jìn)的地方),等我再努力努力,將其封裝成一個(gè)組件。
上效果

一、實(shí)現(xiàn)過(guò)程
1)首先實(shí)現(xiàn)基本布局
<div class="carousel-container">
//圖片列表
<div class="carousel-list"></div>
//上一張
<div class="carousel-arrow carousel-arrow-left"><</div>
//下一張
<div class="carousel-arrow carousel-arrow-right">></div>
//導(dǎo)航點(diǎn)
<div class="indicator">
<span class="active"></span>
<span></span>
<span></span>
</div>
</div>
2)主要樣式
簡(jiǎn)單布局樣式就不說(shuō)了,主要講如何將圖片橫向排列起來(lái)
先給容器設(shè)置相對(duì)定位,通過(guò)overflow將超出部分隱藏
.carousel-container {
position: relative;
width: 500px;
height: 300px;
/* overflow: hidden; */
background-color: #ccc;
}
然后圖片列表設(shè)置相對(duì)定位和flex盒子,這樣每一個(gè)滑塊就橫向排列成一排了
.carousel-container .carousel-list {
position: relative;
display: flex;
height: 100%;
width: 100%;
}
左右滑動(dòng)按鈕通過(guò)絕對(duì)定位+transform的方式移動(dòng)到兩邊,導(dǎo)航點(diǎn)也是一樣,就不一一詳說(shuō)了
二、如何實(shí)現(xiàn)無(wú)縫呢 (重點(diǎn)來(lái)了)
思路:
1、先實(shí)現(xiàn)向后滾動(dòng)無(wú)縫連接,將最后一張復(fù)制一份放到最前面,當(dāng)滾動(dòng)到最后一張時(shí),再次滾動(dòng),將要滾動(dòng)到第一張時(shí),先取消過(guò)渡transition,瞬間跳到最前面復(fù)制的那張上,然后繼續(xù)運(yùn)行動(dòng)畫(huà)到第一張,這樣看起來(lái)就無(wú)縫了
2、向前滾動(dòng)無(wú)縫連接,思路同上,復(fù)制第一張圖片放到最后,當(dāng)滾動(dòng)到第一張,再次滾動(dòng)時(shí),瞬間跳到最后復(fù)制的那張圖片上,繼續(xù)滾動(dòng)到輪播圖的最后一張上。

主要代碼
先獲取到dom元素,currentIndex是當(dāng)前輪播到的圖片下標(biāo)
let currentIndex = 0;
const doms = {
carouselList: document.querySelector('.carousel-list'),
arrowLeft: document.querySelector('.carousel-arrow-left'),
arrowRight: document.querySelector('.carousel-arrow-right'),
indicator: document.querySelectorAll('.indicator span')
}
先初始化dom,復(fù)制圖片
// 復(fù)制第一張放最后,最后一張圖片放第一張之前
function init() {
let lastImg = doms.carouselList.lastElementChild.cloneNode(true)
let firstImg = doms.carouselList.firstElementChild.cloneNode(true)
doms.carouselList.appendChild(firstImg)
doms.carouselList.insertBefore(lastImg, doms.carouselList.firstElementChild)
lastImg.style.position = 'absolute'
lastImg.style.transform = 'translateX(-100%)'
}
//執(zhí)行一下
init()
實(shí)現(xiàn)到任意一張圖片的方法
function moveTo(index) {
doms.carouselList.style.transform = `translateX(-${index * 100}%)`
doms.carouselList.style.transition = '.5s'
// 去掉導(dǎo)航點(diǎn)選中效果
let active = document.querySelector('.indicator span.active')
active.classList.remove('active')
// 添加選中效果
doms.indicator[index].classList.add('active')
currentIndex = index
}
給導(dǎo)航點(diǎn)綁定點(diǎn)擊跳轉(zhuǎn)事件
// 給導(dǎo)航點(diǎn)添加事件
doms.indicator.forEach((item, i) => {
item.onclick = function () {
moveTo(i);
}
})
給前后按鈕綁上執(zhí)行事件,判斷邊界圖片,及時(shí)取消過(guò)渡效果,瞬間跳到復(fù)制的圖片位置,調(diào)用moveTo到第一張或最后一張圖片上。
let indicatorLength = doms.indicator.length;
function preSlide() {
if (currentIndex === 0) {
doms.carouselList.style.transition = 'none'
doms.carouselList.style.transform = `translateX(-${indicatorLength * 100}%)`
doms.carouselList.clientHeight
moveTo(indicatorLength - 1)
} else {
moveTo(currentIndex - 1)
}
}
function nextSlide() {
if (currentIndex === doms.indicator.length - 1) {
doms.carouselList.style.transition = 'none'
doms.carouselList.style.transform = 'translateX(100%)'
doms.carouselList.clientHeight
moveTo(0)
} else {
moveTo(currentIndex + 1)
}
}
doms.arrowLeft.onclick = function () {
preSlide();
}
doms.arrowRight.onclick = function () {
nextSlide()
}
最后使用定時(shí)器調(diào)用nertSlide方法就實(shí)現(xiàn)自動(dòng)播放了
function start(time = 2000) {
setInterval(() => {
nextSlide()
}, time)
}
start()
完整代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.carousel-container {
margin: 0 auto;
position: relative;
width: 500px;
height: 300px;
/* overflow: hidden; */
background-color: #ccc;
}
.carousel-container .carousel-list {
position: relative;
display: flex;
height: 100%;
width: 100%;
}
.carousel-container .carousel-list .slide {
flex: 0 0 100%;
height: 100%;
width: 100%;
}
.slide a {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
width: 100%;
}
.slide a img {
width: 100%;
}
.carousel-container .carousel-arrow {
display: none;
position: absolute;
width: 36px;
height: 36px;
border-radius: 50%;
color: white;
text-align: center;
line-height: 36px;
cursor: pointer;
background-color: rgba(31, 45, 61, .2);
}
.carousel-container:hover .carousel-arrow {
display: block;
}
.carousel-container:hover .carousel-arrow:hover {
background-color: rgba(31, 45, 61, .4);
}
.carousel-container .carousel-arrow-left {
top: 50%;
left: 2%;
transform: translateY(-50%);
}
.carousel-container .carousel-arrow-right {
top: 50%;
right: 2%;
transform: translateY(-50%);
}
.carousel-container .indicator {
display: flex;
position: absolute;
left: 50%;
top: 90%;
transform: translateX(-50%)
}
.carousel-container .indicator span {
margin: 2px 5px;
padding: 3px;
width: 5px;
height: 5px;
border: 1px solid white;
border-radius: 5px;
}
.active {
background-color: #fff;
}
</style>
</head>
<body>
<div class="carousel-container">
<div class="carousel-list">
<div class="slide">
<a href="">
<img
src="https://ts4.cn.mm.bing.net/th?id=OIP-C.kB-Ovasi0GW67-rmwnAcwAHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.25&pid=3.1&rm=2">
</a>
</div>
<div class="slide">
<a href="">
<img
src="https://ts1.cn.mm.bing.net/th?id=OIP-C.QPH1IBosDYBqaU3O6wV3YAHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.25&pid=3.1&rm=2"></a>
</div>
<div class="slide">
<a href="">
<img
src="https://ts2.cn.mm.bing.net/th?id=OIP-C.P3NSGTdAYdyqy5zJpb5QXQHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.25&pid=3.1&rm=2"
alt=""></a>
</div>
</div>
<div class="carousel-arrow carousel-arrow-left"><</div>
<div class="carousel-arrow carousel-arrow-right">></div>
<div class="indicator">
<span class="active"></span>
<span></span>
<span></span>
</div>
</div>
</body>
<script>
window.onload = function () {
const doms = {
carouselList: document.querySelector('.carousel-list'),
arrowLeft: document.querySelector('.carousel-arrow-left'),
arrowRight: document.querySelector('.carousel-arrow-right'),
indicator: document.querySelectorAll('.indicator span')
}
let currentIndex = 0;
function moveTo(index) {
doms.carouselList.style.transform = `translateX(-${index * 100}%)`
doms.carouselList.style.transition = '.5s'
// 去掉導(dǎo)航點(diǎn)選中效果
let active = document.querySelector('.indicator span.active')
active.classList.remove('active')
// 添加選中效果
doms.indicator[index].classList.add('active')
currentIndex = index
}
// 給導(dǎo)航點(diǎn)添加事件
doms.indicator.forEach((item, i) => {
item.onclick = function () {
moveTo(i);
}
})
// 復(fù)制第一張放最后,最后一張圖片放第一張之前
function init() {
let lastImg = doms.carouselList.lastElementChild.cloneNode(true)
let firstImg = doms.carouselList.firstElementChild.cloneNode(true)
doms.carouselList.appendChild(firstImg)
doms.carouselList.insertBefore(lastImg, doms.carouselList.firstElementChild)
lastImg.style.position = 'absolute'
lastImg.style.transform = 'translateX(-100%)'
}
let indicatorLength = doms.indicator.length;
function preSlide() {
if (currentIndex === 0) {
doms.carouselList.style.transition = 'none'
doms.carouselList.style.transform = `translateX(-${indicatorLength * 100}%)`
doms.carouselList.clientHeight
moveTo(indicatorLength - 1)
} else {
moveTo(currentIndex - 1)
}
}
function nextSlide() {
if (currentIndex === doms.indicator.length - 1) {
doms.carouselList.style.transition = 'none'
doms.carouselList.style.transform = 'translateX(100%)'
doms.carouselList.clientHeight
moveTo(0)
} else {
moveTo(currentIndex + 1)
}
}
doms.arrowLeft.onclick = function () {
preSlide();
}
doms.arrowRight.onclick = function () {
nextSlide()
}
function start(time = 2000) {
setInterval(() => {
nextSlide()
}, time)
}
start()
init()
}
</script>
</html>到此這篇關(guān)于JavaScript實(shí)現(xiàn)無(wú)縫輪播圖的示例代碼的文章就介紹到這了,更多相關(guān)JavaScript無(wú)縫輪播圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
原生js實(shí)現(xiàn)表格循環(huán)滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)表格循環(huán)滾動(dòng),每次滾動(dòng)一行停頓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
原生JS實(shí)現(xiàn)響應(yīng)式瀑布流布局
本文給大家分享的是使用原生的javascript實(shí)現(xiàn)的響應(yīng)式的瀑布流布局的方法和源碼,非常的實(shí)用,有需要的小伙伴可以參考下。2015-04-04
基于JS實(shí)現(xiàn)移動(dòng)端訪問(wèn)PC端頁(yè)面時(shí)跳轉(zhuǎn)到對(duì)應(yīng)的移動(dòng)端網(wǎng)頁(yè)
不想通過(guò)CSS自適應(yīng)在PC端和移動(dòng)端分別顯示不同的樣式,那么只能通過(guò)在移動(dòng)端訪問(wèn)PC端網(wǎng)頁(yè)時(shí)跳轉(zhuǎn)到對(duì)應(yīng)的移動(dòng)端網(wǎng)頁(yè)了,那么怎么跳轉(zhuǎn)呢,網(wǎng)上也有很多文章說(shuō)明,以下實(shí)現(xiàn)思路經(jīng)過(guò)小編測(cè)試過(guò),需要的朋友可以參考下2016-04-04
原生js實(shí)現(xiàn)秒表計(jì)時(shí)器功能
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)秒表計(jì)時(shí)器功能,可以開(kāi)始、暫停、清除,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
基于bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索功能
這篇文章主要為大家詳細(xì)介紹了基于bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07

