很快微信开发者平台

 找回密码
 注册
查看: 2066|回复: 7

微信小程序开发图片自适应并且支持多图实例教程

[复制链接]

30

主题

55

帖子

1075

积分

专家路上

积分
1075
 楼主| 发表于 2018-5-7 22:50:35 | 显示全部楼层 |阅读模式
微信小程序开发图片自适应并且支持多图实例教程

微信小程序图片自适应,是一个比较常见的需求,平时我们在WEBView中,只需要设置max-width:100%.在微信里面虽然widthFix也能实现,但有一个缺陷就是图片的宽度值要大于或者等于设定的值,否则就会发生拉伸变形,本文通过另外一种来适应。

首先我们来看看图片组件给的一些说明:
属性名类型默认值说明最低版本
srcString 图片资源地址
modeString'scaleToFill'图片裁剪、缩放的模式
lazy-loadBooleanfalse图片懒加载。只针对page与scroll-view下的image有效1.5.0
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,我们通过这个位置来保存图片的宽度和高度。
  1. <image src="http://ww4.sinaimg.cn/bmiddle/006q8Q6bjw1fbwucs1cctj30t80t8myh.jpg"
  2. bindLoad="imageLoad" style="width:{{imageSize[0].width}}rpx; height:{{imageSize[0].height}}
  3. rpx" data-index="0" mode="scaleToFill"/>
  4. <image src="http://ww4.sinaimg.cn/bmiddle/006q8Q6bjw1fbwucs1cctj30t80t8myh.jpg"
  5. bindLoad="imageLoad" style="width:{{imageSize[1].width}}rpx; height:{{imageSize[1].height}}rpx"
  6. data-index="1" mode="scaleToFill"/>
复制代码
  1. var px2rpx = 2, windowWidth=375;
  2. page({
  3.   data:{
  4.     imageSize:{}
  5.   },
  6.   onLoad:function(options){
  7.     wx.getSystemInfo({
  8.      success: function(res) {
  9.       windowWidth = res.windowWidth;
  10.       px2rpx = 750 / windowWidth;
  11.      }
  12.     })
  13.   },
  14.   imageLoad:function(e){
  15.     //单位rpx
  16.     var originWidth = e.detail.width*px2rpx,
  17.     originHeight = e.detail.height*px2rpx,
  18.     ratio = originWidth/originHeight;
  19.     var viewWidth = 710,viewHeight//设定一个初始宽度
  20.     //当它的宽度大于初始宽度时,实际效果跟mode=widthFix一致
  21.     if(originWidth>= viewWidth){
  22.       //宽度等于viewWidth,只需要求出高度就能实现自适应
  23.       viewHeight = viewWidth/ratio;
  24.     }else{
  25.       //如果宽度小于初始值,这时就不要缩放了
  26.       viewWidth = originWidth;
  27.       viewHeight = originHeight;
  28.     }
  29.     var imageSize = this.data.imageSize;
  30.     imageSize[e.target.dataset.index] = {
  31.       width:viewWidth,
  32.       height:viewHeight
  33.     }
  34.     this.setData({
  35.       imageSize:imageSize
  36.     })
  37.   }
  38. })
复制代码

如果我们的图片中不仅限定了宽度,还限定了高度值,比如我们限定max-height之类的。那我们的imageLoad函数则要调整为根据他们的宽高比来输出。
  1. imageLoad:function(e){
  2.   var originWidth = e.detail.width * px2rpx,
  3.   originHeight=e.detail.height *px2rpx,
  4.   ratio = originWidth/originHeight ;
  5.   var viewWidth = 220,viewHeight = 165, viewRatio = viewWidth/viewHeight;
  6.   if(ratio>=viewRatio){
  7.     if(originWidth>=viewWidth){
  8.       viewHeight = viewWidth/ratio;
  9.     }else{
  10.       viewWidth = originWidth;
  11.       viewHeight = originHeight
  12.     }
  13.   }else{
  14.     if(originWidth>=viewWidth){
  15.       viewWidth = viewRatio*originHeight
  16.     }else{
  17.       viewWidth = viewRatio*originWidth;
  18.       viewHeight = viewRatio*originHeight;
  19.     }
  20.   }
  21.   var image = this.data.imageSize;
  22.   image[e.target.dataset.index]={
  23.     width:viewWidth,
  24.     height:viewHeight
  25.   }
  26.   this.setData({
  27.   imageSize:image
  28. })
  29. },
