返回顶部
首页 > 资讯 > 前端开发 > JavaScript >react组件实现无缝轮播示例详解
  • 792
分享到

react组件实现无缝轮播示例详解

react组件无缝轮播react无缝轮播 2022-11-13 18:11:15 792人浏览 独家记忆
摘要

目录正文无缝轮播实现思路构思使用时代码结构Carousel组件CarouselItem组件完善组件完成小圆点正文 需求是做一个无缝轮播图,我说这不是有很多现成的轮子吗?后来了解到他有

正文

需求是做一个无缝轮播图,我说这不是有很多现成的轮子吗?后来了解到他有一个特殊的需求,他要求小圆点需要在轮播图外面,因为现在大部分插件都是将小圆点写在轮播图内部的,这对于不了解插件内部结构的小伙伴确实不知道如何修改。

很久没有写插件的我准备写一个插件(React

无缝轮播

无缝轮播从最后一张到第一张的过程中不会原路返回,它就像轮子似的,从结束到开始是无缝连接的,非常自然地循环下去。

实现思路

轮播图的实现思路有很多,我们这里采用的是最简单的轮播图方案,如上图,即当轮播图轮播到第x张图片时,当前整个轮播图列表中只保留第x张图片,其余图片dom全部隐藏掉即可。

那么大家有一个疑问,这样不会导致切换时不连贯吗?这个大家不必担心,我们可以在上一个轮播图小时和下一个轮播图展现时增加动画效果,来达到连贯的感觉。

构思使用时代码结构

参考了大部分轮播图组件,得出来下面的这种使用结构。

import Carousel,{ Item } from '组件'
render(){
    return (
        <Carousel>
            <Item><img src="xxx" /></Item>
            <Item><img src="xxx" /></Item>
            <Item><img src="xxx" /></Item>
        </Carousel>
    )
}

Carousel组件

新建Carousel组件,这个组件是组件的整体框架文件。

内部增加inner div 来充当当前展示轮播图的视口

const Carousel=()=>{
    return (
        <div className={'carousel'}>
            <div className={'carousel-inner'}> 
                {xxx轮播图xxx}
            </div> 
        </div>
    )
} 

overflow:hidden是关键

.inner{
    width:100%;
    height:100%;
    position: relative;
    overflow: hidden;
} 

CarouselItem组件

新建CarouselItem组件,这个组件是Carousel组件的子组件,是轮播图列表每一项的容器

const CarouselItem=(props)=>{ 
    return (
        <div className={'carousel-item'}>
            {props.children}
        </div>
    )
}

注意 这里需要使用top0 left0 不然显示的时候会从上往上偏移 导致错误显示

.carousel-item{
    position: absolute;
    left:0;
    top:0;
    width: 100%;
    height:100%; 
}

完善组件

  • 如何显示当前轮播图元素

之前我们说过这次我们轮播图的核心思路是显示当前元素,那么什么情况下显示当前元素呢?

carousel组件内有一个state表示当前轮播到第几张图 我们这里叫current,而根据传入carousel的元素排序,我们可以在item内部拿到当前是第几张图片,然后2者如果是相等的,就显示当图片。

我们如何获取元素当前的index呢?我们可以利用react提供的解析children的api

// util
import React from "react";
export function injecteIndex(children:React.ElementType,current):any{
    let result:React.ReactElement[]=[];
    React.Children.forEach(children,(item,index)=>{
        result.push(React.cloneElement((item as any),{
            //selfIndex即为轮播图的index
            selfIndex:index,
            key:index,
            current
        }))
    });
    return result;
}
//carousel组件
//initial 为传入配置 默认为0 即默认展示第一张图
const Carousel=()=>{
    const {
        initial
    }=props;
    const [current,setCurrent]=useState<number>(initial);
    return (
        <div className={'carousel'}>
            <div className={'carousel-inner'}> 
                {injecteIndex(children,current)}
            </div> 
        </div>
    )
}  
//carousel-item组件
const CarouselItem=(props)=>{ 
    const { selfIndex,current }=props;
    const visible=selfIndex===current
    return (
        {visible && <div className={'carousel-item'}>
            {props.children}
        </div>}
    )
}
  • 实现autoPlay

上面我们其实已经实现了第一张图的展示,那么我们如何让他动起来呢?其实也很简单,我们一起来实现一下

//useLatest
import { useEffect, useRef } from "react"
export default (params:any)=>{
    const latest=useRef();
    useEffect(()=>{
        latest.current=params;
    })
    return latest;
}
//carousel组件 
const Carousel=(props)=>{
    const {
        //initial 为传入配置 默认为0 即默认展示第一张图
        initial=0,
        //是否自动轮播 默认为是
        autoplay=true,
        //时间间隔 默认为3秒
        interval=3000
    }=props;
    //新建定时器存储变量
    const timer:any=useRef(null);
    const [current,setCurrent]=useState<number>(initial);
    const [itemLength]=useState<number>(React.Children.count(children)); 
    //解决闭包问题
    const latest:any=useLatest(current); 
    const autoPlay=()=>{
        //设置定时器 每隔3s切换到下一张图片
        timer.current=setInterval(()=>{
            setStep('next');
        },interval);
    }
    const setStep=(direction:'prev'|'next')=>{
        switch(direction){
            case 'prev':
                let prevStep:number=latest.current-1;
                //当为第一张时 跳到第5张
                if(prevStep===-1){
                    prevStep=itemLength-1;
                }
                setCurrent(prevStep);
                break;
            case 'next':
                let nextStep:number=latest.current+1;
                //当为最后一张时 跳到第1张
                if(nextStep===itemLength){
                    nextStep=0;
                }
                setCurrent(nextStep);
                break;
            default:
        }
    }
    useEffect(()=>{
        if(autoplay){
            //自动轮播
            autoPlay();
        }
        return ()=>{
            //销毁定时器
            clearInterval(timer.current);
            timer.current=null;
        }
    },[autoplay]);
    return (
        <div className={'carousel'}>
            <div className={'carousel-inner'}> 
                {injecteIndex(children,current)}
            </div> 
        </div>
    )
}  
```# 完成动画
其实上面我们已经把无缝轮播业务逻辑完成了,那么如何让他轮播起来呢?我们这里使用react官方推荐的一个过渡库,因为react并没有像Vue为我们提供transition api。
```js
const CarouselItem=(props)=>{ 
    const {  
        children,
        selfIndex 
    }=props; 
    const visible=selfIndex===current; 
    return  (
        <CSSTransition mountOnEnter unmountOnExit appear in={visible} timeout={500}  classNames={'carousel'}>
            <div className={'carousel-item'} >
                {children}
            </div>
        </CSSTransition>
    ) 
});
.carousel-enter-active,.carousel-exit-active{
        transition: all 500ms linear;
}
.carousel-enter{ 
        transfORM: translateX(100%);
        opacity: 0.8;
}
.carousel-enter-active{
        transform: translateX(0);
        opacity: 1;
}
.carousel-exit{
        transform: translateX(0); 
        opacity: 1;
}
.carousel-exit-active{
        transform: translateX(-100%); 
        opacity: 0.8;
}

