原生JS实现轮播图详细含源码

1.静态布局介绍

1.1 HTML布局介绍

<div class="all" id='box'>
        <div class="screen">
            <ul>
                <li><img src="images/01.jpg" width="500" height="200" /></li>
                <li><img src="images/02.jpg" width="500" height="200" /></li>
                <li><img src="images/03.jpg" width="500" height="200" /></li>
                <li><img src="images/04.jpg" width="500" height="200" /></li>
                <li><img src="images/05.jpg" width="500" height="200" /></li>
                <li><img src="images/01.jpg" width="500" height="200" /></li>
            </ul>
            <ol>
                <li class="current">1</li>
                <li>2</li>
                <li>3</li>
                <li>4</li>
                <li>5</li>
            </ol>
        </div>
        <div id="arr">
            <span id="left">&lt;</span>
            <span id="right">&gt;</span>
        </div>
    </div>

1.2 CSS代码

* {
            padding: 0;
            margin: 0;
            list-style: none;
            border: 0;
        }

        .all {
            width: 500px;
            height: 200px;
            padding: 7px;
            border: 1px solid #ccc;
            margin: 100px auto;
            position: relative;
        }

        .screen {
            width: 500px;
            height: 200px;
            overflow: hidden;
            position: relative;
        }

        .screen li {
            width: 500px;
            height: 200px;
            overflow: hidden;
            float: left;
        }

        .screen ul {
            position: absolute;
            left: 0;
            top: 0px;
            width: 3000px;
        }

        .all ol {
            position: absolute;
            right: 10px;
            bottom: 10px;
            line-height: 20px;
            text-align: center;
        }

        .all ol li {
            float: left;
            width: 20px;
            height: 20px;
            background: #fff;
            border: 1px solid #ccc;
            margin-left: 10px;
            cursor: pointer;
        }

        .all ol li.current {
            background: yellow;
        }

        #arr {
            display: none;
        }

        #arr span {
            width: 40px;
            height: 40px;
            position: absolute;
            left: 5px;
            top: 50%;
            margin-top: -20px;
            background: #000;
            cursor: pointer;
            line-height: 40px;
            text-align: center;
            font-weight: bold;
            font-family: '黑体';
            font-size: 30px;
            color: #fff;
            opacity: 0.3;
            border: 1px solid #fff;
        }

        #arr #right {
            right: 5px;
            left: auto;
        }

核心思路就是在最后一张图后面再加一张与第一张一模一样的图,记得ul宽度要放得下所有图片
效果图如下:
在这里插入图片描述
实现的大概思路就是,ul里面放图片,然后给ul绝对定位,通过动画来改变ul定位位置,每次移动一个图片宽的距离
在这里插入图片描述
overflow:hidden,溢出隐藏效果如下图:
在这里插入图片描述

2.核心js代码及思路

开发思路:
1. 获取页面元素
2. 完成事件1 : 鼠标移入移出box
3. 完成事件2 : 鼠标单击上一页下一页
4. 完成事件3 : 鼠标单击页码

接下来根据思路一步一步实现吧~

1. 获取页面元素

//1. 获取页面元素
    var box = document.querySelector('#box');//获取大盒子
    var screen = document.querySelector('.screen');//获取图片展示区
    var ul = document.querySelector('ul');//获取ul列表
    var olList = document.querySelectorAll('ol>li');//获取ol页码
    var arr = document.querySelector('#arr');//获取上下页
    var left = document.querySelector('#left');//获取上一页
    var right = document.querySelector('#right');//获取下一页

    var index = 0;//申明变量存储下标

2. 完成事件1 : 鼠标移入移出box

//2. 完成事件1 : 鼠标移入移出box 显示/隐藏上下页
    //鼠标移入
    box.onmouseover=function(){
        arr.style.display = 'block';
    }
    //鼠标移出
    box.onmouseout=function(){
        arr.style.display = 'none';
    }

3. 完成事件2 : 鼠标单击上一页下一页
完成上下页之前,首先准备一个缓动动画函数,次函数详情可见:https://blog.csdn.net/weixin_44427998/article/details/106526614

