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、对应代码 ??
我分为了三大点:「小萝卜儿们🥕依据这三个点查看对应代码哟」
- 一、【判断是否在可视范围内】
- 二、【图片匀速轮播】
- 三、【是否展示动图】
- 对应索引值的图片出现在可视范围内了,就给其加上对应动图。
scenesPage.jsx
import React, { useEffect, useState } from "react";
import { InView } from 'react-intersection-observer';
import Swiper from "swiper";
import { SvgaPlayer } from '@spark/animation';
import {RES_PATH} from '../../sparkrc.js';
import "./scenesPage.less";
function ScenesPage() {
const [currentIndex, setCurrentIndex] = useState(0);
useEffect(() => {
new Swiper('.swiper-container1', {
direction: 'vertical',
freeMode: true,
freeModeMomentum : false,
});
}, []);
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">
{}
<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 as="div" onChange={(inView, entry) => {
console.log(`第${index + 1}张图 出现:`, inView);
if (inView) {
setTimeout(() => {
setCurrentIndex(index);
}, 500)
}
}}>
{}
<img src={item.imgSrc} alt="" />
</InView>
{
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;
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;
-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 属性
|