JavaScript模拟实现网易云轮播效果


Posted in Javascript onApril 04, 2022

1、div宽度直接与浏览器界面宽度一致:width:100%

2、怎么让图片在一个绝对定位的盒子中垂直居中显示?

继续加绝对定位。然后改变top,和left的值

3、采用外置的js文件,需要等到页面加载完毕:window.οnlοad=function(){}

4、添加和移除元素的类名:先获取DOM对象,然后通过classList.add('current')(里面不需要加.)和classList.remove()即可添加类型和删除类名。

5、事件委托: 比如有100个li,每个li都有相同的click点击事件,可能我们会用for循环的方法,来遍历所有的li,然后给它们添加事件。这样会增加dom的交互次数 事件委托是利用事件的冒泡原理实现,事件从最深的节点开始,然后逐步向上传播事件。页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div。当给最外面的div加点击事件,那么里面的ul,li,a做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托它们父级代为执行事件。

6、js改变元素背景图url:document.getElementById("元素id").style.backgroundImage="url(图片路径)";

7、js实现定时器的暂停与开启:

var dsq = setInterval(gd,40);oDiv.οnmοuseοver= function()    //停止定时器实现暂停的效果
{   clearInterval(dsq);   } oDiv.οnmοuseοut= function()      //开启定时器,实现重启的效果
{    //setInterval(gd,40);  错误的示范\当多次点击的时候,因为开辟了很多个定时器,效果就是一直跳动,看起来很像是因为没有加节流阀的效果。   dsq=setInterval(gd,40);    
//需要再开启这个定时器,一定要在定时器前面加上你定义的那个定时器的变量名,如果不加的话就会又开启一个新的定时器然后你上面的那个停止dsq定时器的函数是无法停止这个新的定时器的,当你鼠标不断移入移出都会开启一个新的定时器,多个定时器同时执行相同的动作,这样相当于你的定时器里面的时间成倍的减少,效果就是你的定时器越来越快的执行,  
}

JavaScript模拟实现网易云轮播效果

<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>
    <link rel="stylesheet" href="41.css" rel="external nofollow" >
    <script src="41.js"></script>
</head>
 
<body>
    <!-- 盒子里面方图片,可以通过左右按钮改变图片,同步的改变小圆圈的对应。不操作时会自动跳转图片-->
    <!-- 1、添加图片 -->
    <div class="nav">
        <div class="box">
            <div class="img">
                <a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="current"><img src="https://p1.music.126.net/j-TpUI1sHtMz0SRzu6L_Ig==/109951167232808852.jpg?imageView&quality=89" alt=""></a>
                <a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><img src=" https://p1.music.126.net/Q-GYxr6Opgmveo7cTulcOw==/109951167232940234.jpg?imageView&quality=89" alt=""></a>
                <a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" > <img src="https://p1.music.126.net/9lvqxXnb-uXiGE0n4ChJiA==/109951167232823192.jpg?imageView&quality=89" alt=""></a>
                <a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" > <img src="https://p1.music.126.net/GnAlY92neUdHWfAGwWz_cQ==/109951167232850389.jpg?imageView&quality=89" alt=""></a>
            </div>
 
            <!-- 2、添加左右箭头 -->
            <div class="right"><img src="right.png" alt=""></div>
            <div class="left"><img src="left.png" alt=""></div>
            <!-- 3、添加下面的小圆圈 -->
            <ul>
 
            </ul>
 
        </div>
 
    </div>
 
 
 
</body>
 
</html>
* {
    margin: 0px;
    padding: 0px;
}
 
.box {
    position: relative;
    width: 1200px;
    height: 500px;
    margin: auto;
}
 
.img {
    width: 1200px;
    height: 500px;
    margin: auto;
    overflow: hidden;
}
 
img {
    width: 100%;
    height: 100%
}
 
