百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> 小程序实现图片含糊预加载
分享文章到:

小程序实现图片含糊预加载

发布时间:09/01 来源:未知 浏览: 关键词:
导语


比来在做的小程序项目设计大量图片的展现,小程序已经供给了图片的懒加载功效,但是由于图片本身比力大加上要展现的图片比力多,怎样以一个比力友好的方式展现未加载完成的历程就是一个必需解决的问题了。

思绪


由于小程序没有供给 Image 这个 js 对象,所以在小程序中实现预加载不克不及直接像原生js 一样,直接使用 new Image()创立一个图片对象,只能在视图层创立图片,通过onLoad事件监听图片加载完成。

实现图片含糊加载的思绪就是先加载一个目标图片的缩略图,缩略图的加载一样非常快可以忽略不计,缩略图加载完成之后以高斯含糊的情势展现,与此同时加载原图,原图加载完成后替换原缩略图,原图和缩略图需要设定雷同的宽高。 思绪理分明之后,开端码代码吧~

由于项目使用了Taro框架,下面的代码写法是React的写法,原生或者其他框架也可以参照 ,没有太大的出入,思绪都是一样的。

imgLoader.js(以下为部分代码)

       // 监听原图加载完成
	toggleOriginLoaded() {
		this.setState({
			loaded: true
		});
	}
	// 监听缩略图加载完成
	toggleThumbLoaded() {
		this.setState({
			thumbLoaded: true
		});
	}
	
	render() {
		let { loaded, thumbLoaded } = this.state;
		let { imgU, imgW, imgH } = this.props;
		// 按照传入的宽高设定缩略图和原图的宽高
		let style = {
			width: imgW + 'rpx',
			height: imgH + 'rpx'
		}
		
		return (
			<Block>
				<Image
					className='image--not-loaded'
					style={Object.assign({ display: loaded ? 'none' : 'auto' }, style)}
					lazyLoad
					mode='aspectFill'
					onLoad={this.toggleThumbLoaded.bind(this)}
					src={compressImage(imgU, '10x' + parseInt(imgH * 10 / imgW))}
				/>
				{thumbLoaded && (
					<Image
						style={Object.assign({ display: loaded ? 'auto' : 'none' }, style)}
						lazyLoad
						className='image--is-loaded'
						mode='aspectFill'
						src={imgU}
						onLoad={this.toggleOriginLoaded.bind(this)}
					/>
				)}
			</Block>
		);
	}

以上为主要视图层和逻辑层代码,其中compressImage函数是用来处置图片剪裁也就是缩略图的生成的,(ps:我们是用nginx实现的动态紧缩,裁剪等功效,有需要的小伙伴可以自行搜索相关教程~)

主要逻辑处置完成之后我们再来看含糊样式的处置,在此就要介绍一个 css 办法 blur()。

blur() CSS办法将高斯含糊利用于输出图片。它只要一个接受一个参数blur(radius)

radius 表示含糊的半径,值为length。 它定义了高斯函数的标准偏向值,即屏幕上有多少像素彼此融合; 因此,较大的值会发生
更多含糊。值为0会使输入保持不变。 该值为空则为0。(来自MDN)它可以生成相似毛玻璃样式的图片,如下图:

0.png

理解了这个办法之后,就让我们来兴奋的玩耍(写代码)吧~ 我们可以给这个结果增加一个小动画,让它看起来更成心思哦~

.image--not-loaded{
  // fix ios 缺少重绘的问题,增加无意义的transform强迫触发重绘
  transform: scale(1);
  filter:blur(30px);
}
.image--is-loaded{
  // fix ios 缺少重绘的问题,增加无意义的transform强迫触发重绘
  transform: scale(1);
  filter:blur(20px);
  animation: sharpen 0.8s both;
}
@keyframes sharpen {
  0% {
    filter: blur(20px);
  }
  100% {
    filter: blur(0px);
  }
}

需要留意的是blur办法在ios上会显现没法准确展现的问题,查询了相关文章后发明是由于ios 缺少重绘,就是ios不会按照这个代码从新绘制页面因此不克不及准确展现,假如要解决这个问题只要给他加上一条没成心义的transform,强迫触发重绘就可以了~~

引荐教程:《微信小程序》

以上就是小程序实现图片含糊预加载的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板