返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS实现轮播图案例
  • 950
分享到

JS实现轮播图案例

2024-04-02 19:04:59 950人浏览 八月长安
摘要

本文实例为大家分享了js实现轮播图案例的具体代码,供大家参考,具体内容如下 实现功能: 1、自动轮播:鼠标停留在轮播图上时不切换图片,鼠标离开后自动轮播。 2、点击左右按钮切换图片。

本文实例为大家分享了js实现轮播图案例的具体代码,供大家参考,具体内容如下

实现功能:

1、自动轮播:鼠标停留在轮播图上时不切换图片,鼠标离开后自动轮播。

2、点击左右按钮切换图片。

3、点击下方按钮切换到对应的图片。

4、轮播图大小自适应:

可以放入到执行的父容器中展示。

不指定父容器时,默认放入body标签。占满一屏的宽度,当改变浏览器窗口大小时,轮播图大小成比例改变。

可以指定轮播图的宽高。

实现方式:面向对象的方式实现,使用时传入图片和图片对应的数据,再创建实例。

import Carousel from './js/Carousel.js';
  var itemList1 = [{
                day: 26,
                date: "/Oct.2020",
                title: "秘境之蓝 无阿里不西藏 自驾阿里小北线",
                src: "./carousel_img/a.jpg",
            },
            {
                day: 25,
                date: "/Oct.2020",
                title: "这是一个什么样的国家?",
                src: "./carousel_img/b.jpg",
            },
            {
                day: 24,
                date: "/Oct.2020",
                title: "在徽州,给秋天写了8封信",
                src: "./carousel_img/c.jpg",
            },
            {
                day: 23,
                date: "/Oct.2020",
                title: "「穿过狂野的风」赶赴内蒙的追羊计划",
                src: "./carousel_img/d.jpg",
            },
            {
                day: 22,
                date: "/Oct.2020",
                title: "爱让我们无所不能|南极大冒险",
                src: "./carousel_img/e.jpg",
            },
        ];
        let carousel1 = new Carousel(itemList1);
        carousel1.appendTo(".div1");
        animation();
        function animation(){
            requestAnimationFrame(animation);
            carousel1.update();
            // carousel2.update();
}

代码:

import Component from './Component.js';
 
export default class Carousel extends Component{
    
    imgList;
    bnList;
    imGCon;
    dot;
    dotList=[];
    data;
    direction;
    pos=0;
    x=0;
    speedX=1;
    bool=false;
    time=200;
    autoBool=true;
 
    // WIDTH=13.66;
    // HEIGHT=4.55;
    WIDTH;
    HEIGHT;
    
    constructor(_data,_width,_height){
        super("div");
        this.data=_data;
        this.width = _width;
        this.height = _height;
        this.elem.className = "carousel";
        // Object.assign(this.elem.style,{
        //     width:this.WIDTH+"rem",
        //     height:this.HEIGHT+"rem",
        //     position:"relative",
        //     overflow:"hidden",
        // });
        let arr = ["./carousel_img/left.png","./carousel_img/right.png"];
        let _imgList = this.data.reduce((value,item)=>{
            if(item.src) value.push(item.src);
            return value
        },arr);
        this.loadImg(_imgList,this.createCarousel);
        // window.addEventListener("resize",e=>this.resizeHandler(e));
    }
 
