在这里,我们给了他默认的宽度为auto,来实现整体宽度自适应 。而使用transition让后续的图片轮换可以有动画效果 。
最后,我们只需要将图片循环渲染在列表中即可 。
import styled from "styled-components";import React, { FC } from "react";const Swiper = styled.div` overflow: hidden; position: relative;`;const SwiperContainer = styled.div` position: relative; width: auto; display: flex; align-item: center; justify-content: flex-start; transition: all 0.3s ease; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease;`;const SwiperSlide = styled.div` display: flex; align-item: center; justify-content: center; flex-shrink: 0;`;const Swiper: FC< { direction?: 'horizontal' | 'vertical'; speed?: number; width: string; height: string; urls: string[]; }> = ({ direction = "horizontal", speed = 3, width = "", height = "", urls = []}) => { return (<Swiper style={{ width, height }}> <SwiperContainer id="swiper-container" style={{ height, // 根据轮播方向参数 , 调整flex布局方向 flexDirection: direction === "horizontal" ? "row" : "column", }} > {urls.map((f: string, index: number) => ( <SwiperSlide style={{ ...styles }}> <img src=https://www.huyubaike.com/biancheng/{f} style={{ ...styles }} /> ))} );}export default Swiper;至此为止 , 我们整体的dom结构与样式就编写完成了,后面要做的就是如何让他们按照我们想要的那样,动起来 。
4、动画实现既然说到了轮播动画的实现,那么我们最先想到的也是最方便的方式,肯定是我们最熟悉的setInterval,那么整体的实现思路是什么样的呢?
先思考一下我们想要实现的功能:1、按照预设的参数实现定时的图片切换功能;2、如果没有预设delay的话,则不自动轮播;3、每次轮播的距离,是由用户配置的图片宽高决定;4、轮播至最后一张后,停止轮播 。
首先,为了保证元素可以正常的移动 , 我们在元素身上添加ref和id便于获取正确的dom元素 。
import React, { FC, useRef } from "react";const swiperContainerRef = useRef<HTMLDivElement>(null);...<SwiperContainer id="swiper-container" ref={swiperContainerRef} style={{ height, // 根据轮播方向参数,调整flex布局方向 flexDirection: direction === "horizontal" ? "row" : "column", }}>...</SwiperContainer>...其次,我们需要定义activeIndex这个state,用来标记当前展示的节点;以及用isDone标记是否所有图片都已轮播完成(所以反馈参数) 。
import React, { FC, useState } from "react";const [activeIndex, setActiveIndex] = useState<number>(0);const [isDone, setDone] = useState<boolean>(false);然后 , 我们还需要进行timer接收参数的定义,这里我们可以选择使用useRef来进行定义 。
import React, { FC, useRef } from "react";const timer = useRef<any>(null);在上面的一切都准备就绪后,我们可以进行封装启动方法的封装
// 使用定时器,定时进行activeIndex的替换 const startPlaySwiper = () => { if (speed <= 0) return; timer.current = setInterval(() => { setActiveIndex((preValue) => preValue + 1); }, speed * 1000); };
推荐阅读
- React +SpreadJS+Echarts 项目实战:在线报价采购系统
- 四十七 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
- 键盘上双引号怎么打(双引号在键盘的哪一个键)
- 怎么去除电脑上一个mcafee(怎么去除电脑上的小图标)
- 六 软件架构MVC架构历史
- 编程猫怎么编程游戏(怎么用编程猫做一个高难度的游戏)
- 2d游戏怎么编程(怎么编写一个2d游戏)
- 如何开发简单的游戏(自学开发一个游戏app)
- 二 京东云开发者| Redis数据结构-List、Hash、Set及Sorted Set的结构实现
- 路由器与猫怎样正确链接(一个猫怎么连接三个路由器)