浅谈轮播图(原生JavaScript实现)

现在各种轮播图插件,玲琅满目,用起来也非常方便,通常只需要选择元素然后传入参数就可以了。但是,和授人以鱼不如授人以渔一样的道理,不管怎样最基本的轮播图原理还是应当掌握的。这样不仅有利于我们自己写出来满足自己要求的轮播图,同时也对我们更好的使用其他插件有帮助。当然,最重要的是扎实我们的JavaScript基本功!

切入正题。

轮播,顾名思义,就是图片的循环“播放”。播放可以自动(定时器)也可以手动(按钮)。轮播的精要其实是切换,切换可以是上下左右不同方向的移动来实现切换,移动可以匀速小步调播放的帧动画可以是一步一幅的“僵尸跳”,也可以是透明度渐变。

一,最基本的图片轮播。

最基本的图片轮播有两种基本形式:

  第一种是要轮播的图片排列在一张画布上,画布之上有一个“窗口”,窗口固定,图片的轮播通过移动窗口之下的画布来实现(一般通过操纵它的margin-top或者left来实现)简称为‘视窗画布型’;

  第二种,不需要画布层,窗口的宽高严格等于元素的宽高,通过精准的控制每一个元素的展示层级来实现轮播(一般使用绝对定位来实现)‘绝对定位型’。下面来逐一进行分析。

(1)视窗画布型

这种类型有一个固定的模式,要点如下:

html和css:

第一,需要有固定大小并有超出隐藏属性的div,作为窗口即视窗。

第二,窗口元素内,需要有固定宽度或者高度(取决于你的轮播是左右还是上下切换)的画布元素,它用来容纳你的所有轮播内容,宽度或者高度通常大于窗口元素。

第三,需要展示的内容,固定排列在画布元素上,即第二所述元素;

JavaScript:

第一,动画效果的实现是通过JavaScript操纵画布元素的margin-top,或者margin-left来实现的。

第二,为了实现连续的变换,通常需要画布元素内,对原始内容重复添加;

示例1:等间隔切换的图片。每隔一定时间段,会切换一张图片,切换是瞬时的,和一个常见的轮播图相比缺少切换时的动画效果,先理解一个一个的组件。主要思路是:通过定时器控制,每隔一定时间间隔操作一次元素属性,使之改变,从而实现等间隔切换。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>简单轮播图</title>
    </head>
    <style>
        ul,li{list-style: none;padding: 0;margin: 0;}
        ul{font-size: 0px;}
        .window{width: 300px;height: 200px;overflow: hidden;margin: 60px auto;}
        .canvas{width: 6666px;height: 200px;}
        .canvas img{height: 200px;width:300px;}
        ul li{display: inline-block;width: 300px;text-align: center;}
    </style>
    <body>
        <div class="window">
            <div class="canvas">
                <ul>
                    <li><img src="images/muwu.jpg"></li>
                    <li><img src="images/shuijiao.jpg"></li>
                    <li><img src="images/yuantiao.jpg"</li>
                </ul>
            </div>
        </div>
    </body>
    <script>
//        通过操作画布元素的左外边距实现左右轮播
        //取得视窗和画布元素,定义静态变量
        var window1=document.getElementsByClassName(‘window‘)[0],
            canvas=document.getElementsByClassName(‘canvas‘)[0],
            stepDistance=300,//每次移动的小距离,也就是没帧位移,单位为像素
            i=0,
            sum=document.getElementsByTagName(‘li‘).length;//轮播子项目总数
        //操纵外边距
        sliderMove();
        function sliderMove(){
            //每隔两秒钟切换一次轮播图,到达末尾时从第一张开始。
            setInterval(function(){
                if (i<sum) {
//                    当子项没有完全展示完时,不断移动
                    canvas.style.marginLeft=(-stepDistance*i)+‘px‘;
                    i++;
                } else{
//                    当子项展示完时,从头开始循环
                    i=0;
                    canvas.style.marginLeft=(-stepDistance*i)+‘px‘;
                    i++;
                }
            },2000);
        }
    </script>
</html>

这种简单的轮播图,我觉得给它起名为“僵尸跳”,很合适。是在轮播,不过,不和谐, 一次一跳很突兀。

