微信小程序图片自适应支持多图实例详解
微信小程序图片自适应,是一个比较常见的需求,平时我们在WEBView中,只需要设置max-width:100%.在微信里面虽然widthFix也能实现,但有一个缺陷就是图片的宽度值要大于或者等于设定的值,否则就会发生拉伸变形,本文通过另外一种来适应。
首先我们来看看图片组件给的一些说明:
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
src | String | 图片资源地址 | |
mode | String | 'scaleToFill' | 图片裁剪、缩放的模式 |
binderror | HandleEvent | 当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: 'something wrong'} | |
bindload | HandleEvent | 当图片载入完毕时,发布到 AppService 的事件名,事件对象event.detail = {height:'图片高度px', width:'图片宽度px'} |
注:imagehtml" target="_blank">组件默认宽度300px、高度225px
mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式。
模式 | 说明 |
---|---|
scaleToFill | 不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素 |
aspectFit | 保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。 |
aspectFill | 保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。 |
widthFix | 宽度不变,高度自动变化,保持原图宽高比不变 |
如果说要有一种比较合适的方案,大概是widthFix,然而上面这些模式中,所要求的前提是需要给图片标签设定一个宽度值或者一个高度值。但有时候我们根本不想限定图片的宽高,我们需要的是图片自身能够根据自身的大小来适配。
而widthFix模式就要求你必须先设定一个宽度值,如果出来的图片比给定的width小呢?此时图片则会发生拉伸的现象。(常见应用在文章中,因为文章中的插图有可能比默认的宽小,比如常见的表情)。
其实上面的标签中,图片为我们预留了一个函数bindLoad。下面看看我是怎么支持自适应的。
有一个前提,就是多图的时候,你需要知道这个图片是处于所有中的位置index,我们通过这个位置来保存图片的宽度和高度。
<image src="http://ww4.sinaimg.cn/bmiddle/006q8Q6bjw1fbwucs1cctj30t80t8myh.jpg" bindLoad="imageLoad" style="width:{{imageSize[0].width}}rpx; height:{{imageSize[0].height}} rpx" data-index="0" mode="scaleToFill"/> <image src="http://ww4.sinaimg.cn/bmiddle/006q8Q6bjw1fbwucs1cctj30t80t8myh.jpg" bindLoad="imageLoad" style="width:{{imageSize[1].width}}rpx; height:{{imageSize[1].height}}rpx" data-index="1" mode="scaleToFill"/>
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代码:
<view class="wrap"> <image wx:for="{{pictures}}" wx:key="unique" src="{{item}}" data-index="{{index}}" bindtap="previewImage"></image> </view>
JS
Page({ data: { pictures: [ 'https://p0.meituan.net/movie/ea4ac75173a8273f3956e514a4c78018253143.jpeg', 'https://p0.meituan.net/movie/5d4fa35c6d1215b5689257307c461dd2541448.jpeg', 'https://p0.meituan.net/movie/0c49f98a93881b65b58c349eed219dba290900.jpg', 'https://p1.meituan.net/movie/45f98822bd15082ae3932b6108b17a01265779.jpg', 'https://p1.meituan.net/movie/722de9a7b0c1f9c262162d87eccaec7c451290.jpg', 'https://p0.meituan.net/movie/cb9be5bbedb78ce2ef8e83c93f83caca474393.jpg', 'https://p1.meituan.net/movie/a852b992cdec15319c717ba9fa9b7a35406466.jpg', 'https://p1.meituan.net/movie/dc1f94811793e9c653170cba7b05bf3e484939.jpg' ] }, previewImage: function(e){ var that = this, index = e.currentTarget.dataset.index, pictures = this.data.pictures; wx.previewImage({ current: pictures[index], urls: pictures }) } })
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍微信小程序wx.previewImage预览图片实例详解,包括了微信小程序wx.previewImage预览图片实例详解的使用技巧和注意事项,需要的朋友参考一下 一.小知识 二.例子 1.wxml 2.wxss 3.js 使用网络的图 使用本地的图片: 所以这个接口, 按照官方示例, 可能只支持 http 或者 https 协议的网络图片地址. 注意: 网上还有说本地图片确实是不可以
本文向大家介绍微信小程序上传图片实例,包括了微信小程序上传图片实例的使用技巧和注意事项,需要的朋友参考一下 在网上看了好多小程序上传图片,java后端接收的示例,但是不管在哪个网站看的,代码基本是一样的,都是代码特别多。 所以就自己写一个比较简单的。 一 小程序端 user.wxml user.js 二 java端 图片存在了项目的temp目录下 简单就好,没其他功能,单纯上传图片。 以上就是
本文向大家介绍详解微信小程序开发聊天室—实时聊天,支持图片预览,包括了详解微信小程序开发聊天室—实时聊天,支持图片预览的使用技巧和注意事项,需要的朋友参考一下 第一次写小程序,老板就让我用websoket写个聊天对话,群聊这种。第一次写聊天功能,第一次用websoket,第一次用小程序,这是在考验我吗?不过我还是研究了一下,终于实现了。 首先看一下界面,界面很简单,就是首页刚进来获取了用户信息头像
本文向大家介绍微信小程序实现图片上传,包括了微信小程序实现图片上传的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下/p> 图片上传服务器: wxml wxss 思路很简单,多张上传的话,在 upImgs 方法回调做判断 index++ 继续调用 upImgs方法即可 以上就是本文的全部内容,希望对大家的学习有所帮助,也希
本文向大家介绍微信小程序实现image组件图片自适应宽度比例显示的方法,包括了微信小程序实现image组件图片自适应宽度比例显示的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了微信小程序实现image组件图片自适应宽度比例显示的方法。分享给大家供大家参考,具体如下: 一. 了解image组件 由于image有默认的固定的宽度和高度,这样我们在做图片自适应的时候,就不好做了。下面就来一
本文向大家介绍微信小程序 swiper组件轮播图详解及实例,包括了微信小程序 swiper组件轮播图详解及实例的使用技巧和注意事项,需要的朋友参考一下 微信小程序 swiper组件轮播图 照着开发文档尝试,总是能有所收获.之前做Android开发,做个轮播图并不简单,用上viewpage再设置圆点,折腾一通之后还一堆bug.今天尝试微信小程序开发做轮播图,真是感动的泪流满面.废话说完了,上图.