Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图片懒加载组件封装,加载时loading效果,加载失败暂时默认图片

图片懒加载组件封装,加载时loading效果,加载失败暂时默认图片

作者头像
用户10106350
发布于 2022-10-28 03:26:43
发布于 2022-10-28 03:26:43
1.6K00
代码可运行
举报
文章被收录于专栏:WflynnWebWflynnWeb
运行总次数:0
代码可运行

组件代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <view class="easy-loadimage" :id="uid">
    <image class="origin-img" :src="imageSrc" :mode="mode" @click="ui.showImg(imageSrc)"
         v-if="loadImg&&!isLoadError" v-show="showImg"
         :class="{'no-transition':!openTransition,'show-transition':showTransition&&openTransition}"
         @load="handleImgLoad" @error="handleImgError">
    </image>
    <view class="loadfail-img" v-else-if="isLoadError"></view>
    <view :class="['loading-img',loadingMode]" v-show="!showImg&&!isLoadError"></view>
  </view>
</template>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>
    // 生成全局唯一id
    function generateUUID() {// eslint-disable-line
        // eslint-disable-next-line
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            const r = Math.random() * 16 | 0 // eslint-disable-line
            const v = c == 'x' ? r : (r & 0x3 | 0x8) // eslint-disable-line
            return v.toString(16) // eslint-disable-line
        })
    }

    export default {
        props: {
            imageSrc: {
                type: String,
            },
            mode: {
                type: String,
            },
            scrollTop: {
                type: Number,
            },
            loadingMode: {
                type: String,
                default: 'looming-gray'
            },
            openTransition: {
                type: Boolean,
                default: true,
            },
            viewHeight: {
                type: Number,
                default() {
                    return uni.getSystemInfoSync().windowHeight
                }
            },
      showAll: { // 是否显示全部图片
          type: Boolean,
          default: true,
          required: false
      },

        },
        watch: {
            scrollTop(val) {
                this.onScroll(val)
            }
        },
        data() {
            return {
                uid: '',
                loadImg: false,
                showImg: false,
                isLoadError: false,
                showTransition: false,
            }
        },
        methods: {
            init() {
                this.uid = 'uid-' + generateUUID()
                this.$nextTick(this.onScroll)
            },
            handleImgLoad(e) {
                this.showImg = true

                setTimeout(() => {
                    this.showTransition = true
                }, 50)
            },
            handleImgError(e) {
                this.isLoadError = true
            },
            onScroll(scrollTop) {
                // 加载ing时才执行滚动监听判断是否可加载
                if (this.loadImg || this.isLoadError) return
                const id = this.uid
                const query = uni.createSelectorQuery().in(this)
                query.select('#' + id).boundingClientRect(data => {
                    if (this.showAll) {
                        this.loadImg = true
                    } else {
                        if (!data) return
                        if (data.top - this.viewHeight < 0) {
                            this.loadImg = true
                        }
          }
                }).exec()
            },
        },
        mounted() {
            this.init()
        }
    }
