大家好呀,我是wangly,一名下班摸鱼的前端老倒霉蛋了。今年慢慢的开始把博客抓起来了。分享下一些平常技术和本身作的小项目。此次分享的是一个 <img>
标签在页面上渲染,如何作到让用户感到体验很是棒的呈现方法。html
不是懒加载,和它没有半毛钱都没有。前端
众所周知,图片一直都是属于比较占用资源的东西。由于图片有大有小,小的多是几kb,高清的可能就是 MB
级别的东西了。也致使了用户在获取图片并展现到页面而且观看到时会存在必定的差别性。可能有些人家境贫寒,直接5G + 千兆网,风通常的速度,无痛的直接加载了出来。但也还有不少人网络限速,或者内网,局域网下的项目,你须要展现一些图片,速度时比较慢的,可能会加载失败。出现无图片,或者白色效果。vue
很明显这张图片由于网速的问题加载失败了,而这种图片就不是用户想要看到的。因此咱们一块儿来改造它吧。 @ wangly:此功能,已经集合到我的elegance-ui 组件库,代码都时取自其源码。git
结构很是的简单,一开始原本是考虑用伪类实现的,后面发现可能须要作自定义留了个遮罩层准备作插槽。放上一张完成后模板代码图片。 github
<div class="gan-image">
</div>
复制代码
<div class="gan-image">
<div class="over"></div>
</div>
复制代码
<div class="gan-image">
<div class="over"></div>
<img src="" />
</div>
复制代码
实现逻辑也很是简单,这个流程其实就是一个promise的执行过程。typescript
加载中 => 完成 | 失败编程
因此,咱们使用 state
存放它的状态,默认为 pending
,其次,当 onload
加载完成,状态会变成 resolve
,反之 onerror
失败后,状态会编程 reject
表示失败了。而后遮罩层根据不一样的 state
展现不一样的信息。我这里就没有去作多的处理,毕竟后面我本身会作成插槽去自定义样式。promise
存放图片地址,展现方式,大小,和状态网络
@Prop({ required: true }) src!: string // 图片地址
@Prop({ default: 'fill' }) fit!: string // 图片展现对象
@Prop() width!: number // 宽度
@Prop() height!: number // 高度
private state = 'pending' // 状态
复制代码
被img绑定的方法。里面作一些处理。post
// 图片加载中
private onImageResolve(): void {
this.state = 'resolve' // 成功
this.$emit('resolve', this.state)
}
// 图片加载失败
private onImageReject(): void {
this.state = 'reject' // 错误
this.$emit('reject', this.state)
}
复制代码
获取当前的状态文字。嘻嘻。
get cellText(): string {
const { state } = this
let message = '加载中'
switch (state) {
case 'pending': message = '加载中'
break
case 'reject': message = '加载失败'
break
case 'resolve': message = '加载成功'
break
}
return message
}
复制代码
CSS我想应该能够本身去定制。如loading动画等等...
很是感谢您观看本篇文章,作适合新手初次摸项目,或者不知道怎么去作的。能够先作demo。弄懂其中的原理。若是有哦碰到的小伙伴,能够继续优化下哦。本身使用的时候。 文章项目文件地址:前往github
五月前端面经:点击进入