js + css 做出网易云音乐的轮播图

先说一下思路,网易云轮播图是这样的,每隔一段时间(这里运用到了js的定时器)右边的图片会放大(css的transform)并切换(定位的z-index)上来(这里还运用了过渡transition),最前面一张图片会到左边的下面,如此重复轮播,鼠标移入图片区域(鼠标移入事件),轮播暂停(清除定时器),点击左右箭头可以切换图片(鼠标点击事件),鼠标移入图片下方的悬浮点也可以快速切换图片(悬浮点的鼠标移入事件,这里也要记得清除定时器)。

好了,思路说完了,接下来我们开始写代码

首先构建文件夹,images里面放轮播的图片,和两个左右箭头图片

 先写基本结构代码

<!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>网易云轮播图</title>
</head>
<body>
    <div class="carousel ">
        <!-- 图片 -->
        <div class="carousel_img">
            <img class="centerImg" src="./images/bizhi (0).jpg">
            <img class="rightImg" src="./images/bizhi (1).jpg">
            <img class="leftImg" src="./images/bizhi (2).jpg">
        </div>
        <!-- 图片下面的悬浮点 -->
        <ul class="carousel_dot">
            <li class="dotSty"></li>
            <li></li>
            <li></li>
        </ul>
        <!-- 左右两边的箭头 -->
        <box class="carousel_arrows">
            <img src="./images/arrowLeft.png">
            <img src="./images/arrowRight.png">
        </box>
    </div>
</body>
</html>

然后再来写一些样式代码


    <style>
        /* 清除默认样式 */
        * {
            padding: 0;
            margin: 0;
            font-size: 0;
        }

        /* 给轮播图盒子设置样式 */
        .carousel {
            margin: 50px auto;
            width: 1000px;
            height: 560px;
            position: relative;
        }

        /* 给图片的盒子设置样式 */
        .carousel_img {
            width: 100%;
            height: 100%;
            position: relative;
        }

        /* 给图片设置样式 */
        .carousel_img img {
            max-width: 100%;
            position: absolute;
            left: 0;
            top: 0;
            border-radius: 15px;
            /* 设置圆角 */
            transition: 1s;
            /* 给图片设置过渡效果 */
            transform: scale(0.7);
            /* 给图片设置缩小百分之七十 */
            z-index: 500;
            /* 给图片设置层级 */
        }

        /* 给左中右三个图片分别设置样式
        这里因为类样式权重不够,所以加上了!important*/
        .leftImg {
            left: -300px !important;
        }

        .centerImg {
            transform: scale(1) !important;
            z-index: 900 !important;
            left: 0 !important;
        }

        .rightImg {
            left: 300px !important;
        }

        .carousel_dot {
            width: 30%;
            height: 40px;
            position: absolute;
            bottom: -80px;
            /* 这里是给悬浮点的父盒子设置水平居中 */
            left: 50%;
            transform: translateX(-50%);
            /* 给悬浮点的父盒子设置弹性布局,让悬浮点均匀排列 */
            display: flex;
            justify-content: space-evenly;
            align-items: center;
            transition: 1s;
        }

        /* 给悬浮点设置样式 */
        .carousel_dot li {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            opacity: 0.5;
            background-color: #808695;
            transition: 0.3s;
        }

        /* 给悬浮点加个伪类,鼠标移动上去有个变化的效果 */
        .carousel_dot li:hover {
            opacity: 1;
            background-color: #3399ff;
        }

        /* 给当前图片所对应的悬浮点添加样式 */
        .dotSty {
            opacity: 1 !important;
            background-color: #3399ff !important;
        }

        /* 给左右箭头的父盒子添加样式 */
        .carousel_arrows {
            width: 80%;
            height: 100%;
            display: flex;
            justify-content: space-between;
            align-items: center;
            position: absolute;
            top: 0;
            left: 50%;
            transform: translateX(-50%);
            z-index: 910;
            transition: 1s;
            /* opacity: 0; */
        }

        /* 给左右箭头图片设置样式 */
        .carousel_arrows img {
            width: 20px;
            height: 20px;
            padding: 10px;
            border-radius: 50%;
            background-color: #3399ff;
        }
        /* 进入以下元素,改变光标样式 */
        .carousel_arrows img:hover,
        .carousel_dot li:hover,
        .carousel {
            cursor: pointer;
        }
    </style>