示例2:一直移动的效果,其实也就是第一种实例的细化,帧间隔变大,帧位移变小。图片之间一直在匀速移动,和一个常见的轮播图相比缺少切换时的停顿,即第一个示例的效果,先理解一个一个的组件。主要思路是:通过定时器,在很短的时间内连续移动元素,从而产生类似动画的效果。下面贴上代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>简单轮播图</title>
    </head>
    <style>
        ul,li{list-style: none;padding: 0;margin: 0;}
        ul{font-size: 0px;}
        .window{width: 300px;height: 200px;overflow: hidden;margin: 60px auto;}
        .canvas{width: 6666px;height: 200px;}
        .canvas img{height: 200px;width:300px;}
        ul li{display: inline-block;width: 300px;text-align: center;}
    </style>
    <body>
        <div class="window">
            <div class="canvas">
                <ul>
                    <li><img src="images/muwu.jpg"></li>
                    <li><img src="images/shuijiao.jpg"></li>
                    <li><img src="images/yuantiao.jpg"</li>
                    <li><img src="images/muwu.jpg"></li>
                </ul>
            </div>
        </div>
    </body>
    <script>
        var window1=document.getElementsByClassName(‘window‘)[0],
            canvas=document.getElementsByClassName(‘canvas‘)[0],
            stepDistance=300/(3000/13),
            sumDistance=0,
            sum=(document.getElementsByTagName(‘li‘).length-1)*300;
        sliderMove();
        function sliderMove(){
            setInterval(function(){
                if (sumDistance<sum) {
                    canvas.style.marginLeft=(-sumDistance)+‘px‘;
                    sumDistance+=stepDistance;
                } else{
                    sumDistance=0;
                    canvas.style.marginLeft=(-sumDistance)+‘px‘;
                    sumDistance+=stepDistance;
                }
            },13);
        }
    </script>
</html>

这个其实是我们后面要说的轮播的同时移动的移动部分的简单原理。其实,无论移动还是停顿都是通过定时器来实现的。

(2)绝对定位型

这是通过操纵元素的z-index来实现切换的动画类型。

二,轮播的同时移动。

三,带按钮的轮播图。

四,有其他特效的轮播图。

五,一些我用过的轮播图插件简介。

未完待续。。。

原文地址:https://www.cnblogs.com/benxiaohai-microcosm/p/6147176.html

时间: 2024-08-13 18:15:12

浅谈轮播图(原生JavaScript实现)的相关文章

Web前端原生JavaScript浅谈轮播图

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

用原生的javascript 实现一个无限滚动的轮播图

说一下思路:和我上一篇博客中用JQ去写的轮播图有相同点和不同点 相同点: 首先页面布局是一样的 同样是改变.inner盒子的位置去显示不同的图片 不同点: 为了实现无限滚动需要多添加两张重复的图片 左右切换和前面的方法有所不同,前面是获取当前的索引值乘以-600px当做位移距离,现在是需要获取当前.inner的位置来加上或者减去-600来实现 下面来一步步的去实现轮播图: 首先是html <!DOCTYPE html> <html lang="en"> <

原生javascript轮播图!

<style> .box { width: 500px; height: 275px; position: relative; margin: 100px auto; } a { text-decoration: none; font-size: 28px; text-align: center; line-height: 80px; display: inline-block; width: 40px; color:#fff; background:rgba(0,0,0,0.6); posi

纯原生javascript仿网易轮播图

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

原生JavaScript实现无缝轮播图

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

原生javascript之实战 轮播图

成品效果如下图所示: 因为博客园限制图片上传大小被我删了一些帧数,所以图片看起来会有一点卡,现实运行是不会的 搭建HTML和CSS结构 HTML代码如下: 1 <div class="wrapper"> 2 <ul class="sliderPage"> 3 <li> 4 <img src="images/1.jpg"> 5 </li> 6 <li> 7 <img sr

原生js实现的3个小特效(时钟、轮播图、选项卡)

时钟: <p id="timeTxt"></p>  //将获取到的时间显示在timeTxt这里面        <button onclick="startTime()">关闭</button>        <!--时钟-->        function startTime(){  //创建startTime()函数            var today=new Date();  //定义一个对象

简要分析javascript的选项卡和轮播图

选项卡 思路 1.按钮和展示的页面要对应:分别遍历,记住当前按钮的索引,让其成为展示页面的索引 2.只出现所对应的页面:所有的页面隐藏,只展示想要的页面 只展示js代码 for(var i=0;i<input.length;i++){ input[i].index=i //让浏览器解析HTML文档时,保存每一个input的索引 input[i].onclick=function(){ for(var j=0;j<div.length;j++){ //所有的div为隐藏 div[j].style

封装一个简单的原生js焦点轮播图插件

轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放.本篇文章的主要目的是分享封装插件的思路. 轮播图的我一开始是写成非插件形式实现的效果,后来才改成了封装成插件的形式. 首先要明白轮播图的实现原理和基本布局,大概就是外面有一个容器包裹着(通常是div),容器设置宽高,以及overflow为hidden,超出宽高部分隐藏, 容器里面又包含着另一个容器,包裹着所有的图片,宽为所有图片的总宽度,ul的position为absolute,通过改变ul的left