JavaScript实现简单轮播图动画

运行效果:

源代码:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>轮播图</title>
</head>
<style type="text/css">
    * {
        margin: 0px;
        padding: 0px
    }

    #container {
        margin: 30px auto;
        width: 1280px;
        height: 720px;
        position: relative;
        overflow: hidden;
    }

    #inner-list {
        width: 400%;
        position: absolute;
        top: 0;
        left: 0;
    }

    #inner-list li {
        float: left;
    }

    #dot-list {
        position: absolute;
        bottom: 20px;
        right: 20px;

    }

    #dot-list li {
        float: left;
        display: inline-block;
        width: 20px;
        height: 20px;
        border-radius: 50%;
        line-height: 20px;
        text-align: center;
        background: rgba(255, 255, 255, .3);
        cursor: pointer;
        margin-right: 10px;
    }

    #dot-list li.cur {
        background: rgba(255, 255, 255, .6);
    }

    .btn-ctrl {
        position: absolute;
        cursor: pointer;
        top: 50%;
        font-size: 36px;
        color: red;
        font-weight: 500;
        z-index: 2;
    }

    #btn-prev {
        left: 0px;
    }

    #btn-next {
        right: 0px;
    }
</style>
<body>
<div class="container" id="container">
    <div id="btn-prev" class="btn-ctrl">&lt;</div>
    <div id="btn-next" class="btn-ctrl">&gt;</div>
    <ul id="inner-list">
        <li><img src="https://w.wallhaven.cc/full/nz/wallhaven-nzy6g4.jpg" alt=""/></li>
        <li><img src="https://w.wallhaven.cc/full/0w/wallhaven-0w6z64.jpg" alt=""/></li>
        <li><img src="https://w.wallhaven.cc/full/42/wallhaven-421zm0.jpg" alt=""/></li>
    </ul>
    <ul id="dot-list"></ul>
</div>

<script type="text/javascript">
    window.onload = function () {
        var eleInners = document.getElementById(‘inner-list‘),
            eleDots = document.getElementById(‘dot-list‘),
            liImgs = eleInners.getElementsByTagName(‘li‘),
            liDots = eleDots.children,
            elePrev = document.getElementById(‘btn-prev‘),
            eleNext = document.getElementById(‘btn-next‘),
            LI_WIDTH = liImgs[0].offsetWidth,
            TIME_DURATION = 3000,
            interval = null,
            index = 0,
            circle = 0;
        //首先是克隆
        eleInners.appendChild(liImgs[0].cloneNode(true));
        //生成小点点
        for (var i = 0, len = liImgs.length - 1; i < len; i++) {
            var li = document.createElement(‘li‘);
            li.innerHTML = i + 1;
            eleDots.appendChild(li);
        }
        //第一个点高亮
        liDots[0].className = ‘cur‘;

        //接着是动画,用差值和offsetLeft值和移动的值,给一个speed让它移动
        function animate(obj, targetPlace) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                //判断移动的位置是向左移动还是向右移动
                var speed = obj.offsetLeft > targetPlace ? -15 : 15;
                var result = targetPlace - obj.offsetLeft;
                //只要移动的差值大于speed,那么就一直让obj.style.left 改变
                if (Math.abs(result) > Math.abs(speed)) {
                    obj.style.left = obj.offsetLeft + speed + ‘px‘
                } else {
                    //否则如果已经移动的,obj.offsetleft与要移动的位置十分接近了,
                    obj.style.left = targetPlace + ‘px‘;
                    clearInterval(obj.timer);
                }
            }, 10)

        }

        //接着定时器
        interval = setInterval(autoplay, 5000);

        //向左的autoplay
        function autoplay() {
            index++;
            if (index > liImgs.length - 1) {
                eleInners.style.left = 0;//赶快跳回去
                index = 1;//找到第二张图片
            }
            animate(eleInners, -index * LI_WIDTH);
            circle++;

            if (circle >= liImgs.length - 1) {
                circle = 0;//circle回到第一个点
            }
            for (var i = 0, len = liDots.length; i < len; i++) {
                liDots[i].className = ‘‘;

            }
            liDots[circle].className = ‘cur‘;
        }

        //向右移动
        function moveright() {
            index--;
            if (index < 0) {
                eleInners.style.left = -(liImgs.length - 2) * LI_WIDTH + ‘px‘;
                index = liImgs.length - 2;//找到倒数第二张图片
            }
            animate(eleInners, -index * LI_WIDTH);
            circle--;
            if (circle < 0) {
                circle = liImgs.length - 2;//circle回到最后一个点
            }
            for (var i = 0, len = liDots.length; i < len; i++) {
                liDots[i].className = ‘‘;
            }
            liDots[circle].className = ‘cur‘;
        }

//        鼠标移入,清除定时器
        eleInners.addEventListener(‘mouseenter‘, function (event) {
            clearInterval(interval);
        });
        //        鼠标移出,开启定时器
        eleInners.addEventListener(‘mouseleave‘, function (event) {
            interval = setInterval(autoplay, 5000);
        });
//        点击dots
        eleDots.addEventListener(‘click‘, function (event) {
            clearInterval(interval);
            var target = event.target;
            var currentTarget = event.currentTarget;
            index = target.innerHTML - 0 - 1;
            circle = index;
            for (var i = 0, len = liDots.length; i < len; i++) {
                liDots[i].className = ‘‘;
            }
            liDots[circle].className = ‘cur‘
            animate(eleInners, -index * LI_WIDTH);
        });
        elePrev.addEventListener(‘click‘, function (event) {
            clearInterval(interval);
            moveright();
            interval = setInterval(autoplay, 5000)
        });
        eleNext.addEventListener(‘click‘, function (event) {
            clearInterval(interval);
            autoplay();
            interval = setInterval(autoplay, 5000);
        });
    }
