JavaScript中使用面对对象实现无缝轮播图

使用js实现简易的无缝轮播图,利用面向对象的功能,对轮播图进行功能拆分:
1.选择元素(属性)
2.完善布局(方法)
3.绑定事件(方法)
4.改变索引(方法)
5.设置imgbox的位置(方法)
首先需要对其进行一个布局

<body>
	<div id="box">
		<div class="imgbox">
            <a><img src="https://img.zcool.cn/community/012dd25e55d09ba801216518b3709d.png" alt=""></a>
            <a><img src="https://img.zcool.cn/community/01b67a5e55d1f1a80120a8957126ef.png" alt=""></a>
            <a><img src="https://img.zcool.cn/community/01db115e572a7aa8012165189d7874.jpg" alt=""></a>
            <a><img src="https://img.zcool.cn/community/0105515e55cf74a80120a895a76620.jpg" alt=""></a>
            <a><img src="https://img.zcool.cn/community/012dd25e55d09ba801216518b3709d.png" alt=""></a>
        </div>
        <div class="btns">
            <input type="button" id="left" value="<<<">
            <input type="button" id="right" value=">>>">
        </div>
	</div>
</body>

在style里对布局进行细化

<style>
        #box{width: 1000px;height: 300px;position: relative;margin: 20px auto;overflow: hidden;}
        #box .imgbox{position: absolute;left:0;top:0;}
        .imgbox a{display: block;width: 1000px;height: 300px;float: left;}
        .imgbox img{width: 1000px;height: 300px;}

        .btns input{width: 40px;height: 40px;background: rgba(200,200,200,0.6);border: none;position: absolute;top: 130px;z-index: 1;}
        #left{left:0;}
        #right{right: 0;}

    </style>

封装一个函数,在这个函数里只存放变量

function Banner(){
        // 1.选择元素(属性)
        this.left = document.getElementById("left");
        this.right = document.getElementById("right");
        this.imgbox = document.querySelector(".imgbox");
        this.child = this.imgbox.children;

        this.index = 0;
    }

prototype是函数的一个属性,叫做原型对象,是为了给将来自身所在的构造函数被new出来的实例做父级使用的,可以设置函数
init函数,用以完善布局

Banner.prototype.init = function(){
        // 2.完善布局(方法)
        this.imgbox.style.width = this.child.length * this.child[0].offsetWidth + "px";
    }

addEvent(),绑定事件

Banner.prototype.addEvent = function(){
    var that = this;
    // 3.绑定事件(方法)
    this.left.onclick = function(){
        that.changeIndex(1);
    }
    this.right.onclick = function(){
        // console.log(this);
        // console.log(this.changeIndex);
        that.changeIndex(2);
    }
}

changeIndex(),这个函数用来改变索引,并将其在绑定事件中执行

Banner.prototype.changeIndex = function(d){
    // 4.改变索引(方法)
    if(d == 1){
        if(this.index == 0){
            this.index = this.child.length-2;
            this.imgbox.style.left = -(this.child.length-1)*this.child[0].offsetWidth + "px";
        }else{
            this.index--;
        }
    }else{
        if(this.index == this.child.length-1){
            this.index = 1;
            this.imgbox.style.left = 0;
        }else{
            this.index++;
        }
    }

    this.setPos();
}

设置imgbox的位置,内部执行之前封装好的move函数

Banner.prototype.setPos = function(){
    // 5.设置imgbox的位置(方法)
    move(this.imgbox,"left",-this.index*this.child[0].offsetWidth);
}

启动

var b = new Banner();
b.init();
b.addEvent();

move()

function move(ele,attr,target){
    clearInterval(ele.t);
    ele.t = setInterval(() => {
        if(attr == "opacity"){
            var iNow = getStyle(ele,attr) * 100;
        }else{
            var iNow = parseInt(getStyle(ele,attr));
        }

        let speed = (target - iNow)/10;
        speed = speed < 0 ? Math.floor(speed) : Math.ceil(speed);
        if(iNow === target){
            clearInterval(ele.t);
        }else{
            if(attr == "opacity"){
                ele.style.opacity = (iNow + speed)/100;
            }else{
                ele.style[attr] = iNow + speed + "px";
            }
        }
    }, 30);
}

