原生html/css+js写轮播

效果视频:

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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值