用js实现点击切换+自动切换的轮播图

用js实现点击切换+自动切换的轮播图

之前博主写过一篇用css实现轮播图的文章,可以看到用css实现的轮播图也能实现我们所需要的功能。那么这些功能用js该如何实现呢?我们一起来看下吧!

(ps:博主在用js写轮播图的过程中,在网上查阅了很多篇文章,但是没有一篇是博主能彻底理解的[笨蛋QAQ],所以这篇博客用来帮助像博主一样没有头绪,看不懂网上部分教程的伙伴)。

首先我们要明白轮播图的滑动原理,假设我们有装着3张图片的大盒子pic,那么我们可以采用定位或者浮动让这3张图片横向排成一排,那么大家想一想我们是不是移动大盒子的左/右边距就能显示出相应的图片呢?那么我们先来看一下代码

HTML:

    <div class="box">
        <!-- 图片 -->
        <ul id="pic">
            <li class="pic_items">1</li>
            <li class="pic_items">2</li>
            <li class="pic_items">3</li>
        </ul>
        <!-- 左右箭头 -->
        <span id="lf"></span>
        <span id="rt"></span>
        <!-- 圆点 -->
        <ul id="cir">
            <li class="cir_items"></li>
            <li class="cir_items"></li>
            <li class="cir_items"></li>
        </ul>
    </div>

CSS:

	
        .box{
            overflow:hidden; 
            width:940px;
            height:100%;
            margin:0 auto;     
        }
        #pic{
            width:2820px;
            height: 500px;
        }
        .pic_items{
            width:940px;
            height:100%;
            float:left;
        }
        .pic_items:nth-child(1){
            background:pink;
        }
        .pic_items:nth-child(2){
            background: gray;
        }
        .pic_items:nth-child(3){
            background:green;
        }

这样就完成了基本的轮播图布局,那么我们再给轮播图添加上圆点和左右切换按钮,一个静态样式的轮播图就完成了。(注意这里要给大盒子开启定位:position:relative;)

CSS

        .box{
            position:relative;
            overflow:hidden; 
            width:940px;
            height:100%;
            margin:0 auto;     
        }
                /* 箭头 */
        span{
            position:absolute;
            width:50px;
            height:100px;
            background:black;
            color:#fff;
            text-align:center;
            line-height:100px;
            cursor: pointer;
        }
        #lf{
            left:0;
            top:50%;
        }
        #rt{
            right:0;
            top:50%;
        }
        /* 圆点 */
        #cir{
            position:absolute;
            bottom:20px;
            right:100px;
            width:100px;
            height:20px;
        }
        .cir_items{
            width:20px;
            height:20px;
            border-radius:10px;
            background:#fff;
            float: left;
            margin-right:10px;
            cursor: pointer;
        }

接下来就到了最重要的js部分,根据之前的思路,我们是不是只需要设置大盒子pic的距离,就可以实现相应图片的切换对吧.那么我们先写出这部分代码:

JS:

        // 获取图片id
        var pic = document.getElementById('pic');
        var picItems = document.getElementsByClassName('pic_items');
        // 获取左右箭头id
        var lf = document.getElementById('lf');
        var rt = document.getElementById('rt');
        // 获取圆点
        var cirItems = document.getElementsByClassName('cir_items');
        // 索引
        var index = 0;
        // 实现移动功能的函数
        function change(){  
            pic.style.marginLeft = -index*940+"px";
        }

这个时候我们去运行程序,发现没有什么效果,为什么呢,那么大家想一想,我们的图片是不是有3张啊,index表示的我们图片的索引。
从0开始。那么在以上的代码中是不是index=0;仅仅显示的是第一张图片。所以我们要想办法改变index的值,才能显示出我们想要显示的图片。我们可以给change()函数传入的一个参数i,这个i就表示我们想要显示的图片。
那我们再想一想,图片只有3张,如果i=4,那么这个我们没有第4张图该怎么办呢,是不是可以让图片从头显示啊,也就是说如果传入的参数i超过了我们的图片总张数,我们可以让图片从头开始显示。反之,如果图片小于我们第一张图片的索引,我们可以让图片从最后一张图开始显示。

JS:

        // 实现移动功能的函数
        function change(i){
            index = i;    
            if(i > picItems.length-1){
                index = 0;
            }
            if(i < 0){
                index = picItems.length - 1;
            }
            pic.style.marginLeft = -index*940+"px";
        }