</script>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style scoped>
  /* 官方优化图片tips */
  image {
    will-change: transform
  }

  /* 渐变过渡效果处理 */
  image.origin-img {
    opacity: 0.3;
  }

  image.origin-img.show-transition {
    transition: opacity 1.2s;
    opacity: 1;
  }

  image.origin-img.no-transition {
    opacity: 1;
  }

  /* 加载失败、加载中的占位图样式控制 */
  .loadfail-img {
    height: 100%;
    background: url('@/static/images/common/loadfail.png') no-repeat center;
    background-size: 50%;
  }

  .loading-img {
    height: 100%;
  }

  /* 转圈 */
  .spin-circle {
    background: url('@/static/images/common/loading1.gif') no-repeat center;
    background-size: 100 rpx;
  }

  /* 动态灰色若隐若现 */
  .looming-gray {
    animation: looming-gray 1s infinite linear;
    background-color: #e3e3e3;
  }

  @keyframes looming-gray {
    0% {
      background-color: #e3e3e3aa;
    }
    50% {
      background-color: #e3e3e3;
    }
    100% {
      background-color: #e3e3e3aa;
    }
  }

  /* 骨架屏1 */
  .skeleton-1 {
    background-color: #e3e3e3;
    background-image: linear-gradient(100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0) 80%);
    background-size: 100 rpx 100%;
    background-repeat: repeat-y;
    background-position: 0 0;
    animation: skeleton-1 .6s infinite;
  }

  @keyframes skeleton-1 {
    to {
      background-position: 200% 0;
    }
  }

  /* 骨架屏2 */
  .skeleton-2 {
    background-image: linear-gradient(-90deg, #fefefe 0%, #e6e6e6 50%, #fefefe 100%);
    background-size: 400% 400%;
    background-position: 0 0;
    animation: skeleton-2 1.2s ease-in-out infinite;
  }

  @keyframes skeleton-2 {
    to {
      background-position: -135% 0;
    }
  }
</style>

调用方法示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <view class="list">
        <view class="item" v-for="(item,index) of list" :key="index">
            <imgLoad  mode="widthFix"
                :scroll-top="scrollTop"
                :image-src="item.image"></imgLoad >
            <text>{{item.content}}</text>
        </view>
    </view>
</template>
    export default{
        data(){
            return {
                list:MockData, // 此处放自己的测试数据
                scrollTop:0
            }
        },
        onPageScroll({scrollTop}) {
            // 传入scrollTop值并触发所有easy-loadimage组件下的滚动监听事件
            this.scrollTop = scrollTop;
        },
    }

<style scoped>
    .list{display: flex;justify-content: space-between;flex-wrap: wrap;padding: 32rpx;background: #F1F1F1;}
    .list .item{width: 48%;background: #fff;margin-bottom: 80rpx;border-radius: 20rpx;}
    .list .item >>> .easy-loadimage{
        width: 100%;
        /* height: 500rpx; */
        margin-bottom: 38rpx;
    }
    .list .item >>> .origin-img{
        border-radius: 20rpx;
    }
    /* mode为widthFix即图片高度自适应时要设置占位图默认高度 */
    .list .item >>> .loadfail-img,.list .item >>>.loading-img{
        height: 500rpx;
    }
</style

组件属性

属性名

类型

必填

默认值

说明

image-src

String

图片资源地址

scroll-top

Number

传入滚动值监听并触发组件

mode

String

同image组件的mode属性

loading-mode

String

looming-gray

loading加载中的占位图效果

open-transition

Boolean

true

是否开启加载成功后的渐现过渡效果

view-height

Number

真机可视窗高度

可视区域高度

view-height属性说明

  • 在大量图片在同一个页面使用该组件时可传入可视区域高度,避免重复获取窗口高度
  • 你也可以在页面(父组件)传入比真机可视窗高度更大的值当做阈值提前进入加载

loading属性说明

说明

spin-circle

转圈圈

looming-gray

动态灰背景若隐若现

skeleton-1

骨架屏效果1

skeleton-2

骨架屏效果2

你也可以在以此类推在源码上修改或者扩展为你理想的样式

使用深度作用选择器>>>或在插件源码CSS部分上进行样式修改

类名元素说明

类名

说明

.easy-loadimage

图片父元素

.origin-img

源图片

.loading-img

加载占位图

.loadfail-img

加载失败占位图

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WflynnWeb 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2022年09月 微信小程序-图片懒加载功能实现
大型电商,一个页面会存在非常多的图片,一次性加载图片会很慢,用户体验度不好,而图片懒加载是为了提这些网页的打开的速度,获得更好用户体验的一种手段。其选择的重要的部分先加载,次要的部分需要的时候再加载。
愚公搬代码
2022/09/28
1.2K0
【愚公系列】2022年09月 微信小程序-图片懒加载功能实现
手写原生代码专题 | 三角板 Loading 效果和骨架屏图片卡片预加载效果(三)
编写CSS的思路如下,最重要的是要理解如何用 Div 实现三角形,具体的实现思路如下:
前端达人
2021/08/12
9330
图片懒加载
Vue实现一个图片懒加载插件 Vue.use()、Vue.direction、Vue图片懒加载插件实现
达达前端
2019/07/22
2.1K0
vue模态框组件封装
代码已上传至github github代码地址:https://github.com/Miofly/mio.git
用户10106350
2022/10/28
1.7K0
实现H5中Skeleton Screen骨架屏预加载动态效果
现在很多web和客户端都已经放弃了以前的那种菊花的加载方式,转而使用Skeleton Screen Loading,比如Facebook、国内的淘宝等都使用了骨架屏来提升它们的加载体验。本文主要讨论这种骨架屏在H5上的实现,以以下业务场景为例:
程fay
2020/12/18
7.4K1
实现H5中Skeleton Screen骨架屏预加载动态效果
css实现动态效果
在线显示地址:https://gethtml.cn/project/2020/03/17/index.html
Dreamy.TZK
2020/04/09
6.9K0
微信小程序简单的用户页面模板
wxml <view class='index-contier'> <view class="index-center"> <view class="logo"> <open-data type="userAvatarUrl" class="userinfo" id="userinfo1"></open-data> </view> <view id="userinfo2"> <open-data type="userNickName" class="u
王小婷
2022/05/13
1.2K0
微信小程序简单的用户页面模板
创建一个具有背景轮播和3D卡片翻转效果的个人名片网页
在本篇博客中,我们将学习如何创建一个具有多个功能的个人名片网页。这个项目包括背景轮播效果和3D卡片翻转效果,适合前端开发初学者。
命运之光
2024/03/20
5040
创建一个具有背景轮播和3D卡片翻转效果的个人名片网页
强大的图片预览组件Viewer.js
Viewer.js 是一款强大的图片查看器。我们通过Viewer.js 在页面上添加强大的图片查看功能,同时,这款优秀的插件配置操作起来也非常的方便。
五月
2022/11/14
3.8K0
强大的图片预览组件Viewer.js
CSS八种让人眼前一亮的HOVER效果
巧用伪元素:before、:after等,让你的页面按钮眼前一亮。原文链接:8 amazing HTML button hover effects, that will make your website memorable。更多内容:github.com/reng99/blog…
Jimmy_is_jimmy
2020/10/15
9400
用CSS新属性实现特殊的图片显示效果
使用一个或多个图像相关的CSS属性(background-blend-mode, mix-blend-mode, or filter)可以实现许多特殊的图片显示效果。本文转载自Bennett Feely的个人网站,文中共列举了20种图片显示效果。
毛瑞
2019/09/19
1.3K0
光标有反转效果的侧边导航(附源代码)
这是一个侧边导航效果,这个展开的效果给人一种很柔和的感觉,展开后菜单内容依次显示,最后是增加了一个聚焦的圆跟随光标移动,当遇到菜单内容时会放大圆形并反转显示菜单文字,加深了对导航的交互,这里的反转色基于 mix-blend-mode: difference 实现。这个效果还有两个主题色切换,有兴趣的可以在线看效果。
半夜喝可乐
2024/10/10
2100
光标有反转效果的侧边导航(附源代码)
使用CSS gradient制作绚丽渐变纹理背景效果
一直对渐变背景这块比较感兴趣,但是因为每天加班实在太忙了,任务也比较多。所以就只能下班的时间研究渐变背景这方面的知识,一来满足了自己的好奇心,二来可以更加了解这方面的知识。跟更多不断学习的小伙伴们一起进步,一起汲取新的知识。不断成长,不断精进自己的知识。有想一起讨论技术,一起成长的伙伴们,也可以加微信一起交流。各微信群里面,有很多前端领域的大佬,在他们身上学到了很多,今后也努力向他们看齐。不断提升自己。加油。
微芒不朽
2022/09/13
2.6K0
用css3实现惊艳面试官的背景即背景动画(高级附源码)
这篇文章参考《css揭秘》这本书,并作出了自己的总结,希望能让大家更有收获,也强烈推荐大家看看这本书,你值得拥有。我们将学到
徐小夕
2019/09/24
9220
用css3实现惊艳面试官的背景即背景动画(高级附源码)
微信小程序滑块验证方法
如图: 滑块验证组件 puzzleVerify目录 index.wxml <!-- 滑动验证弹窗 --> <view class="slide_model" wx:if="{{slidebel}}"> <view class="slide_wrapper"> <!-- 拼图图片部分 --> <view class="canvas_img" id="canvas_img"> <!-- 背景图片 --> <canvas style="width: {{canvas_width}
江一铭
2022/06/17
1.8K0
微信小程序滑块验证方法
【愚公系列】2022年03月 微信小程序-视图容器
覆盖在原生组件之上的图片视图。可覆盖的原生组件同cover-view,支持嵌套在cover-view里。
愚公搬代码
2022/12/01
6870
【愚公系列】2022年03月 微信小程序-视图容器
CSS实用技巧总结
全名Don't Repeat Yourself,该原则适用于所有编程语言而不限于css。
Nealyang
2020/04/22
1.6K0
CSS实用技巧总结
css3的一些新属性总结
box-sizing规定了盒子的计算方式,常用于消除hover时,盒子之间的影响,有三个属性:
一个淡定的打工菜鸟
2018/09/06
4040
JavaScript——图片懒加载
github | https://github.com/wangyang0210/bky/tree/picLoadLazy
思索
2024/08/16
2300
JavaScript——图片懒加载
小程序tab实现之swiper自适应高度并记录滚动位置
移动端中需要使用swiper插件实现tab切换和手势滑动的,在各种APP上我们可以很常见,但在小程序上实现这个看起来有点难,因为swiper插件滑动到下一屏的时候位置总是会回到跟上一屏相同的位置。我记得微信刚出来不久,有一个这样子的需求,那时候是另外一个同事在跟,跟我说到过这个功能无法实现。最近我也接到这个需求,于是我认真的看了一下微信组件文档,发现swiper+scroll-view组件结合是可以实现这个功能。
前端开发博客
2020/11/04
2.3K0
小程序tab实现之swiper自适应高度并记录滚动位置
推荐阅读
相关推荐
【愚公系列】2022年09月 微信小程序-图片懒加载功能实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验