轮播图demo左右滑动-移动端

本文介绍了一款移动端图片轮播的实现方法,通过触摸事件实现图片左右滑动切换,利用JavaScript监听touchstart、touchmove和touchend事件,配合CSS样式完成过渡效果。

轮播图demo左右滑动-移动端

1、和前三篇的素材都差不多,这里实现的是移动端的图片轮播,使用的是targetTouches获取到点击的位置和移动到的位置,相减就为移动的距离

2、在轮播的时候,很多代码重复了,可以加一个方法优化,这里为了更加直观就不加了

有注释,直接上代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>轮播图demo左右滑动-移动端</title>
    <style>
        /* 轮播图 */
        /* 去掉默认样式 */
        li,i,ul{
            list-style: none;
            margin: 0;
            padding: 0;
        }
        body,html{
            margin: 0;
            padding: 0;
            width: 100vw;
        }
        .swiper{
            margin: 100px auto;
            /* overflow: hidden; */
            height: 200px;
            width: 100vw;
            position: relative;
        }
        .swiper ul{
            position: absolute;
            top: 0;
            left: 0;
            height: 200px;
            width: 600%;
            /* 一开始从第二张图片开始 */
            margin-left: -100%;
        }
        .swiper ul li{
            width: 100vw;
            height: 200px;
            float: left;
        }
        .swiper img{
            display: block;
            width: 100%;
            height: 100%;
        }
        /* 小圆圈 */
        .bullets{
            position: absolute;
            bottom: 10px;
            right: 20px;
            width: 200px;
            height: 20px;
            text-align: right;
        }
        .bullets i{
            display: inline-block;
            height: 5px;
            width: 5px;
            border: 3px solid #cccccc;
            background-color: #e0e0e0;
            border-radius: 5px;
            margin: 0 3px;
        }
        .bullets .active{
            background-color: #ffffff;
            width: 15px;
        }
    </style>