    createCarousel(imgList){
 
        Object.assign(this.elem.style,{
            width:this.WIDTH+"rem",
            height:this.HEIGHT+"rem",
            position:"relative",
            overflow:"hidden",
        });
 
        this.imgList = imgList;
        this.bnList = this.imgList.splice(0,2);
 
        imgList.forEach(item=>{
            Object.assign(item.style,{
                width:this.WIDTH+"rem",
                height:this.HEIGHT+"rem",
            })
        })
 
        this.createimgCon();
        this.createDotList();
        this.createBn();
        // 动画一般在外面做,类里面只需要写状态更新即可。
        // this.animation();
 
        // 鼠标停留在轮播图上时不进行自动轮播。
        this.elem.addEventListener("mouseenter",e=>this.mouseHandler(e));
        this.elem.addEventListener("mouseleave",e=>this.mouseHandler(e));
    }
    createimgCon(){
        this.imgCon = document.createElement("div");
        Object.assign(this.imgCon.style,{
            width:this.WIDTH*2+"rem",
            height:this.HEIGHT+"rem",
            position:"absolute",
        });
        let item = this.createItem(this.imgList[0],this.data[0]);
        this.imgCon.appendChild(item);
        this.elem.appendChild(this.imgCon);
    }
    createItem(img,obj){    
        let item = document.createElement("div");
        Object.assign(item.style,{
            width:this.WIDTH+"rem",
            height:this.HEIGHT+"rem",
            position:"relative",
            float:"left",
        });
        let title = document.createElement("div");
        Object.assign(title.style,{
            position:"absolute",
            left:"15%",
            top:"0.3rem",
            fontSize:"0.3rem",
            color:"#ffffff",
            textShadow:"0.02rem 0.02rem 0.02rem #000000",
            width:"8rem",
            lineHeight:"0.5rem",
        })
        let head1=document.createElement("div");
        Object.assign(head1.style,{
            height:"0.5rem",
        })
        head1.textContent = obj.date;
        let span = document.createElement("span");
        Object.assign(span.style,{
            fontSize:"0.4rem",
        });
        span.textContent = obj.day;
        let head2 = document.createElement("div");
        Object.assign(head2.style,{
            height:"0.5rem",
        })
        head2.textContent = obj.title;
        head1.insertBefore(span,head1.firstChild);
        title.appendChild(head1);
        title.appendChild(head2);
        item.appendChild(title);
        item.appendChild(img);
 
        return item;
    }
    createDotList(){
        this.dot = document.createElement("ul");
        Object.assign(this.dot.style,{
            listStyle:"none",
            margin:0,
            padding:0,
            position:"absolute",
            left:(this.WIDTH-1.8)/2+"rem",
            bottom:"0.3rem",            
        })
        for(let i=0;i<this.imgList.length;i++){
            let li = document.createElement("li");
            Object.assign(li.style,{
                width:"0.18rem",
                height:"0.18rem",
                borderRadius:"0.2rem",
                marginLeft:i===0?"0px":"0.2rem",
                border:"0.02rem solid red",
                float:"left",
            })
            this.dot.appendChild(li);
            this.dotList.push(li);
        }
        this.dot.addEventListener("click",e=>this.dotClickHandler(e));
        this.elem.appendChild(this.dot);
    }
    createBn(){
        for(let i=0;i<this.bnList.length;i++){
            Object.assign(this.bnList[i].style,{
                position:"absolute",
                top:(this.HEIGHT*100-this.bnList[i].height)/2/100+"rem",
            })
            if(i===0){
                this.bnList[i].style.left = "0.5rem";
            }else{
                this.bnList[i].style.right = "0.5rem";
            }
            this.bnList[i].addEventListener("click",e=>this.bnClickHandler(e));
            this.elem.appendChild(this.bnList[i]);
        }
    }
    bnClickHandler(e){
        if(this.bool) return
        if(e.target===this.bnList[0]){
            this.direction="left";
            this.pos++;
            if(this.pos>this.imgList.length-1) this.pos = 0;
        }else{
            this.direction="right";
            this.pos--;
            if(this.pos<0) this.pos=this.imgList.length-1;
        }
        this.bool=true;
        this.createNextItem();
    }
    dotClickHandler(e){
        if(e.target.constructor!==htmlLIElement) return    //这里因为是对父元素进行侦听,因此要先判断点击的是不是li,如果点击的不是小圆点就不能改变开关,直接return。不能先改变开关。
        if(this.bool)return
        for(let i=0;i<this.dotList.length;i++){
            if(e.target===this.dotList[i]){
                if(this.pos===i) return
                this.direction=i<this.pos?"right":"left";
                this.pos=i;
            }
        }
        this.bool=true;
        this.createNextItem();
    }
    createNextItem(){
        let nextItem=this.createItem(this.imgList[this.pos],this.data[this.pos]);
        if(this.direction==="left"){
            this.imgCon.appendChild(nextItem);
            this.x=0;
        }else{
            this.imgCon.insertBefore(nextItem,this.imgCon.firstChild);
            this.x=-this.WIDTH;
        }
        this.imgCon.style.left=this.x+"rem";
    }
    update(){
        this.imgMove();
        this.autoPlay();
    }
    // 这里只需要做一个状态更新即可。
    // 动画在外面做。
    // animation(){
    //     requestAnimationFrame(this.animation);
    //     if(!this.bool) return
    //     this.imgMove();
    // }
    imgMove(){
        if(!this.bool) return
        if(this.direction==="left"){
            this.x-=this.speedX;
            if(this.x<-this.WIDTH){
                this.imgCon.firstElementChild.remove();
                this.x=0;
                this.bool=false;
            }
        }else{
            this.x+=this.speedX;
            if(this.x>0){
                this.imgCon.lastElementChild.remove();
                this.x=0;
                this.bool=false;
            }
        }
        this.imgCon.style.left=this.x+"rem";
    }
    autoPlay(){
        if(!this.autoBool) return
        this.time--;    //增加防抖
        if(this.time===0){   
            let evt = new Event("click");
            this.bnList[0].dispatchEvent(evt);
            this.time=200;
        }
    }
    resizeHandler(e){
        document.documentElement.style.fontSize=document.documentElement.clientWidth/(this.WIDTH*100)*100+"px";
    }
    appendTo(parent){
        if(typeof parent==="string") parent = document.querySelector(parent);
        parent.appendChild(this.elem);
        if(!isNaN(this.WIDTH) && !isNaN(this.HEIGHT)) return
        if(parent===document.body){
            this.WIDTH = 13.66;
            this.HEIGHT = 4.55;
        }else{
            let rect = parent.getBoundingClientRect();
            this.WIDTH=rect.width/100;
            this.HEIGHT=rect.height/100;
        }
    }
    mouseHandler(e){
        if(e.type==="mouseenter"){
            this.autoBool=false;
        }else{
            this.autoBool=true;
        }
    }
 