写到这里,我们就能看到以下效果

然后我们再来写一些js代码,让他动起来

<script>
        //网易云轮播图,position,z-index,transform组合实现轮播图
        const carousel = document.querySelector('.carousel') // 轮播图盒子
        const arrowsArr = document.querySelectorAll('.carousel_arrows img') // 箭头图片数组
        const dots = document.querySelectorAll('.carousel_dot li')  // 悬浮点元素数组
        const carouselArrows = document.querySelector('.carousel_arrows') // 左右箭头父元素
        const imageArr = document.querySelectorAll('.carousel_img img') // 轮播图片数组
        let timer   // 定时器
        let site = 0 // 图片实时位置  
        
        // 首先让图片自动轮播,设置一个定时器,每隔一段时间,修改左中右图片的class
        function setup() {
            timer = setInterval(() => {
                // 切换到下一张图片
                site++
                run(site)
            }, 2000);
        }

        function run(index) {
            // 纠正实时监控图片位置的stie
            if (index < 0) {
                // 当index小于0的时候,site应该为最后一张图片的索引
                site = dots.length - 1
                index = dots.length - 1
            }
            if (index === dots.length) {
                // 当index等于悬浮点数组长度时,stie应该为第一张图片的索引
                site = 0
                index = 0
            }
            // 切换悬浮点样式
            const dotSty = document.querySelector('.dotSty') // 找到当前有样式的悬浮点
            dotSty.className = ''   // 清除样式
            dots[index].className = 'dotSty' // 给下一个悬浮点添加样式

            // 改变图片样式,达到轮播效果
            // 获取当前有左中右样式的图片
            const leftImg = document.querySelector('.leftImg')
            const centerImg = document.querySelector('.centerImg')
            const rightImg = document.querySelector('.rightImg')
            // 清除样式
            leftImg.className = ''
            centerImg.className = ''
            rightImg.className = ''
            // 把左中右的样式给下一组图片
            // 把centerImg的样式赋给下一张图片,index为下一张图片索引
            imageArr[index].className = 'centerImg'
            // []里的三元运算符判断的是,当前显示的图片上一张图片的索引或者下一张图片的索引
            // 是否超过了最大值(图片数组长度减一)或者最小值(0)
            imageArr[index - 1 < 0 ? imageArr.length - 1 : index - 1].className = 'leftImg' 
            imageArr[index + 1 >= imageArr.length ? 0 : index + 1].className = 'rightImg'
            // 做到这里,就能自动切换轮播图了
            // 接下来我们添加一些互动效果,这才是js的魅力
        }

        // 给轮播图盒子添加鼠标移入和移除事件
        // 使得轮播图有暂停效果,和左右箭头有显示隐藏效果
        carousel.onmouseenter = () => {
            clearInterval(timer)
            carouselArrows.style.opacity = 0.7
        }
        carousel.onmouseleave = () => {
            setup()
            carouselArrows.style.opacity = 0
        }

        // 给箭头添加点击事件,左右切换轮播图
        for (let i = 0; i < arrowsArr.length; i++) {
            arrowsArr[i].onclick = () => {
                if (i === 0) {
                    site--
                    run(site)
                } else {
                    site++
                    run(site)
                }
            }
        }
        
        // 给悬浮点添加鼠标移入事件,切换图片,这里记得清除定时器
        for (let i = 0; i < dots.length; i++) {
            dots[i].onmouseenter = () => {
                clearInterval(timer)
                run(i)
                site = i
            }
        }
        // 切换到其他浏览器窗口时,停止轮播图,回来时继续轮播
        document.addEventListener('visibilitychange', () => {
            if (document.hidden) {
                clearInterval(timer)
            } else {
                setup()
            }
        })
        setup()
    </script>

写到这里这个轮播图就完成啦

想要添加更多的图片,直接在这里添加img标签就行了,记得图片路径不要写错了

 还有一件事,有多少个img图片,记得就要有多少个悬浮点,记得在这里添加悬浮点

下面就是完整的代码了