复制代码

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

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

WXML代码:
  1. <view class="wrap">
  2. <image wx:for="{{pictures}}" wx:key="unique" src="{{item}}" data-index="{{index}}" bindtap="previewImage"></image>
  3. </view>
复制代码

JS
  1. Page({
  2. data: {
  3.   pictures: [
  4.    'https://p0.meituan.net/movie/ea4ac75173a8273f3956e514a4c78018253143.jpeg',
  5.    'https://p0.meituan.net/movie/5d4fa35c6d1215b5689257307c461dd2541448.jpeg',
  6.    'https://p0.meituan.net/movie/0c49f98a93881b65b58c349eed219dba290900.jpg',
  7.    'https://p1.meituan.net/movie/45f98822bd15082ae3932b6108b17a01265779.jpg',
  8.    'https://p1.meituan.net/movie/722de9a7b0c1f9c262162d87eccaec7c451290.jpg',
  9.    'https://p0.meituan.net/movie/cb9be5bbedb78ce2ef8e83c93f83caca474393.jpg',
  10.    'https://p1.meituan.net/movie/a852b992cdec15319c717ba9fa9b7a35406466.jpg',
  11.    'https://p1.meituan.net/movie/dc1f94811793e9c653170cba7b05bf3e484939.jpg'
  12.   ]
  13. },
  14. previewImage: function(e){
  15.   var that = this,
  16.     index = e.currentTarget.dataset.index,
  17.     pictures = this.data.pictures;
  18.   wx.previewImage({
  19.    current: pictures[index],
  20.    urls: pictures
  21.   })
  22. }
  23. })
复制代码
回复

使用道具 举报

0

主题

717

帖子

2623

积分

专家路上

积分
2623
发表于 2018-5-8 07:32:33 | 显示全部楼层
支持支持
回复

使用道具 举报

0

主题

378

帖子

4597

积分

专家路上

积分
4597
发表于 2018-5-8 08:41:05 | 显示全部楼层
留言好了
回复

使用道具 举报

2

主题

382

帖子

4378

积分

专家路上

积分
4378
发表于 2018-5-8 09:15:23 | 显示全部楼层
图片自适应,是一个比较常见的需求,平时我们在WEBView中,只需要设置max-width:100%.在微信里面虽然widthFix也能实现,但有一个缺陷就是图片的宽度值要大于或者等于设定的值,否则就会发生拉伸变形,本文通过另外一种来适应。
回复

使用道具 举报

30

主题

55

帖子

1075

积分

专家路上

积分
1075
 楼主| 发表于 2018-5-8 15:21:58 | 显示全部楼层
a514410507 发表于 2018-5-8 09:15
图片自适应,是一个比较常见的需求,平时我们在WEBView中,只需要设置max-width:100%.在微信里面虽然widthF ...

别水了,都快洪灾了
回复

使用道具 举报

0

主题

27

帖子

210

积分

新人求带

积分
210
发表于 2018-5-8 21:39:49 | 显示全部楼层
没看明白,拿分
回复

使用道具 举报

0

主题

18

帖子

150

积分

新人求带

积分
150
发表于 2018-6-6 20:38:58 | 显示全部楼层
看看啊。不醋
回复

使用道具 举报

0

主题

7

帖子

60

积分

等待验证会员

积分
60
发表于 2018-6-10 11:52:14 | 显示全部楼层
同时还要在mini文件夹内
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|很快微信开发者平台 ( 津ICP备16002644号-1 )

GMT+8, 2022-1-24 15:18 , Processed in 0.027273 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表