原生htmlcss+js写轮播

it2025-10-25  8

效果视频:

20201022-115002

完整的html/css和js如下,新建.css和.html和.js文件后把对应的代码复制粘贴到对应文件中,双击.html文件即可看到效果(如果图片无法打开可以修改js中存储图片的list数组)

html:

<!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" /> <link rel="stylesheet" href="./index.css"> <title>轮播</title> </head> <body> <div id="app"> </div> <script src="./index.js"> </script> </body> </html>

css:

.box { width: 1200px; height: 200px; border-radius: 4px; overflow: hidden; position: relative; margin: 0 auto; } .carousel-ul { display: flex; list-style: none; margin: 0; padding: 0; } .carousel-ul li.show-pointer { cursor: pointer; } .carousel-ul li img { display: block; width: 1200px; height: 200px; } /* 轮播指示器 */ .carousel-indicators-ul { position: absolute; bottom: 5px; left: 50%; } .carousel-indicators-ul li { width: 38px; height: 26px; display: flex; justify-content: center; align-items: center; cursor: pointer; opacity: 0.5; } .carousel-indicators-ul li>div { width: 30px; height: 2px; background-color: #fff; }

js:

// 广告 const announcement = (list) => { let lis = getLis(list) let indicators = getIndicators(list) let announcement = document.createElement("div") announcement.className = 'box' announcement.innerHTML = ` <ul class="carousel-ul"> ${lis} </ul> <ul class="carousel-indicators-ul" style="marginLeft:-${38 * list.length / 2};display:${list.length > 1 ? 'flex' : 'none'}"> ${indicators} </ul> ` document.body.appendChild(announcement) list.length > 1 ? addCarouselEvent(list) : ''; let carouselItems = document.getElementsByClassName("carousel-ul")[0].getElementsByTagName('li') for (let i = 0; i < carouselItems.length; i++) { carouselItems[i].addEventListener("click", () => { if (list[i].link) { window.open(list[i].link) } }) } } const getLis = (list) => { let lis = `` for (let i = 0; i < list.length; i++) { lis += ` <li class="${list[i].link?'show-pointer':''}"> <img src="${list[i].imageUrl}" /> </li> ` } return lis } const getIndicators = (list) => { let lis = '' for (let i = 0; i < list.length; i++) { lis += ` <li> <div></div> </li> ` } return lis } const addCarouselEvent = (list) => { const carouselWidth = 1200 let carouselUl = document.getElementsByClassName("carousel-ul")[0] let indicatorLis = list.length > 1 ? document.getElementsByClassName("carousel-indicators-ul")[0].getElementsByTagName("li") : '' let carouselLis = carouselUl.getElementsByTagName("li") let left = 0 let timer = '' run() function run() { let time; if (left % carouselWidth == 0) { time = 3000 let ind = left === 0 ? 0 : (-left / carouselWidth) ind = ind === indicatorLis.length ? 0 : ind for (let i = 0; i < indicatorLis.length; i++) { if (i === ind) { indicatorLis[i].style.opacity = 1 } else { indicatorLis[i].style.opacity = 0.5 } } } else { time = 10 } let maxLeft = -(carouselWidth * list.length) if (left <= maxLeft) { left = 0 } carouselUl.style.marginLeft = left + 'px' timer = setTimeout(() => { left -= 200 run() }, time) } for (let i = 0; i < carouselLis.length; i++) { // 鼠标移入 carouselLis[i].onmouseover = () => { clearTimeout(timer) left = -i * carouselWidth carouselUl.style.marginLeft = left + 'px' }; // 鼠标移出 carouselLis[i].onmouseout = () => { run() } } for (let j = 0; j < indicatorLis.length; j++) { indicatorLis[j].onmouseover = () => { clearTimeout(timer) left = -j * carouselWidth carouselUl.style.marginLeft = left + 'px' for (let k = 0; k < indicatorLis.length; k++) { indicatorLis[k].style.opacity = k === j ? 1 : 0.5 } } } } let list = [ { link: 'https://www.baidu.com', imageUrl: 'https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/fdd30e55069adb64bb354d4f8d9f9b60.jpg?w=2452&h=920' }, { link: 'https://www.baidu.com', imageUrl: 'https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/10aac533af4489c077bc6a8e15219e3b.jpg?thumb=1&w=1226&h=460&f=webp&q=90' } ] announcement(list)
最新回复(0)