react 插件之 react-lazyimg-component 图片懒加载

发布于 2022-11-08 22:22:50 字数 6982 浏览 219 评论 0

图片懒加载是项目中常用的功能,然而现有 react 懒加载组件库,用着都不是很爽了,概括一下有如下几点:

  • 没有只针对 image 懒加载组件。多数组件库都内置了模块、组件、脚本、iframe 懒加载功能,而弱化了 image 懒加载功能。
  • 不支持动画显示效果。
  • 不灵活,可配置度不高。
  • placeholder 不能组件化。
  • 不支持响应式图片( picture / srcset )。

react-lazyimg-component

清楚自己想要什么样的组件,就自己动手撸呗。于是乎,react-lazyimg-component 就诞生了。咱们先来看看它的效果,PC 预览:使劲猛击这里

什么情况需要使用它

1. 小巧轻便,简单易用,基本无学习成本

在那个 jQuery 一统天下的年代,撸代码就用 jQuery 一把梭。其中 jQuery.lazyload 是一个很常用图片懒加载插件。 可能很多像我一样的小伙伴们,懒加载就直接上 jQuery.lazyload,早已习惯了 jQuery.lazyload 使用。 于是自己就琢磨能否继承 jQuery.lazyload 使用方法同时保持 react 特有组件特性。这样可以很快上手

这里只是继承了 jQuery.lazyload 配置特性,不是完全继承。毕竟 jQuery 与现在主流的 MVVM 框架思想截然不同。如果小伙伴们熟悉 jQuery.lazyload , 完全没有学习成本直接上手 react-lazyimg-component 哈。 只说不是写,然并卵。那我们来看看它到底好用不:

安装

// npm
$> npm install react-lazyimg-component
// yarn
$> yarn add react-lazyimg-component

使用

// 引入import Lazyimg, { withLazyimg } from'react-lazyimg-component';

// 调用
<Lazyimg
  className="lazy"
  src={'http://zhansingsong.github.io/lazyimg/22.4582fc71.jpg'}
/>;

是不是很简单,有木有。上述只是使用 react-lazyimg-component 的默认配置。 这里我们可以通过配置项来定制懒加载的行为:

// 引入 lazyimgimport Lazyimg, { withLazyimg } from'react-lazyimg-component';
// 引入 volecity.jsimport'velocity-animate';
import'velocity-animate/velocity.ui';

// 配置const config = {
  threshold: 100, // 指定触发阈值
  js_effect: 'transition.fadeIn', // 支持 velocity.js 动画效果
};
// 基于配置项生成对应 Lazy 组件const Lazy = withLazyimg(config);

// 调用
<Lazy
  className="lazy"
  src={'http://zhansingsong.github.io/lazyimg/22.4582fc71.jpg'}
/>;

接下来我们来看看 react-lazyimg-component 都那些配置项:

threshold: 0, // 指定距离底部多少距离时触发加载
event: 'scroll', // 指定触发事件,默认为'scroll'
js_effect: undefined, // 显示图片的js动画效果
css_effect: undefined, // 显示图片的css动画效果
container: window, // 指定容器,默认为window
parent: undefined, // 可以指定动画效果作用于元素的哪个父级元素
appear: null, // 元素出现在可视窗口时触发appear钩子函数
load: null,  // 元素图片的加载完后触发load钩子函数
error: null, // 图片加载出错时触发error钩子函数
node_type: 'img', // 指定生成的节点类型,默认为'img'
placeholder: // 占位元素,除了支持普通的图片外,还支持react组件。'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC',

是不是很眼熟,如果你熟悉 jquery.lazyload,那么你只需了解如下几个配置项即可:

js_effect: 指定元素显示的动画效果,基于 velocity.js 动画实现。使用之前需加载 velocity.js

css_effect: 指定元素显示的动画效果,基于 animate.css 动画实现。使用之前需安装 animate.css

