用原生js封装轮播图

原生js封装轮播图

对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不懂的可以直接私信我

slide.js
/*
 * 轮播图
 */

function Slide(elem, ms, d, ind){
    this.el = elem;
    this.w = parseInt(getStyle(elem, "width"));
    this.h = parseInt(getStyle(elem, "height"));
    var a = this.el.children;
    this.ul = a[0];
    this.ol = a[1];
    this.lBtn = a[2];
    this.rBtn = a[3];
    this.olspan = this.ol.getElementsByTagName("span");
    this.l = this.olspan.length;
    this.ul.style.width = this.w*(this.l+1)+"px";   // ul的宽度
    this.lBtn.style.top = this.rBtn.style.top = (this.h-this.rBtn.offsetHeight)/2+"px";
    this.ms = ms;   // 每隔多久执行一次滚动
    this.d = d; // 轮播时方向

    this.ul.innerHTML += this.ul.children[0].outerHTML; //将第一张图片复制到最后一个位置上

    var that = this;

    this.now = ind;
    that.prev = -that.now*that.w;

    this.run = function(){
        var i=0, l=that.l, btns=that.olspan, btn;
        for( ; i<l; i++){
            btn = btns[i];
            btn.i = i;
            btn.onclick = function(){
                that.now = this.i;
                that.tab();
            }
        }

        that.timer = setInterval(that.next, that.ms);
        that.el.onmouseover = that.over;
        that.el.onmouseout = that.out;
        that.lBtn.onclick = function(){
            that.now--;
            that.d = -1;
            that.tab();
        }
        that.rBtn.onclick = function(){
            that.now++;
            that.d = 1;
            that.tab();
        }
        that.lBtn.onmousedown = that.rBtn.onmousedown = function(){
            return false;
        }
    }

    this.tab = function(){
        that.ul.style.left = that.prev+"px";    // 每次运动时,先瞬间定位到上一次的目标值,然后再执行本次运动

        if( that.now == that.l ){
            that.prev = 0;
            startMove(that.ul, {"left":-that.now*that.w}, function(){
                that.ul.style.left = "0px";
            });
            that.now = 0;
        }else if( that.now == -1 ){
            that.now = that.l-1;
            that.ul.style.left = -that.l*that.w+"px";
            that.prev = -that.now*that.w;
            startMove(that.ul, {"left":that.prev});
        }else{
            that.prev = -that.now*that.w;
            startMove(that.ul, {"left":that.prev});
        }

        // 样式
        for( var i=0,l=that.l; i<l; i++ ){
            that.olspan[i].className = "";
        }
        that.olspan[that.now].className = "selected";
    }

    this.next = function(){
        that.now += that.d;
        that.tab();
    }

    this.over = function(){
        clearInterval(that.timer);
        startMove(that.lBtn, {"opacity":100});
        startMove(that.rBtn, {"opacity":100});
    }
    this.out = function(){
        that.timer = setInterval(that.next, that.ms);
        startMove(that.lBtn, {"opacity":0});
        startMove(that.rBtn, {"opacity":0});
    }

    this.tab();
    this.run();
}

startMove.js(运动函数)
/*
 * 运动函数
 * 参数:
 * elem 指操作的元素
 * obj 指操作的元素节点上的css属性及它的目标值
 *          attr 指操作的元素节点上的css属性
 *          target 指操作的元素节点上的css属性的目标值
 * fn 指运动函数执行完,执行哪一个函数
 */
function startMove(elem, obj, fn){
    // 清除定时器
    clearInterval(elem.timer);
    // 多属性同时运动时,是否每一个属性都到了目标值
    // 开启定时器
    elem.timer = setInterval(function(){
        var flag = true;    // 默认时认为到了目标值
        // 支持多属性同时运动
        for( var attr in obj ){
            // 目标值
            var target = obj[attr];
            // 判断属性是否为透明度
            var v; // 获取当前值
            if( attr == "opacity" ){
                v = getStyle(elem, attr);
                v = Math.round(v*100);
            }else{
                v = parseInt(getStyle(elem, attr));
            }
            //console.log(v);
            // 目标值与当前值的间距
            var dist = target - v;
            // 求步长
            var speed = dist/6;
            // 步长取整数
            if(speed>0){
                speed = Math.ceil(speed);
            }else{
                speed = Math.floor(speed);
            }
            // 更新
            if( attr == "opacity" ){
                elem.style.opacity = (v+speed)/100;
                if(/MSIE/.test(navigator.userAgent)){// 如果当前浏览器为IE,则执行兼容代码
                    elem.style.filter = "alpha(opacity="+(v+speed)+")"; // 兼容低版本IE
                }
            }else{
                elem.style[attr] = v+speed+"px";
            }
            // 如果没有到达目标值
            if(v!=target){
                flag = false;
            }
            //console.log(0);
        }
        // 如果已经到达目标值,则停止定时器
        if( flag ){
            clearInterval(elem.timer);
            if( fn ){   // 如果给定了第三个参数,则执行该函数
                fn();
            }
        }
    }, 50); 

}