</script>
</body>
</html>

原文地址:https://www.cnblogs.com/yijiahao/p/11742511.html

时间: 2024-10-28 16:29:48

JavaScript实现简单轮播图动画的相关文章

原生js简单轮播图 代码

在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写的插件,今天就写个简单的适合入门者学习的小教程.当然,轮播图的实现原理与设计模式有很多种,我这里讲的是用面向过程函数式编程去实现,相对于面向对象设计模式,代码难免会显得臃肿冗余.但没有面向对象的抽象却很适合新手理解与学习.已经在BAT的同学看到希望少喷点.另外可以多提意见. 轮播图的原理: 一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏.通过计算偏移量利用定时器实现自动播放,或通过

(新手向)基于Bootstrap的简单轮播图的手机实现

个人电脑里存了不少适合手机欣赏的图片,但是放手机里看是件很占据资源的事.鉴于家里有一台电脑经常开着,正好用来做家庭局域网共享,于是笔者就设想通过一种比较简单环保的思路.通过手机访问电脑内的图片. 首先是本地站点搭建:win+R输入mmc打开控制台,文件-添加/删除管理单元,Internet信息服务.添加确定,右侧基本信息,新建网站-把路径改了.设定一个端口号,手机浏览器就可以输入  电脑局域网ip:端口号 就可以连上去了. 接下来问题来了,一个个点击查看然后关闭图片是一件更不环保的事.何不做一个

手把手原生js简单轮播图

在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写的插件,今天就写个简单的适合入门者学习的小教程.当然,轮播图的实现原理与设计模式有很多种,我这里讲的是用面向过程函数式编程去实现,相对于面向对象设计模式,代码难免会显得臃肿冗余.但没有面向对象的抽象却很适合新手理解与学习.已经在BAT的同学看到希望少喷点.另外可以多提意见. 轮播图的原理: 一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏.通过计算偏移量利用定时器实现自动播放,或通过

原生JavaScript实现无缝轮播图

无缝轮播图是页面常用的特效之一,然而在实际的开发过程中,大部分的开发者都会使用插件来对轮播图进行开发,那么它的底层到底是怎么实现的呢,本文章将围绕这一问题展开探讨. 在讨论如何利用原生JS实现图片之间无缝切换轮播的动画效果之前,我们先来谈谈无缝轮播图片的css布局. 首先我们需要一个用来显示图片的DIV容器,然后把想要轮播的图片没有缝隙的排成一行放入DIV容器中,给DIV容器设置 overflow: hidden,这样在页面中就可以只看到一张图片,然后通过利用JS来移动ul的left值就能达到无

js写的简单轮播图

这个轮播图代码是从网上找来的,专门找了个写法简单的,只是作为一个小练习,大概原理如下: 1.首先是图片切换2.自动播放3.调用自动播放4.移动到容器上边停止播放,离开自动播放5.移动到导航上停止播放,离开自动播放6.移动到导航上,切换相对应的导航 然后贴代码: <!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>Docume

纯原生javascript仿网易轮播图

第一次有自己的关于代码的博客,感到诚惶诚恐.这可能是我第一次以程序猿,或者连初级程序猿都不是的身份下开通的个人“技术”(胡写乱写)博客园地.闲言碎语不要讲,咱今天就写一点关于js的代码吧.网易首页大家肯定都去过,在首页左侧部分有个轮播图,效果很好,构思精巧,非常诱人.注,此demo非本人原创,在这里进行个人解读,力求通俗易懂(主要是让我自己明白!). 那么如何实现相关技术,进而实现如图效果呢?下面的进度条是用JQuery写的,这里暂不考虑.下面从三个方面讨论网一轮播图. 一.HTML部分 1 <

vue上的简单轮播图

好久没写轮播图了,今天在vue上写了个超简单的,效果还ok. .moveLeft{position:relative;right:ZOOMpx;transition:all 1s;} 原理是滚动时利用.moveLeft向左移动一个格子,造成滚动的假象,此时第二张图在第一个格子的位置: 这时候把第一个格子 li 的元素摘下接到 ul 末尾,并马上撤掉.moveLeft.每张图都在自己的格子上. 定时器循环该操作,一直轮播.可以用touch事件添加touchmove左右滑动效果和切换图片的功能,就不

JavaScript实现的轮播图

当初学习JavaScript的时候,想学习轮播图是怎么写的,结果在百度搜了半天也很难搜出一个完整的轮播图案例.现在就分享一个用js写的轮播图供大家参考和学习,有什么错误的地方或有更好的方法也请大家提出来,共同讨论和进步. 下面是效果图. <div id="play"> <ol>  //按钮 <li class="active">1</li> <li>2</li> <li>3</

Web前端原生JavaScript浅谈轮播图

1.一直来说轮播图都是困扰刚进业内小白的一大难点,因为我们不仅需要自己作出一个比较完美的运动框架(虽然网上一抓一大把,但是哪有比自己做出来实现的有成就感,不是吗?^_^),还必须需要非常关键性的把握住轮播的原理,这样才能把一个轮播图完美的呈现出来. 2.废话不多说,请看下面代码 1 //首先我们必须都明确,一个好的运动框架那必须是能够同时承载两种或多种以上需求的,所以我们应该避免单运动框架通过行内样式的局限性,就需要我们知道怎么去获取非行间样式 2 function getStyle(obj,a