function getStyle(ele,attr){
    if(ele.currentStyle){
        return ele.currentStyle[attr];
    }else{
        return getComputedStyle(ele,false)[attr];
    }
}

所谓面向对象编程,其实就是将面向过程的程序,分门别类,功能细化,独立的模块,根据功能之间的关系,选择执行
功能的实现,还是得面向过程;或者由其他小功能组合而成
也可用ES6新增的class实现,js代码如下:

class Banner{
    constructor(){
        // 1.选择元素(属性)
        this.left = document.getElementById("left");
        this.right = document.getElementById("right");
        this.imgbox = document.querySelector(".imgbox");
        this.child = this.imgbox.children;
    
        this.index = 0;
    }
    init(){
        // 2.完善布局(方法)
        this.imgbox.style.width = this.child.length * this.child[0].offsetWidth + "px";
    }
    addEvent(){
        var that = this;
        // 3.绑定事件(方法)
        this.left.onclick = function(){
            that.changeIndex(1);
        }
        this.right.onclick = function(){
            // console.log(this);
            // console.log(this.changeIndex);
            that.changeIndex(2);
        }
    }
    changeIndex(d){
        // 4.改变索引(方法)
        if(d == 1){
            if(this.index == 0){
                this.index = this.child.length-2;
                this.imgbox.style.left = -(this.child.length-1)*this.child[0].offsetWidth + "px";
            }else{
                this.index--;
            }
        }else{
            if(this.index == this.child.length-1){
                this.index = 1;
                this.imgbox.style.left = 0;
            }else{
                this.index++;
            }
        }
        this.setPos();
    }
    setPos(){
        // 5.设置imgbox的位置(方法)
        move(this.imgbox,"left",-this.index*this.child[0].offsetWidth);
    }
}

var b = new Banner();
b.init();
b.addEvent();
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现无缝轮播图的一种常见方法是在轮播图的最后一张图片后面添加第一张图片,以此形成无缝循环。而使用 `animate` 方法实现轮播图可以通过以下步骤: 1. 定义一个变量 `currentSlide`,用于记录当前显示的图片序号。 2. 定义一个函数 `slideNext()`,该函数用于切换到下一张图片。在函数,将当前显示的图片向左移动一个图片的宽度,同时将 `currentSlide` 加 1。如果 `currentSlide` 等于图片数量,则将 `currentSlide` 设为 0,同时将图片容器的 `left` 属性设置为 0。 3. 使用 `setInterval` 方法调用 `slideNext()` 函数,来实现自动轮播。 下面是一个简单的示例代码: HTML 代码: ```html <div class="slider"> <img src="img1.jpg"> <img src="img2.jpg"> <img src="img3.jpg"> <img src="img1.jpg"> </div> ``` CSS 代码: ```css .slider { position: relative; width: 600px; height: 300px; overflow: hidden; } .slider img { position: absolute; top: 0; left: 0; width: 600px; height: 300px; } ``` JavaScript 代码: ```javascript var currentSlide = 0; var slideInterval = setInterval(slideNext, 3000); function slideNext() { var slider = document.querySelector('.slider'); var slideWidth = slider.clientWidth; currentSlide++; if (currentSlide >= slider.children.length) { currentSlide = 0; slider.style.left = '0px'; } var left = -1 * slideWidth * currentSlide; slider.animate( { left: left + 'px' }, { duration: 500, easing: 'linear' } ); } ``` 在上面的代码,我们使用了 `querySelector` 方法来获取轮播图容器的 DOM 元素,`clientWidth` 属性获取了容器的宽度,`animate` 方法实现了图片移动的动画效果。在实际开发,还需要考虑一些细节问题,比如用户鼠标悬停在轮播图上时停止轮播,以及用户点击轮播图上的按钮来手动切换图片等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值