之前我们设置的top:0 left:0 可以得出轮播元素的原点都是容器的左上角 在enter过程将translateX从100到0 即可展示从右往左的动画效果 在exit过程前将translateX从0到-100 即可展示从左往右的动画效果

完成小圆点

其实让我写轮播图的老兄 最大的难点是小圆点的位置 因为大部分轮播图 小圆点部分都是写在inner里面的 而inner元素为overflow:hidden,即不管如何小圆点,他都会溢出隐藏。所以这次我们把小圆点放在inner元素上,并且提供一个属性让小圆点可调。

//carousel 
<div className={classes}>
    <div className={'inner'}>
        {injecteIndex(children)}
    </div>
    <Dots length={itemLength}  position={dotPosition}/>
</div>
//dots原点
<div className={classnames(
            classes, 
    )} style={{...position}}>
            {
                newArray.map((item,index)=>(
                    <div className={classnames(`${prefixCls}-item`,{
                        'active':current===index
                    })} key={index} onClick={()=>onClick(index)}/>
                ))
            }
</div>

实现效果

源码地址

如果大家有想使用的话 可以放心 使用 源码已发到GitHub和npm上面

npm install @parrotjs/carousel -S

以上就是react 组件实现无缝轮播示例详解的详细内容,更多关于react 组件无缝轮播的资料请关注编程网其它相关文章!

--结束END--

本文标题: react组件实现无缝轮播示例详解

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

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

