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 相关文章推荐
jquery 经典动画菜单效果代码
Jan 26 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
May 08 Javascript
jquery自定义函数的多种方法
Jan 09 Javascript
vue使用stompjs实现mqtt消息推送通知
Jun 22 Javascript
JavaScript实现QQ列表展开收缩扩展功能
Oct 30 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
Nov 27 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
从零开始封装自己的自定义Vue组件
Oct 09 Javascript
详解Vue底部导航栏组件
May 02 Javascript
少女风vue组件库的制作全过程
May 15 Javascript
JavaScript实现简单的图片切换功能(实例代码)
Apr 10 Javascript
javascript实现画板功能
Apr 12 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
对盗链说再见...
2006/10/09 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
JavaScript经典效果集锦
2010/07/06 Javascript
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
jquery 3D 标签云示例代码
2014/06/12 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
python实现自主查询实时天气
2018/06/22 Python
python调用tcpdump抓包过滤的方法
2018/07/18 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
Python 绘制可视化折线图
2020/07/22 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
python实现视频压缩功能
2020/12/18 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
广告学专业毕业生自荐信
2013/09/24 职场文书
军校本科大学生自我评价
2014/01/14 职场文书
合作协议书范本
2014/04/17 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电