IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 2022-06-28 工作记录--React-react-intersection-observer实现图片在可视范围内时加上其对应动图 -> 正文阅读

[JavaScript知识库]2022-06-28 工作记录--React-react-intersection-observer实现图片在可视范围内时加上其对应动图

React-react-intersection-observer实现图片在可视范围内时加上其对应动图

一、前言 ??

最近项目里遇到一个需求??:在一个页面里需同时展示5张动图😎。那么。。。为了提高性能,防止卡顿,前端就需要进行单页面多动效优化处理啦🤔,处理方式如下:🌸

  • 页面一来先展示5张静态图片,只有当某张静态图片进入可视范围内时,才给其加上其对应的动图;未在可视范围内的,就不加上其对应的动图。
    在这里插入图片描述

二、实现效果 ??

在这里插入图片描述

三、实现步骤 ??

1、安装react-intersection-observer

react-intersection-observer判断是否在可视范围内。

yarn add react-intersection-observer

或者

npm install react-intersection-observer --save

2、安装swiper

实现图片轮播,我安装的是swiper3版本,版本根据需求选择即可。

React-swiper的运用 可查看我的另外一篇博客
在这里插入图片描述

npm i swiper@3 

或者

 yarn add swiper@3

3、到package.json里去判断是否安装成功

在这里插入图片描述

4、对应代码 ??

我分为了三大点:「小萝卜儿们🥕依据这三个点查看对应代码哟」

  • 一、【判断是否在可视范围内】
  • 二、【图片匀速轮播】
    • 「项目需要」让5张图片实现匀速向下滚动的效果。
  • 三、【是否展示动图】
    • 对应索引值的图片出现在可视范围内了,就给其加上对应动图。
      在这里插入图片描述

scenesPage.jsx

import React, { useEffect, useState } from "react";
import { InView } from 'react-intersection-observer'; // 【判断是否在可视范围内】
import Swiper from "swiper"; // 【图片匀速轮播】—— 引入swiper,实现轮播
import { SvgaPlayer } from '@spark/animation'; // 公司内部的组件【动图】
import {RES_PATH} from '../../sparkrc.js';

import "./scenesPage.less"; // 引入样式【根据自己需求编写】

function ScenesPage() {
    // 【是否展示动图】—— 在state里设置变量currentIndex,初始值为0,改变变量的方法名为setCurrentIndex
    const [currentIndex, setCurrentIndex] = useState(0);

    useEffect(() => {
        // 【图片匀速轮播】—— 初始化swiper
        new Swiper('.swiper-container1', {
            direction: 'vertical', // 垂直方向
            freeMode: true, // 设置为true则变为free模式
            freeModeMomentum : false, // free模式下,若设置为false则关闭动量,释放slide之后立即停止不会滑动。【详情参考官网,对应位置截图放在最后面啦】
            // speed: 6000, // 匀速时间【在这儿不要加匀速时间,避免在第一页继续往上拉或最后一页继续往下拉出现大片空白区域的情况出现】
        });
    }, []);

    // 场景静图和动图-最好写在utils/constans.js里封装成公共的,避免代码冗余
    const scenes = [{
        imgSrc:`${RES_PATH}场景/场景一.png`,
        motionGraph: `${RES_PATH}svga/场景1.svga`,
    },{
        imgSrc:`${RES_PATH}场景/场景二.png`,
        motionGraph: `${RES_PATH}svga/场景2.svga`,
    },{
        imgSrc:`${RES_PATH}场景/场景三.png`,
        motionGraph: `${RES_PATH}svga/场景3.svga`,
    },{
        imgSrc:`${RES_PATH}场景/场景四.png`,
        motionGraph: `${RES_PATH}svga/场景4.svga`,
    },{
        imgSrc:`${RES_PATH}场景/场景五.png`,
        motionGraph: `${RES_PATH}svga/场景5.svga`,
    }]    

    return (
        <div className="scenesPage">
            {/* 【图片匀速轮播】—— Swiper */}
            <div className="swiper-container swiper-container1">
                <div className="swiper-wrapper swiper-wrapper1">
                    {
                        scenes.map((item, index) => {
                            return (
                                <div className="swiper-slide swiper-slide1"} key={index}>
                                    {/* 【判断是否在可视范围内】—— 需要判断哪些内容是否在可视范围内,就把这些内容写在InView里面 */}
                                    <InView as="div" onChange={(inView, entry) => {
                                        console.log(`${index + 1}张图 出现:`, inView);
                                        if (inView) { // inView:true-在可视范围内;false-不在可视范围内
                                            setTimeout(() => { // 定时器可加可不加,根据实际需求来
                                                // 【是否展示动图】—— 改变变量currentIndex的值为index,相当于:currentIndex = index(赋值)
                                                setCurrentIndex(index);
                                            }, 500)
                                        }
                                    }}>
                                        {/* 静图 */}
                                        <img src={item.imgSrc} alt="" />
                                    </InView>
                                    {
                                        // 【是否展示动图】动图 —— currentIndex等于index,就展示对应静图的动图;否则,不展示
                                        currentIndex == index && <SvgaPlayer
                                            className="motionGraph"
                                            src={item.motionGraph}
                                        />
                                    }
                                </div>
                            )
                        })
                    }
                </div>
            </div>
        </div>
    );
}

export default ScenesPage;

scenesPage.less

@import "../../../node_modules/swiper/dist/css/swiper.css"; /* 【图片匀速轮播】*/

/* 公共方法 【图片匀速轮播】 */
.swiper-container {
    width: 100%;
    height: 100vh;
}
.swiper-slide {
    text-align: center;
    font-size: 18px;
    background: #fff;
  
    /* Center slide text vertically */
    display: -webkit-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-box-pack: center;
    -ms-flex-pack: center;
    -webkit-justify-content: center;
    justify-content: center;
    -webkit-box-align: center;
    -ms-flex-align: center;
    -webkit-align-items: center;
    align-items: center;
}
/* 非公共方法 */
.scenesPage {
    position: relative;
    .swiper-slide1 {
      width: 750px;
      height: 1334px;
      position: relative;
      img,.motionGraph {
          position: absolute;
          top: 50%;
          left: 50%;
          transform: translate(-50%,-50%);
          width: 100%;
          height: 100%;
          object-fit: cover;
      }
  	}
  	/*【图片匀速轮播】*/
  	.swiper-container1>.swiper-wrapper1 {
		-webkit-transition-timing-function: linear;    /*之前是ease-out*/
  		-moz-transition-timing-function: linear;
  		-ms-transition-timing-function: linear;
  		-o-transition-timing-function: linear;
  		transition-timing-function: linear;
  		margin: 0 auto;
  	}
}

sparkrc.js

module.exports ={
  "RES_PATH": "/src/assets/",
}

当当当当~大功告成🌶

在这里插入图片描述

【补充】swiper3-freeModeMomentum属性

在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:40:34  更:2022-07-03 10:44:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:46:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码