</head>
<body>
    <div class="swiper">
        <!-- 轮播的图片 -->
        <ul></ul>
        <!-- 小圆圈 -->
        <div class="bullets"></div>
    </div>
    <script>
        // 定义一些中间值
        let num=0//记录图片滚动,滚动一次就+1,这里不会点击小圈变到相应的index,手机屏幕就这么小,就简单地左右滑动就好了
        let startX=0//手指一开始点击的位置
        let moveX=0//手指移动的距离
        let flag=false//判断是否移动过,相当于节流的作用

        // 获取元素
        let swiper=document.querySelector('.swiper')
        let ul=document.querySelector('.swiper ul')
        let bullets=document.querySelector('.bullets')

        // 动态添加图片和小圈
        let arr=['./img/main-back-1.jpg','./img/main-back-2.jpg','./img/main-back-3.jpg','./img/main-back-4.jpg']
        let html=''
        for(let i=0;i<arr.length;i++){
            html+='<li><a><img src='+arr[i]+'></img></a></li>'
            // 这里生成小圈
            let ii=document.createElement('i')
            ii.setAttribute('index',i)
            bullets.appendChild(ii)
        }
        ul.innerHTML=html

        // 准备工作
        // 在ul的前面克隆ul的最后一张和在ul的后面克隆ul的第一张
        // 1、选获取ul的左右子节点
        let child_node=ul.children
        let length=child_node.length//后面会用到
        // 2、先克隆节点   这里先全部获取,因为.children是实时更新的
        // 使用.children获取的是元素对象是一个实时更新的列表 可以看做一个数组对象 而使用querySelectorAll获取的是NodeList 与其他方式获取的NodeList不同 它不是节点集合 而是元素集合 并且是静态的 不会实时更新 相当于克隆了一个新数组
        let last_node=child_node[child_node.length-1].cloneNode(true)
        let first_node=child_node[0].cloneNode(true)
        // 3、最后一张图片加在第一张图片的前面
        ul.insertBefore(last_node,child_node[0])
        // 4、第一张图片加在最后一张图片的后面
        ul.appendChild(first_node)
        // 5、默认第一个小圈是active
        bullets.children[0].className='active'

        // 自动轮博
        let timer=setInterval(function(){
            num++
            ul.style.transition='all .3s'
            let translateX=-num*swiper.offsetWidth
            ul.style.transform='translateX('+translateX+'px)'
        },3000)

        // 过渡结束后的事件
        ul.addEventListener('transitionend',function(){
            // 每次过渡结束之后都要判断一下是否到了边界值,到了就重新赋值,并且迅速出现在在该出现的位置
            if(num>=length){//等于第五张(实际的第六张)的时候,马上变为第一张(实际的第二张)(因为这里实际是从第二张开始的)
                num=0
                ul.style.transition='none'
                let translateX=-num*swiper.offsetWidth
                ul.style.transform='translateX('+translateX+'px)'
            }else if(num<0){
                num=length-1//等于第一张的前一张(实际的第一张)的时候,马上变为第五张的前一张(实际的第五张)
                ul.style.transition='none'
                let translateX=-num*swiper.offsetWidth
                ul.style.transform='translateX('+translateX+'px)'
            }
            // 小圆点跟随变化
            bullets.children[num].style.transition='all .3s'
            // 补充:classList 属性返回元素的类名,作为 DOMTokenList 对象。
            bullets.querySelector('.active').classList.remove('active')
            bullets.children[num].classList.add('active')
            // 也可以这样写   上面这个方法好一些,因为,如果下面的元素还存在其它的class就会被覆盖
            // for(let i=0;i<bullets.children.length;i++){
            //     bullets.children[i].className=''
            // }
            // bullets.children[num].className='active'
        })

        // 手指滑动开始
        ul.addEventListener('touchstart',function(e){
            startX=e.targetTouches[0].pageX
            // 滑动的时候就不轮播
            clearInterval(timer)
        })

        // 手指移动的时候
        ul.addEventListener('touchmove',function(e){
            // 手指移动的距离  这里就是让它滑动到足够大的距离的时候就可以翻到下一张图片
            moveX=e.targetTouches[0].pageX-startX
            ul.style.transition='none'
            let translateX=-num*swiper.offsetWidth+moveX
            ul.style.transform='translateX('+translateX+'px)'
            // 这个时候就是滑动了
            flag=true
            // 去掉默认的滚动
            e.preventDefault()
        })

        // 手指离开的时候
        ul.addEventListener('touchend',function(e){
            if(flag){
                // 大于50就播放下一张
                if(Math.abs(moveX)>50){
                    if(moveX>0){
                        num--
                    }else{
                        num++
                    }
                    // 过渡到下一张
                    ul.style.transition='all .3s'
                    let translateX=-num*swiper.offsetWidth
                    ul.style.transform='translateX('+translateX+'px)'
                }else{
                    // 返回原来这一张
                    ul.style.transition='all .1s'
                    let translateX=-num*swiper.offsetWidth
                    ul.style.transform='translateX('+translateX+'px)'
                }
            }
            // 开始定时器
            timer=setInterval(function(){
                num++
                ul.style.transition='all .3s'
                let translateX=-num*swiper.offsetWidth
                ul.style.transform='translateX('+translateX+'px)'
            },3000)
        })
    </script>
</body>
</html>
作为自己学习过程的总结,菜鸡一枚,有什么问题与错误,请不吝赐教
独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)内容概要:本文围绕“独立储能的现货电能量与调频辅助服务市场出清协调机制”展开,提出了一种基于Matlab代码实现的优化模型,旨在协调独立储能系统在电力现货市场与调频辅助服务市场中的联合出清问题。文中结合鲁棒优化、大M法和C&CG算法处理不确定性因素,构建了多市场耦合的双层或两阶段优化框架,实现了储能资源在能量市场和辅助服务市场间的最优分配。研究涵盖了市场出清机制设计、储能运行策略建模、不确定性建模及求解算法实现,并通过Matlab仿真验证了所提方法的有效性和经济性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事电力市场、储能调度相关工作的工程技术人员。; 使用场景及目标:①用于研究独立储能在多电力市场环境下的协同优化运行机制;②支撑电力市场机制设计、储能参与市场的竞价策略分析及政策仿真;③为学术论文复现、课题研究和技术开发提供可运行的代码参考。; 阅读建议:建议读者结合文档中提供的Matlab代码与算法原理同步学习,重点关注模型构建逻辑、不确定性处理方式及C&CG算法的具体实现步骤,宜在掌握基础优化理论的前提下进行深入研读与仿真调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值