QQ扫一扫联系
由于UNIAPP中 image 懒加载不能兼容H5和APP端,H5可以通过 vue-lazyload 来实现,APP 图片懒加载一直没有特别好的方案。
APP端可以 使用如下代码可以监听页面Dom元素是否加载
const observer = uni.createIntersectionObserver(this); observer.relativeToViewport().observe('#' + this.uid, res => { if (res.boundingClientRect.top < this.SystemConfig.Height) { // 图片可以显示了 observer.disconnect() } })
完整的VUE组件如下。
<template> <view> <view :class="classList" :style="styleList" :id="uid"> <!-- #ifdef MP-WEIXIN --> <image lazy-load="true" fade-show :mode="contain?'aspectFit':'aspectFill'" :src="src"/> <!-- #endif --> <!-- #ifdef H5 --> <img v-lazy="src" :style="{objectFit:contain?'contain':'cover'}"/> <!-- #endif --> <!-- #ifdef APP-PLUS --> <image v-if="imageShow" class="image" fade-show :mode="contain?'aspectFit':'aspectFill'" :src="src"/> <view v-else></view> <!-- #endif --> </view> </view> </template> <script> let ID_NUMBER = 0; export default { name: "c-cover", props: { src: { type: String, default: '' }, ratio: { type: String, default: '1-1' }, contain: { type: Boolean, default: false }, borderRadius: { type: String, default: '0' } }, data() { return { timer: null, uid: '', imageShow: false, } }, created() { this.uid = 'CCover' + (ID_NUMBER++) }, mounted() { // #ifdef APP-PLUS const observer = uni.createIntersectionObserver(this); observer.relativeToViewport().observe('#' + this.uid, res => { if (this.imageShow) { return } if (res.boundingClientRect.top < this.SystemConfig.Height) { this.imageShow = true observer.disconnect() } }) // #endif }, computed: { classList() { let classList = ['ratio-' + this.ratio] if (this.contain) { classList.push('contain') } return classList }, styleList() { let styleList = {} if (this.borderRadius) { styleList.borderRadius = this.borderRadius } return styleList } }, } </script> <style scoped> .pb-cover { position: relative; overflow: hidden; &:after { content: ''; display: block; padding-bottom: 100%; } &.contain { .image { object-fit: contain; } } &.ratio-1-1 { &:after { padding-bottom: 100%; } } .image, .image-holder { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-holder { background-color: #FFFFFF; } } </style>