.nav {
    width: 100%;
    height: 500px;
    margin-top: 20px;
    /* 这个url地址需要根据img图片的显示来改变的 */
    background-image: url(https://p1.music.126.net/j-TpUI1sHtMz0SRzu6L_Ig==/109951167232808852.jpg?imageView&blur=40x20);
    background-repeat: no-repeat;
    background-size: 100%;
}
 
.right,
.left {
    width: 80px;
    height: 120px;
    position: absolute;
    top: 210px;
    right: -80px;
}
 
.left {
    left: -80px;
}
 
.right img,
.left img {
    position: absolute;
    top: 25px;
    left: 15px;
    width: 50px;
    height: 70px;
}
 
.left:hover,
.right:hover {
    background-color: rgba(0, 0, 0, 0.5);
    cursor: pointer;
}
 
ul {
    width: 600px;
    height: 100px;
    position: absolute;
    bottom: -20px;
    left: 340px;
}
 
ul li {
    float: left;
    margin-left: 100px;
    list-style: disc;
    color: rgb(239, 232, 232);
    font-size: 50px;
}
 
ul .there {
    z-index: 2;
    color: rgb(237, 8, 8);
}
 
ul li:hover {
    color: red
}
 
a {
    width: 1200px;
    height: 500px;
    display: none;
}
 
.current {
    display: block;
}
window.onload = function() {
    //定时器,自动改变图片以及背景图以及小圆圈
    var timer = window.setInterval(fun, [3000])
 
    function fun() {
        for (i = 0; i < as.length; i++) {
 
            if (as[i].getAttribute('class') == 'current') {
                flag = i
            }
        }
        //如果flag=as.length-1;那么就让flag=0的a的类变为current,如果flag<as.length-1,那么就让flag+1的a的class变为current
        if (flag == as.length - 1) {
            //排他思想
            for (i = 0; i < as.length; i++) {
                as[i].classList.remove('current')
                lis[i].classList.remove('there')
            }
            as[0].classList.add('current')
            lis[0].classList.add('there')
            e = 0
        }
        if (flag < as.length - 1) {
            for (i = 0; i < as.length; i++) {
                as[i].classList.remove('current')
                lis[i].classList.remove('there')
            }
            as[flag + 1].classList.add('current')
            lis[flag + 1].classList.add('there')
            e = flag + 1
        }
        fn(e)
    }
    timer = setInterval(fun, [3000])
        //点击的时候需要先把定时器关闭
        // 应该时根据img图片(直接根据a链接吧)的数量来动态生成li
    var as = document.querySelectorAll('a')
    var ul = document.querySelector('ul')
    var nav = document.querySelector('.nav')
    for (i = 0; i < as.length; i++) {
        // 创建元素
        var li = document.createElement('li')
        ul.appendChild(li)
            //添加元素
    }
    //给按钮添加点击事件
    var flag
    var left = document.querySelector('.left')
    var right = document.querySelector('.right')
    var lis = document.querySelectorAll('li')
    lis[0].classList.add('there')
    console.log(lis);
    left.addEventListener('click', function() {
            window.clearInterval(timer)
                //左边按钮按下一次,图片往左边变化一张,相当于要获得当前显示的a是第几个
                //对所有的as进行遍历,看那个a的class类为current,然后获得这个编号
                //i不能用来索引
                //还要让对应的li添加there这个类名
            for (i = 0; i < as.length; i++) {
                if (as[i].getAttribute('class') == 'current') {
                    flag = i
                }
            }
            //如果flag=0;那么就让flag=as.length的a的类变为current,如果flag>0,那么就让flag-1的a的class变为current
            if (flag == 0) {
                //排他思想
                for (i = 0; i < as.length; i++) {
                    as[i].classList.remove('current')
                    lis[i].classList.remove('there')
                }
                as[as.length - 1].classList.add('current')
                lis[as.length - 1].classList.add('there')
                e = as.length - 1
            }
            if (flag > 0) {
                for (i = 0; i < as.length; i++) {
                    as[i].classList.remove('current')
                    lis[i].classList.remove('there')
                }
                as[flag - 1].classList.add('current')
                lis[flag - 1].classList.add('there')
                e = flag - 1
            }
            fn(e)
            timer = setInterval(fun, [3000])
        })
        //类似的添加右边按钮的点击事件
    right.addEventListener('click', function() {
            window.clearInterval(timer)
                //左边按钮按下一次,图片往右边变化一张,相当于要获得当前显示的a是第几个
                //对所有的as进行遍历,看那个a的class类为current,然后获得这个编号
                //i不能用来索引
                //还要让对应的li添加there这个类名
            for (i = 0; i < as.length; i++) {
                if (as[i].getAttribute('class') == 'current') {
                    flag = i
                }
            }
            //如果flag=as.length-1;那么就让flag=0的a的类变为current,如果flag<as.length-1,那么就让flag+1的a的class变为current
            if (flag == as.length - 1) {
                //排他思想
                for (i = 0; i < as.length; i++) {
                    as[i].classList.remove('current')
                    lis[i].classList.remove('there')
                }
                as[0].classList.add('current')
                lis[0].classList.add('there')
                e = 0
            }
            if (flag < as.length - 1) {
                for (i = 0; i < as.length; i++) {
                    as[i].classList.remove('current')
                    lis[i].classList.remove('there')
                }
                as[flag + 1].classList.add('current')
                lis[flag + 1].classList.add('there')
                e = flag + 1
            }
            fn(e)
            timer = setInterval(fun, [3000])
        })
        //现在再给下面的小圆圈添加点击事件
        //当按下小圆圈的时候获得this,那么要获得是第几个小圆圈产生事件,需要自定义属性一个编号。然后用这个编号去设置as[]的类
        //自定义属性
    for (i = 0; i < lis.length; i++) {
        lis[i].setAttribute('index', i)
    }
    //添加事件,因为要给每个小圆圈添加点击事件,不如直接使用事件委托,将事件监听器设置再ul上面,利用冒泡原理委托到li上
    ul.addEventListener('click', function(e) { //为了全局性,直接使用flag
            window.clearInterval(timer)
            flag = (e.target.getAttribute('index'));
            if (flag) {
                for (i = 0; i < as.length; i++) {
                    as[i].classList.remove('current')
                    lis[i].classList.remove('there')
                }
                as[flag].classList.add('current')
                lis[flag].classList.add('there')
            }
            e = flag
            fn(e)
            timer = setInterval(fun, [3000])
        })
        //根据flag的值去改变box的url
    function fn(e) {
        if (e == 0) {
            nav.style.backgroundImage = 'url(https://p1.music.126.net/j-TpUI1sHtMz0SRzu6L_Ig==/109951167232808852.jpg?imageView&blur=40x20)'
        }
        if (e == 1) {
            nav.style.backgroundImage = 'url(https://p1.music.126.net/Q-GYxr6Opgmveo7cTulcOw==/109951167232940234.jpg?imageView&blur=40x20)'
        }
        if (e == 2) {
            nav.style.backgroundImage = 'url(https://p1.music.126.net/9lvqxXnb-uXiGE0n4ChJiA==/109951167232823192.jpg?imageView&blur=40x20)'
        }
        if (e == 3) {
            nav.style.backgroundImage = 'url(https://p1.music.126.net/GnAlY92neUdHWfAGwWz_cQ==/109951167232850389.jpg?imageView&blur=40x20)'
        }
    }
}

以上就是JavaScript模拟实现网易云轮播效果的详细内容,更多关于JavaScript轮播的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Javascript条件判断使用小技巧总结
Sep 08 Javascript
利用javascript实现一些常用软件的下载导航
Aug 03 Javascript
JQuery jsonp 使用示例代码
Aug 12 Javascript
js禁止页面刷新与后退的方法
Jun 08 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
Dec 03 Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
Feb 22 Javascript
在Vue中使用Compass的方法
Mar 02 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
Sep 04 Javascript
mui js控制开关状态、修改switch开关的值方法
Sep 03 Javascript
vue实现从外部修改组件内部的变量的值
Jul 30 Javascript
js 执行上下文和作用域的相关总结
Feb 08 Javascript
Javascript中Microtask和Macrotask鲜为人知的知识点
vue中div禁止点击事件的实现
Apr 02 #Vue.js
Vue组件更新数据v-model不生效的解决
Apr 02 #Vue.js
Vue+TypeScript中处理computed方式
Apr 02 #Vue.js
Vue+Flask实现图片传输功能
Apr 01 #Vue.js
在vue中import()语法不能传入变量的问题及解决
Apr 01 #Vue.js
Vue中使用import进行路由懒加载的原理分析
Apr 01 #Vue.js
You might like
php组合排序简单实现方法
2016/10/15 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
推荐dojo学习笔记
2007/03/24 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
node.js学习之断言assert的使用示例
2017/09/28 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
JS随机密码生成算法
2019/09/23 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
Python正则表达式使用范例分享
2016/12/04 Python
python针对excel的操作技巧
2018/03/13 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
将python代码和注释分离的方法
2018/04/21 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
python中树与树的表示知识点总结
2019/09/14 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
python如何求100以内的素数
2020/05/27 Python
Pandas之缺失数据的实现
2021/01/06 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
护理专业本科生自荐信
2013/10/01 职场文书
个人找工作的自我评价
2013/10/17 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
学校社会实践活动总结
2014/07/03 职场文书