/*
 * 获取行间样式
 */
function getStyle(elem, attr){
    if( window.getComputedStyle ){
        return getComputedStyle(elem, null)[attr];
    }else{
        return elem.currentStyle[attr];
    }
}
接下来是一些简单的css代码
/*
 * 轮播图
 */

.slide{
    position: relative;
    overflow: hidden;
}
.slide *{
    margin: 0;
    padding: 0;
}
.slide li{
    float: left;
    list-style: none;
}
.slide>ul{
    position: absolute;
    left: 0;
    top: 0;
}
.slide>ul>li{

}
.slide>ol{
    position: absolute;
    right: 0;
    bottom: 0;
}
.slide>ol>li{
    padding: 10px;
}
.slide>ol>li>span{
    display: block;
    width: 20px;
    height: 20px;
    border-radius: 10px;
    background: white;
    cursor: pointer;
}
.slide .selected{
    background: greenyellow;
}

.slide>p{
    position: absolute;
    display: block;
    width: 30px;
    height: 30px;
    text-align: center;
    line-height: 25px;
    border-radius: 15px;
    background: white;
    cursor: pointer;
    opacity: 0;
}
.slide>p:hover{
    background: greenyellow;
}
.slide>p:nth-child(3){
    left: 10px;
}
.slide>p:nth-child(4){
    right: 10px;
}
使用方法
<div id="div1" class="slide">
    <ul>
        <li><img src="img/001.jpg"/></li>
        <li><img src="img/002.jpg"/></li>
        <li><img src="img/003.jpg"/></li>
        <li><img src="img/004.jpg"/></li>
    </ul>
    <ol>
        <li><span></span></li>
        <li><span></span></li>
        <li><span></span></li>
        <li><span></span></li>
    </ol>
    <p>&lt;</p>
    <p>&gt;</p>
</div>

接下来在script中直接new一个实例,new Slide(div1, 3000, 1, 1);就可以实现轮播效果

代码很简单,细心观察,你也是大神

时间: 2024-08-05 07:08:45

用原生js封装轮播图的相关文章

原生js封装轮播图

个人实际开发中用到的效果问题总结出来便于自己以后开发查看调用,如果也适用其他人请随意拿走勿喷就行! 原生js对于思路要求比较高,在js代码我都写有备注,足够理解并使用,即使是小白或者刚入行的程序员也比叫好理解,其轮播图只是一个简单的效果,缺点没有写动画效果看起来比较生硬,优点简单好学,容易理解,非常实用 轮播图介绍 : 三张图片,图片下方有对应图片数量的三个指示点,左右有切换指示,左右指示可要可不要 HTML代码 <div id="mlBox"> <div id=&q

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

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

原生js简单轮播图 代码

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

使用原生js实现轮播图效果

知乎原文 我的博客 微信公众号这几天在逛网站的时候,发现很多网站都有轮播图这个效果,所以我就仿照小米的官网用原生js写了一个轮播图效果,希望大家喜欢.这是我发布在github上的最后实现的效果:https://heternally.github.io/... 下面我简单跟大家说一下我实现该效果的过程,如果有什么错误的地方,欢迎大家说出来,以方便大家互相学习. 我相信前面简单的html+css大家应该都会,我这里就不说了,简单给大家展示一下代码: HTML部分 <div id="wrap&q

手把手原生js简单轮播图

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

原生js实现轮播图

很多网站上都有轮播图,使用起来也比较炫酷,但找到一个系统的介绍却很难,这里做一个简单的介绍. 原理:将一些列的图片在一行中平铺,然后计算偏移量再利用定时器实现定时轮播. 步骤一: 建立html基本布局,如下所示: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>轮播图</title> </head> <body> <

原生js实现轮播图原理

轮播图的原理1.图片移动实现原理:利用浮动将所有所有照片依次排成一行,给这一长串图片添加一个父级的遮罩,每次只显示一张图,其余的都隐藏起来.对图片添加绝对定位,通过控制left属性,实现照片的移动. 2.图片移动动画原理:从a位置移动到b位置,需要先计算两点之间的差值,通过差值和时间间隔,计算出每次移动的步长,通过添加定时器,每次移动相同的步长,实现动画效果. 3.图片定位停止原理:每一张照片都有相同的宽度,每张照片都有一个绝对的定位数值,通过检测定每次移动后,照片当前位置和需要到达位置之间的距

简洁原生js实现轮播图

html: <div class="comiis_wrapad" id="slideContainer"> <div id="frameHlicAe" class="frame cl"> <div class="temp"></div> <div class="block"> <div class="cl&quo

原生js焦点轮播图

html: <html><head><style type="text/css">div, ul, li { margin: 0; padding: 0;}ul { list-style-type: none;}body { text-align: center; font: 12px/20px Arial;}#boxljwpx2 { position: relative; width: 640px; height: 237px;}#boxljwpx