这样我们算是完成了代码的核心功能部分,那么接下来我们开始实现左右切换功能。仅仅需要在进行左右点击的时候传入相应的参数i就行了。

        // 左切换
        lf.onclick = function(){
            change(--index);
        }
        // 右切换
        rt.onclick = function(){
            change(++index); 
        } 

接着我们进行圆点的切换,思路很简单,我们在点击第一个圆点时,切换到第一张图,只需要把change()函数中的参数i和我们的当前的圆点索引对应起来就行了。

        // 圆点切换:let的作用域是整个代码块,因此可避免使用闭包
        for(let i=0;i<cirItems.length;i++){
            cirItems[i].onclick = function(){
                index = i;
                change(index);
            }
        }

最后,我们只需要给change()函数里面添加一个计时器,实现自动轮播就可以了,但是不要忘记清楚计时器哦

        var timer;
        // 实现移动功能的函数
        function change(i){
            index = i;    
            if(i > picItems.length-1){
                index = 0;
            }
            if(i < 0){
                index = picItems.length - 1;
            }
            clearTimeout(timer);
            pic.style.marginLeft = -index*940+"px";
            timer = setTimeout(function(){change(++index);},2000);
        }

以上就完成了点击切换和自动切换的效果。可以看一下效果图,大家可以给左边距添加以下过渡属性,这样会更自然一点,以下是效果图(未添加过渡属性)
我是轮播图

  • 18
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
图片点击切换: HTML结构: ```html <div class="image-container"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <img src="image3.jpg" alt="Image 3"> </div> ``` CSS样式: ```css .image-container { display: flex; justify-content: center; } .image-container img { width: 200px; height: 200px; margin: 0 10px; cursor: pointer; } ``` JavaScript代码: ```javascript const images = document.querySelectorAll('.image-container img'); let currentImage = 0; // 显示当前选中的图片 function showImage() { images.forEach(image => image.classList.remove('active')); images[currentImage].classList.add('active'); } // 点击图片时切换图片 images.forEach((image, index) => { image.addEventListener('click', () => { currentImage = index; showImage(); }); }); // 显示下一张图片 function nextImage() { currentImage++; if (currentImage >= images.length) { currentImage = 0; } showImage(); } // 每隔 5 秒自动切换图片 setInterval(() => { nextImage(); }, 5000); ``` 轮播: HTML结构: ```html <div class="slider-container"> <div class="slider-images"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <img src="image3.jpg" alt="Image 3"> </div> <button class="slider-button prev-button">Prev</button> <button class="slider-button next-button">Next</button> </div> ``` CSS样式: ```css .slider-container { position: relative; } .slider-images { display: flex; overflow: hidden; } .slider-images img { width: 100%; height: 100%; } .slider-button { position: absolute; top: 50%; transform: translateY(-50%); padding: 10px; background-color: #fff; border: 1px solid #000; cursor: pointer; } .prev-button { left: 10px; } .next-button { right: 10px; } ``` JavaScript代码: ```javascript const sliderImages = document.querySelector('.slider-images'); const prevButton = document.querySelector('.prev-button'); const nextButton = document.querySelector('.next-button'); let currentSlide = 0; // 设置图片容器的宽度 function setSliderWidth() { const numSlides = sliderImages.children.length; sliderImages.style.width = `${numSlides * 100}%`; } // 设置每个幻灯片的宽度 function setSlideWidth() { const slideWidth = `${100 / sliderImages.children.length}%`; Array.from(sliderImages.children).forEach(slide => { slide.style.width = slideWidth; }); } // 显示当前幻灯片 function showSlide() { const slideWidth = parseInt(window.getComputedStyle(sliderImages.children[0]).width, 10); const offset = -1 * currentSlide * slideWidth; sliderImages.style.transform = `translateX(${offset}px)`; } // 显示下一个幻灯片 function nextSlide() { currentSlide++; if (currentSlide >= sliderImages.children.length) { currentSlide = 0; } showSlide(); } // 显示上一个幻灯片 function prevSlide() { currentSlide--; if (currentSlide < 0) { currentSlide = sliderImages.children.length - 1; } showSlide(); } // 设置幻灯片容器和幻灯片的宽度 setSliderWidth(); setSlideWidth(); // 点击按钮切换幻灯片 prevButton.addEventListener('click', prevSlide); nextButton.addEventListener('click', nextSlide); // 每隔 5 秒自动切换幻灯片 setInterval(() => { nextSlide(); }, 5000); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值