    // 图片预加载
    loadImg(_imgList,_callBack){
        let img = new Image();
        img.i=0;
        img.arr=[];
        img.imgList=_imgList;
        // img.callBack=_callBack;
        img.src=_imgList[img.i];
        img.addEventListener("load",e=>this.imgLoadFinishHandler(e));
    }
    imgLoadFinishHandler(e){
        // console.log(e.currentTarget);
        e.currentTarget.arr.push(e.currentTarget.clonenode());
        e.currentTarget.i++;
        if(e.currentTarget.i<e.currentTarget.imgList.length){
            e.currentTarget.src = e.currentTarget.imgList[e.currentTarget.i];
        }else{
            // e.currentTarget.callBack(e.currentTarget.arr);
            this.createCarousel(e.currentTarget.arr);
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: JS实现轮播图案例

本文链接: https://lsjlt.com/news/144827.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JS实现轮播图案例
    本文实例为大家分享了JS实现轮播图案例的具体代码,供大家参考,具体内容如下 实现功能: 1、自动轮播:鼠标停留在轮播图上时不切换图片,鼠标离开后自动轮播。 2、点击左右按钮切换图片。...
    99+
    2024-04-02
  • JS实现轮播图小案例
    本文实例为大家分享了JS实现轮播图小案例的具体代码,供大家参考,具体内容如下 分析: 点击左右箭头 滑动轮播图 鼠标不在轮播图内时 每隔2秒自动滑动轮播图 ...
    99+
    2024-04-02
  • JavaScript实现轮播图案例
    本文实例为大家分享了JavaScript实现轮播图效果的具体代码,供大家参考,具体内容如下 运用定时器所写成的一个简单的轮播图,直接看代码,如下: 1.css代码 <sty...
    99+
    2024-04-02
  • JS实现旋转木马轮播案例
    本文实例为大家分享了JS实现旋转木马轮播的具体代码,供大家参考,具体内容如下 效果: 每张图片排列的位置是以中间为对称的。图片大小,透明度不相同,但对称的图片的样式是相同的,呈现出一...
    99+
    2024-04-02
  • JS如何实现轮播图
    本篇内容介绍了“JS如何实现轮播图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现功能:自动轮播:鼠标停留在轮播图上时不切换图片,鼠标离开...
    99+
    2023-06-29
  • Swiper.js插件实现轮播图的案例
    小编给大家分享一下Swiper.js插件实现轮播图的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Swiper是纯javascript打造的滑动特效插件,面向...
    99+
    2023-06-14
  • 纯JS实现轮播图的示例分析
    这篇文章主要介绍了纯JS实现轮播图的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如下代码:<!DOCTYPE ht...
    99+
    2024-04-02
  • 用js实现轮播图效果
    今天来说一下利用js实现轮播图效果,供大家参考,具体内容如下 思路 1.首先我们要把需要用到的元素获取过来 <div class="all" id='box'> ...
    99+
    2024-04-02
  • 纯js实现轮播图效果
    本文实例为大家分享了js实现轮播图效果的具体代码,供大家参考,具体内容如下 结合我们前面学过的:鼠标监听事件(移入移出、点击),创建节点,排他思想、定时器等,就可以实现一个能手动和自...
    99+
    2024-04-02
  • 用js实现简单轮播图
    本文实例为大家分享了js实现简单轮播图的具体代码,供大家参考,具体内容如下 1.实现功能: 2.实现思路: (1)鼠标放到图片上,显示箭头,用display来做。 (2)动态生成...
    99+
    2024-04-02
  • js实现3D轮播图效果
    本文实例为大家分享了js实现3D轮播图效果的具体代码,供大家参考,具体内容如下 主要有平移和旋转构成3d效果的轮播图,小白一只,不足之处还请大家多多指教,代码如下 css代码: ...
    99+
    2024-04-02
  • 原生JS实现层叠轮播图
    小编给大家分享一下原生JS实现层叠轮播图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!HTML:<!DOCTYPE&nbs...
    99+
    2024-04-02
  • JS怎么实现原生轮播图
    小编给大家分享一下JS怎么实现原生轮播图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!CSS部分:*{   ...
    99+
    2024-04-02
  • js实现轮播图制作方法
    本文实例为大家分享了js实现轮播图展示的具体代码,供大家参考,具体内容如下 效果如图所示 代码如下: <!DOCTYPE html> <html> &...
    99+
    2024-04-02
  • js实现简单轮播图效果
    本文实例为大家分享了js实现简单轮播图效果的具体代码,供大家参考,具体内容如下 使用transform = translateX()实现的图片切换 <style> ...
    99+
    2024-04-02
  • 原生JS实现呼吸轮播图
    今天给大家分享一个用原生JS实现的呼吸轮播图,效果如下: 以下是代码实现,欢迎大家复制粘贴。 <!DOCTYPE html> <html> <...
    99+
    2024-04-02
  • JS实现图片轮播跑马灯
    本文实例为大家分享了JS实现图片轮播跑马灯的具体代码,供大家参考,具体内容如下 实现原理: 1、准备一个展示区域的盒子,设置宽高;2、准备一个存放所有图片的盒子,将所有图片依次放入,...
    99+
    2024-04-02
  • js实现轮播图自动切换
    本文实例为大家分享了js实现轮播图自动切换的具体代码,供大家参考,具体内容如下 先看效果图 第一种  //点击按钮,序号变化 showIdx++; if (showIdx == i...
    99+
    2024-04-02
  • 使用JavaScript实现循环轮播图的案例
    这篇文章主要介绍了使用JavaScript实现循环轮播图的案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下案例演示:点击下面图标,图片进行轮播2.图片轮播完,接...
    99+
    2023-06-14
  • JS实现简单图片轮播效果
    本文实例为大家分享了JS实现简单图片轮播效果的具体代码,供大家参考,具体内容如下 实现效果 左右按钮可点击左右移动显示图片进行无缝滚动 下面的小圆圈点击可跳到对应...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作