<!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>网易云轮播图</title>
    <style>
        /* 清除默认样式 */
        * {
            padding: 0;
            margin: 0;
            font-size: 0;
        }

        /* 给轮播图盒子设置样式 */
        .carousel {
            margin: 50px auto;
            width: 1000px;
            height: 560px;
            position: relative;
        }

        /* 给图片的盒子设置样式 */
        .carousel_img {
            width: 100%;
            height: 100%;
            position: relative;
        }

        /* 给图片设置样式 */
        .carousel_img img {
            max-width: 100%;
            position: absolute;
            left: 0;
            top: 0;
            border-radius: 15px;
            /* 设置圆角 */
            transition: 1s;
            /* 给图片设置过渡效果 */
            transform: scale(0.7);
            /* 给图片设置缩小百分之七十 */
            z-index: 500;
            /* 给图片设置层级 */
        }

        /* 给左中右三个图片分别设置样式
        这里因为类样式权重不够,所以加上了!important*/
        .leftImg {
            left: -300px !important;
        }

        .centerImg {
            transform: scale(1) !important;
            z-index: 900 !important;
            left: 0 !important;
        }

        .rightImg {
            left: 300px !important;
        }

        .carousel_dot {
            width: 30%;
            height: 40px;
            position: absolute;
            bottom: -80px;
            /* 这里是给悬浮点的父盒子设置水平居中 */
            left: 50%;
            transform: translateX(-50%);
            /* 给悬浮点的父盒子设置弹性布局,让悬浮点均匀排列 */
            display: flex;
            justify-content: space-evenly;
            align-items: center;
            transition: 1s;
        }

        /* 给悬浮点设置样式 */
        .carousel_dot li {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            opacity: 0.5;
            background-color: #808695;
            transition: 0.3s;
        }

        /* 给悬浮点加个伪类,鼠标移动上去有个变化的效果 */
        .carousel_dot li:hover {
            opacity: 1;
            background-color: #3399ff;
        }

        /* 给当前图片所对应的悬浮点添加样式 */
        .dotSty {
            opacity: 1 !important;
            background-color: #3399ff !important;
        }

        /* 给左右箭头的父盒子添加样式 */
        .carousel_arrows {
            width: 80%;
            height: 100%;
            display: flex;
            justify-content: space-between;
            align-items: center;
            position: absolute;
            top: 0;
            left: 50%;
            transform: translateX(-50%);
            z-index: 910;
            transition: 1s;
            /* opacity: 0; */
        }

        /* 给左右箭头图片设置样式 */
        .carousel_arrows img {
            width: 20px;
            height: 20px;
            padding: 10px;
            border-radius: 50%;
            background-color: #3399ff;
        }
        /* 进入以下元素,改变光标样式 */
        .carousel_arrows img:hover,
        .carousel_dot li:hover,
        .carousel {
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div class="carousel ">
        <!-- 图片 -->
        <div class="carousel_img">
            <img class="centerImg" src="./images/bizhi (0).jpg">
            <img class="rightImg" src="./images/bizhi (1).jpg">
            <img class="leftImg" src="./images/bizhi (2).jpg">
        </div>
        <!-- 图片下面的悬浮点 -->
        <ul class="carousel_dot">
            <li class="dotSty"></li>
            <li></li>
            <li></li>
        </ul>
        <!-- 左右两边的箭头 -->
        <box class="carousel_arrows">
            <img src="./images/arrowLeft.png">
            <img src="./images/arrowRight.png">
        </box>
    </div>

    <script>
        //网易云轮播图,position,z-index,transform组合实现轮播图
        const carousel = document.querySelector('.carousel') // 轮播图盒子
        const arrowsArr = document.querySelectorAll('.carousel_arrows img') // 箭头图片数组
        const dots = document.querySelectorAll('.carousel_dot li')  // 悬浮点元素数组
        const carouselArrows = document.querySelector('.carousel_arrows') // 左右箭头父元素
        const imageArr = document.querySelectorAll('.carousel_img img') // 轮播图片数组
        let timer   // 定时器
        let site = 0 // 图片实时位置  
        
        // 首先让图片自动轮播,设置一个定时器,每隔一段时间,修改左中右图片的class
        function setup() {
            timer = setInterval(() => {
                // 切换到下一张图片
                site++
                run(site)
            }, 2000);
        }

        function run(index) {
            // 纠正实时监控图片位置的stie
            if (index < 0) {
                // 当index小于0的时候,site应该为最后一张图片的索引
                site = dots.length - 1
                index = dots.length - 1
            }
            if (index === dots.length) {
                // 当index等于悬浮点数组长度时,stie应该为第一张图片的索引
                site = 0
                index = 0
            }
            // 切换悬浮点样式
            const dotSty = document.querySelector('.dotSty') // 找到当前有样式的悬浮点
            dotSty.className = ''   // 清除样式
            dots[index].className = 'dotSty' // 给下一个悬浮点添加样式

            // 改变图片样式,达到轮播效果
            // 获取当前有左中右样式的图片
            const leftImg = document.querySelector('.leftImg')
            const centerImg = document.querySelector('.centerImg')
            const rightImg = document.querySelector('.rightImg')
            // 清除样式
            leftImg.className = ''
            centerImg.className = ''
            rightImg.className = ''
            // 把左中右的样式给下一组图片
            // 把centerImg的样式赋给下一张图片,index为下一张图片索引
            imageArr[index].className = 'centerImg'
            // []里的三元运算符判断的是,当前显示的图片上一张图片的索引或者下一张图片的索引
            // 是否超过了最大值(图片数组长度减一)或者最小值(0)
            imageArr[index - 1 < 0 ? imageArr.length - 1 : index - 1].className = 'leftImg' 
            imageArr[index + 1 >= imageArr.length ? 0 : index + 1].className = 'rightImg'
            // 做到这里,就能自动切换轮播图了
            // 接下来我们添加一些互动效果,这才是js的魅力
        }

        // 给轮播图盒子添加鼠标移入和移除事件
        // 使得轮播图有暂停效果,和左右箭头有显示隐藏效果
        carousel.onmouseenter = () => {
            clearInterval(timer)
            carouselArrows.style.opacity = 0.7
        }
        carousel.onmouseleave = () => {
            setup()
            carouselArrows.style.opacity = 0
        }

        // 给箭头添加点击事件,左右切换轮播图
        for (let i = 0; i < arrowsArr.length; i++) {
            arrowsArr[i].onclick = () => {
                if (i === 0) {
                    site--
                    run(site)
                } else {
                    site++
                    run(site)
                }
            }
        }
        
        // 给悬浮点添加鼠标移入事件,切换图片,这里记得清除定时器
        for (let i = 0; i < dots.length; i++) {
            dots[i].onmouseenter = () => {
                clearInterval(timer)
                run(i)
                site = i
            }
        }
        // 切换到其他浏览器窗口时,停止轮播图,回来时继续轮播
        document.addEventListener('visibilitychange', () => {
            if (document.hidden) {
                clearInterval(timer)
            } else {
                setup()
            }
        })
        setup()
    </script>
</body>

</html>

我的文件路径是这样的,路径记得不要错

  • 11
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React是一个用于构建用户界面的JavaScript库。它可以帮助开发者构建出高效、灵活且易于维护的应用程序。而网易云音乐轮播图是一个非常经典的功能,我们可以通过React来实现类似的效果。 首先,我们可以利用React的组件化思想,将轮播图拆分成多个组件,如"Slider"组件、"Slide"组件等。"Slider"组件负责整体的布局和逻辑,而"Slide"组件负责单个图片的展示和样式; 其次,我们可以使用React的状态管理机制来控制轮播图的切换。可以通过useState来定义当前的图片索引,通过useEffect来监听索引的变化,并根据变化来改变轮播图的显示; 接着,我们需要利用React的生命周期函数,比如componentDidMount和componentWillUnmount,来处理轮播图的自动切换。通过设置定时器,在componentDidMount中启动自动切换功能,并在componentWillUnmount中清除定时器,以防止内存泄漏; 最后,我们可以使用React的事件处理机制,比如onClick来处理用户的操作。当用户点击上下一页或者圆点指示器时,可以通过更新状态来改变轮播图的显示。 综上所述,通过利用React的组件化思想、状态管理机制、生命周期函数以及事件处理机制,我们可以实现一个仿造网易云音乐轮播图的功能。这样我们就可以在应用中展示图片,并实现自动切换、手动切换等功能,提升用户体验。 React的灵活性和易用性使得开发此类功能变得非常简单和高效。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值