//移动函数
    function animationSlow(ele,target){
        //1.清除以前定时器,以本次为准
        clearInterval(ele.timeID);
        //2.开启定时器
        ele.timeID = setInterval(function(){
            //2.1获取元素当前位置
            var current = ele.offsetLeft;
            //2.2计算每次移动距离 (目标位置 - 当前位置)/10
            var step = (target - current)/10
            //2.3取整 大于零 从左往右 向下取整 小于零 从右往左 向下取整
            step = step > 0 ? Math.ceil(step) : Math.floor(step);
            //2.4移动
            current += step;
            ele.style.left = current + 'px';
            //2.5终点检测
            if( current == target){
                clearInterval(ele.timeID);
            }
        },20);
    }

点击下一页

//点击下一页
    right.onclick=function(){
        //当下标为ul图片列表最大下标时,将下标回到0
        if(index == ul.children.length-1){
            ul.style.left = '0px';
            index = 0;
        }
        index++;
        animationSlow(ul,-screen.offsetWidth * index);
        //修改页码样式
        for(var i = 0;i<olList.length;i++){
            if(index == i){
                olList[i].className = 'current';
            }else {
                olList[i].className = '';
            }
        }
         //如果是最后一个下标 由于ol没有对应下标 此时给ol第一个页码添加样式
         if(index == ul.children.length-1){
            olList[0].className = 'current';
        }

点击上一页

//点击上一页
    left.onclick=function(){
        //当下标为0时,瞬间将下标改为ul图片列表最大下标
        if(index == 0){
                        // -  图片宽度        *   ul最后一张图片下标  = 显示最后一张图
            ul.style.left = -(screen.offsetWidth) * (ul.children.length-1) + 'px';
            index = ul.children.length-1;
        }
        index--;
        animationSlow(ul,-screen.offsetWidth * index);
        //修改页码样式
        for(var i = 0;i<olList.length;i++){
            if(index == i){
                olList[i].className = 'current';
            }else {
                olList[i].className = '';
            }
        }
    }

4. 完成事件3 : 鼠标单击页码

for(var i = 0;i<olList.length;i++){
        olList[i].setAttribute('yemaIndex',i);//给页码添加自定义样式,存储下标
        olList[i].onclick=function(){
            //获取当前点击页码下标
            index = this.getAttribute('yemaIndex');
            animationSlow(ul,-screen.offsetWidth * index);
            //给点击的页码添加样式
            for(var j = 0;j<olList.length;j++){
                if(index == j){
                    olList[j].className = 'current';
                }else {
                    olList[j].className = '';
                }
            }
        }
    }

到此整个轮播图就完成啦,如果需要自动轮播,将下一页点击事件封装为函数,来个定时器就可以啦~

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常好的问题!以下是一个基本的原生 JavaScript 轮播图实现: HTML ```html <div class="slider"> <div class="slider-wrapper"> <div class="slider-item"></div> <div class="slider-item"></div> <div class="slider-item"></div> </div> <div class="slider-nav"> <a class="slider-prev" href="#">Prev</a> <a class="slider-next" href="#">Next</a> </div> </div> ``` CSS ```css .slider { position: relative; width: 100%; height: 300px; overflow: hidden; } .slider-wrapper { position: absolute; top: 0; left: 0; height: 100%; width: 300%; display: flex; transition: transform 0.3s ease-in-out; } .slider-item { height: 100%; width: 33.333%; } .slider-nav { position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); z-index: 10; display: flex; } .slider-prev, .slider-next { margin: 0 10px; padding: 5px 10px; background-color: #ddd; border-radius: 3px; } .slider-prev:hover, .slider-next:hover { background-color: #bbb; } ``` JavaScript ```js const sliderWrapper = document.querySelector('.slider-wrapper'); const prevBtn = document.querySelector('.slider-prev'); const nextBtn = document.querySelector('.slider-next'); const sliderItems = document.querySelectorAll('.slider-item'); const itemWidth = sliderItems[0].offsetWidth; let position = 0; nextBtn.addEventListener('click', () => { position -= itemWidth; if (position < -itemWidth * (sliderItems.length - 1)) { position = 0; } moveToPosition(); }); prevBtn.addEventListener('click', () => { position += itemWidth; if (position > 0) { position = -itemWidth * (sliderItems.length - 1); } moveToPosition(); }); function moveToPosition() { sliderWrapper.style.transform = `translateX(${position}px)`; } ``` 这个例子通过改变 sliderWrapper 的 transform 属性来移动轮播图的位置。prevBtn 和 nextBtn 的点击事件分别减小或增加 position 值,而 moveToPosition 函数将新的 position 值应用到 sliderWrapper 上,实现轮播图的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值