千家信息网

微信小程序怎么实现图片自适应

发表于:2024-10-23 作者:千家信息网编辑
千家信息网最后更新 2024年10月23日,本篇内容介绍了"微信小程序怎么实现图片自适应"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先我们来
千家信息网最后更新 2024年10月23日微信小程序怎么实现图片自适应

本篇内容介绍了"微信小程序怎么实现图片自适应"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

首先我们来看看图片组件给的一些说明:

属性名类型默认值说明
srcString
图片资源地址
modeString'scaleToFill'图片裁剪、缩放的模式
binderrorHandleEvent
当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: 'something wrong'}
bindloadHandleEvent
当图片载入完毕时,发布到 AppService 的事件名,事件对象event.detail = {height:'图片高度px', width:'图片宽度px'}

注:image组件默认宽度300px、高度225px

mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式。

模式说明
scaleToFill不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素
aspectFit保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。
aspectFill保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。
widthFix宽度不变,高度自动变化,保持原图宽高比不变

如果说要有一种比较合适的方案,大概是widthFix,然而上面这些模式中,所要求的前提是需要给图片标签设定一个宽度值或者一个高度值。但有时候我们根本不想限定图片的宽高,我们需要的是图片自身能够根据自身的大小来适配。

而widthFix模式就要求你必须先设定一个宽度值,如果出来的图片比给定的width小呢?此时图片则会发生拉伸的现象。 (常见应用在文章中,因为文章中的插图有可能比默认的宽小,比如常见的表情)。

其实上面的标签中,图片为我们预留了一个函数bindLoad。下面看看我是怎么支持自适应的。

有一个前提,就是多图的时候,你需要知道这个图片是处于所有中的位置index,我们通过这个位置来保存图片的宽度和高度。

var px2rpx = 2, windowWidth=375;page({ data:{ imageSize:{} }, onLoad:function(options){ wx.getSystemInfo({ success: function(res) { windowWidth = res.windowWidth; px2rpx = 750 / windowWidth; } }) }, imageLoad:function(e){ //单位rpx var originWidth = e.detail.width*px2rpx,  originHeight = e.detail.height*px2rpx, ratio = originWidth/originHeight; var viewWidth = 710,viewHeight//设定一个初始宽度 //当它的宽度大于初始宽度时,实际效果跟mode=widthFix一致 if(originWidth>= viewWidth){ //宽度等于viewWidth,只需要求出高度就能实现自适应 viewHeight = viewWidth/ratio; }else{ //如果宽度小于初始值,这时就不要缩放了 viewWidth = originWidth; viewHeight = originHeight; } var imageSize = this.data.imageSize; imageSize[e.target.dataset.index] = { width:viewWidth, height:viewHeight } this.setData({ imageSize:imageSize }) }})

如果我们的图片中不仅限定了宽度,还限定了高度值,比如我们限定max-height之类的。那我们的imageLoad函数则要调整为根据他们的宽高比来输出。

imageLoad:function(e){ var originWidth = e.detail.width * px2rpx, originHeight=e.detail.height *px2rpx, ratio = originWidth/originHeight ; var viewWidth = 220,viewHeight = 165, viewRatio = viewWidth/viewHeight; if(ratio>=viewRatio){ if(originWidth>=viewWidth){ viewHeight = viewWidth/ratio; }else{ viewWidth = originWidth; viewHeight = originHeight } }else{ if(originWidth>=viewWidth){ viewWidth = viewRatio*originHeight }else{ viewWidth = viewRatio*originWidth; viewHeight = viewRatio*originHeight; } } var image = this.data.imageSize; image[e.target.dataset.index]={ width:viewWidth, height:viewHeight } this.setData({ imageSize:image})},

附录:小图预览,进入全屏模式。

用预览图片的API,wx.previewImage(OBJECT)以下是对应的代码,样式部分,自行布局。

html代码:

 

JS

Page({ data: { pictures: [ 'https://cache.yisu.com/upload/ask_collection/20210725/111/125022.jpg', 'https://cache.yisu.com/upload/ask_collection/20210725/111/125023.jpg', 'https://cache.yisu.com/upload/ask_collection/20210725/111/125024.jpg', 'https://cache.yisu.com/upload/ask_collection/20210725/111/125025.jpg', 'https://cache.yisu.com/upload/ask_collection/20210725/111/125026.jpg', 'https://cache.yisu.com/upload/ask_collection/20210725/111/125028.jpg', 'https://cache.yisu.com/upload/ask_collection/20210725/111/125029.jpg', 'https://cache.yisu.com/upload/ask_collection/20210725/111/125030.jpg' ] }, previewImage: function(e){ var that = this, index = e.currentTarget.dataset.index, pictures = this.data.pictures; wx.previewImage({ current: pictures[index], urls: pictures }) }})

"微信小程序怎么实现图片自适应"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0