parent: 用于指定动画效果作用于元素的哪个父级元素。可取值:

  • 父元素的 selector 选择器(字符串)

  • 父级层级 level(整数)

node_type: 指定 react 将生成的元素类型,默认为'img'。

placeholder: 占位元素,除了支持普通的图片外,还支持 react 组件。

2. 支持 velocity.jsanimate.css 动画效果库,及自定动画效果。同时还支持动画效果作用于父级元素。

指定 js-effect 配置项来配置 velocity.js 动画效果,注意:js-effect 依赖于 velocity.js。需要确保 velocity.js 已加载。

// 引入 lazyimgimport Lazyimg, { withLazyimg } from'react-lazyimg-component';
// 引入 volecity.jsimport'velocity-animate';
import'velocity-animate/velocity.ui';
// 配置const config = {
  placeholder: 'loading.svg',
  js_effect: 'transition.fadeIn', // 支持 velocity.js 动画效果
};
const Lazy = withLazyimg(config);
// 调用
<Lazy
  className="lazy"
  src={'http://zhansingsong.github.io/lazyimg/22.4582fc71.jpg'}
/>;

指定 css-effect 配置项来配置 animate.css 动画效果,注意:css-effect 依赖于 animate.css。需要确保 animate.css 已安装。

// 配置const config = {
    js_effect="transition.flipXIn"// 不会生效
    css_effect={['animated', 'rollIn']} // 定制 css 动画效果
  };
  const Lazy = withLazyimg(config);
  // 调用
  <Lazy
    className="lazy"
    src={'http://zhansingsong.github.io/lazyimg/22.4582fc71.jpg'}
  />;

指定 parent 配置项指定父级元素动画效果,singsong: 为什么懒加载的动画效果只作用于目标元素,某些条件下作用于目标元素的父级元素会有意想不到效果哦。

<div className="example">
  // 指定动画效果作用于该父级元素
  <Title title="父级动画效果" className="sub" />
  <divclassName="example-img"><LazyimgclassName="lazy"src={'http://zhansingsong.github.io/lazyimg/22.4582fc71.jpg'}
      css_effect={['animated', 'flipInY']} // 定制 css 动画效果
      parent=".example" // 指定父级元素选择器,也可以指定父级层级level:2
    /></div></div>

3. react 组件式 placeholder

传统的 placeholder 通常都是由图片来代替,为什么不能用组件来定制,这样可扩展性更高。完全可以摆脱设计师的束缚,咋们开发自由发挥,想想有木有有点小鸡冻。

先定义 placeholder 组件

import React from'react';
import'./style.scss';
exportdefault props => {
let { className, text, img, children } = props;
return (
<divclassName={['placeholder', className]
.filter(item => {
if (item) {
return item;
}
})
.join(' ')}
>
{img && <imgsrc={img}className="placeholder-img" />}
{text && <spanclassName="placeholder-text">{children || text}}

);
};

指定 placeholder 配置项为上述定义的 placeholder 组件

// 配置const Lazy = withLazyimg({
js_effect: 'transition.perspectiveDownIn',
placeholder: <Placeholder img={require('./loading.svg')} />,
});
// 调用
<Lazy
className="lazy"
src={'http://zhansingsong.github.io/lazyimg/22.4582fc71.jpg'}
/>;

4. 响应式图片( picture / srcset )

为了实现 web 应用的极致体验,Progressive Web App 渐进式网页应用程序越来越受到开发者们重视,其中响应式图片就是其中一个重要技术项。为了跟着大部队,咋们也需要了解了解噢!

srcset 特性实现响应式图片

// dpr
<LazyimgclassName="lazy"src={'http://zhansingsong.github.io/lazyimg/22.4582fc71.jpg'}
  srcSet="source_1x.png 1x, source_2x.png 2x, source_3x.png 3x, source_3.5x.png 3.5x"js_effect="transition.bounceIn"
/>

这里 srcset 配合 sizes 特性可以实现更好的效果。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

请恋爱

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文