猜你喜欢
  • react组件实现无缝轮播示例详解
    目录正文无缝轮播实现思路构思使用时代码结构Carousel组件CarouselItem组件完善组件完成小圆点正文 需求是做一个无缝轮播图,我说这不是有很多现成的轮子吗?后来了解到他有...
    99+
    2022-11-13
    react 组件无缝轮播 react 无缝轮播
  • jquery插件实现无缝轮播
    无缝轮播是一个很常见的效果,理解逻辑之后就很简单了。 效果如下 代码部分 <!DOCTYPE html> <html> <head> ...
    99+
    2024-04-02
  • JavaScript实现无缝轮播图的示例代码
    目录上效果一、实现过程1)首先实现基本布局2)主要样式二、如何实现无缝呢 (重点来了)思路:主要代码完整代码花费一个下午从0到1实现的轮播图,当然还有很多需要改进的地方(欢迎提出需要...
    99+
    2024-04-02
  • vue实现无缝轮播效果的示例代码
    小编给大家分享一下vue实现无缝轮播效果的示例代码,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下首先创建两个vue组件Sweiper.vue和Swei...
    99+
    2023-06-15
  • jquery实现无缝轮播图
    本文实例为大家分享了jquery实现无缝轮播图的具体代码,供大家参考,具体内容如下 实现功能(无缝轮播图Jquery) 利用移动定位进行无缝滚动,大体实现点击切换图片,每张图片对应一...
    99+
    2024-04-02
  • Vue实现无缝轮播效果
    本文实例为大家分享了Vue实现无缝轮播效果的具体代码,供大家参考,具体内容如下 代码 1.子组件代码 代码如下(示例): <template> <di...
    99+
    2024-04-02
  • js实现文字无缝轮播
    本文实例为大家分享了js实现文字无缝轮播的具体代码,供大家参考,具体内容如下 所用到的知识点: innerHTML 获取或设置某个对象的内容scrollTop 滚动条滚动的距离,此属...
    99+
    2024-04-02
  • JavaScript如何实现无缝轮播图
    这篇文章主要讲解了“JavaScript如何实现无缝轮播图”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript如何实现无缝轮播图”吧!效果一、实现过程1)首先实现基本布局&nb...
    99+
    2023-07-02
  • vue如何实现无缝轮播图
    目录vue实现无缝轮播图轮播图的思路无缝轮播(跑马灯效果)vue实现无缝轮播图 轮播图的思路 一组图片进行不停地循环,如果循环到最后一张图片,就从第一张开始,不停循环,我们可以设置图...
    99+
    2024-04-02
  • react怎么实现手机端首页无缝轮播功能
    本篇内容主要讲解“react怎么实现手机端首页无缝轮播功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“react怎么实现手机端首页无缝轮播功能”吧!touchstart = ...
    99+
    2023-06-05
  • jQuery如何实现无缝轮播效果
    这篇文章将为大家详细讲解有关jQuery如何实现无缝轮播效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。这个无缝轮播和那个图片平滑滚动的原理差不多。原理:ul向左滚动,...
    99+
    2024-04-02
  • Vue如何实现无缝轮播效果
    这篇文章主要介绍Vue如何实现无缝轮播效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下代码1.子组件代码代码如下(示例):<template>  <div>&...
    99+
    2023-06-14
  • js如何实现文字无缝轮播
    这篇“js如何实现文字无缝轮播”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“js如何实现文字无缝轮播”文章吧。所用到的知识点...
    99+
    2023-07-02
  • Vue组件实现景深卡片轮播示例
    目录前言需求拆解开发思路(vue2)开发过程后记前言 朋友的朋友做了个首页,首页用到一个卡片轮播,大概就是这个样子的: 第一版他们是开发出来了,但是各种bug,希望我帮忙改一下。 ...
    99+
    2024-04-02
  • vue实现无缝轮播效果(跑马灯)
    本文实例为大家分享了vue实现无缝轮播效果的具体代码,供大家参考,具体内容如下 1.首先创建两个vue组件Sweiper.vue和SweiperItem.vue; 2.将两个组件引入...
    99+
    2024-04-02
  • jquery如何实现无缝轮播图特效
    本文小编为大家详细介绍“jquery如何实现无缝轮播图特效”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery如何实现无缝轮播图特效”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、HTML结构首先需要创...
    99+
    2023-07-05
  • 基于vue.js轮播组件vue-awesome-swiper实现轮播图的示例分析
    这篇文章主要为大家展示了“基于vue.js轮播组件vue-awesome-swiper实现轮播图的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“基于vu...
    99+
    2024-04-02
  • 原生Js 实现的简单无缝滚动轮播图的示例代码
       简单无缝滚动轮播图存在很多漏洞,就是后期增加图片时会很不方便,需要改动的地方也很多,耦合性也很强,只适用于一部分程序,所以我们可以通过改动图片结构和计算...
    99+
    2024-04-02
  • vuev-viewer组件使用示例详解(v-viewer轮播图)
    目录v-viewer轮播图效果图组件介绍插件安装补充:v-viewer的使用(vue)v-viewer轮播图 效果图 Bandicam(录制视频)+soogif(视频转成gif) ...
    99+
    2023-02-09
    vue v-viewer组件使用 vue v-viewer组件 v-viewer轮播图
  • Vue3使用Swiper实现轮播图示例详解
    目录正文Swiper 的参数代码实现Error: Can‘t resolve ‘swiper/css/swiper.css‘ 如何解决其它方式正文...
    99+
    2023-02-12
    Vue3 Swiper轮播图 Vue3 Swiper
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作