微信小程序实现图片自适应(支持多图)


Posted in Javascript onJanuary 25, 2017

大家都知道微信小程序图片自适应,是一个比较常见的需求,平时我们在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'}

注:image组件默认宽度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
 })
 }
})

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
Jun 14 Javascript
你可能不知道的JavaScript的new Function()方法
Apr 17 Javascript
对JavaScript中this指针的新理解分享
Jan 31 Javascript
jQuery使用drag效果实现自由拖拽div
Jun 11 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
Aug 27 Javascript
基于zepto的移动端轻量级日期插件--date_picker
Mar 04 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
webpack入门必知必会
Jan 16 Javascript
vue在使用ECharts时的异步更新和数据加载详解
Nov 22 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
Aug 12 Javascript
javascript代码实现简易计算器
Jan 25 Javascript
在JavaScript中如何使用宏详解
May 06 Javascript
js遮罩效果制作弹出注册界面效果
Jan 25 #Javascript
assert()函数用法总结(推荐)
Jan 25 #Javascript
canvas知识总结
Jan 25 #Javascript
基于JavaScript实现自定义滚动条
Jan 25 #Javascript
基于javascript实现数字英文验证码
Jan 25 #Javascript
js阻止移动端页面滚动的两种方法
Jan 25 #Javascript
servlet+jquery实现文件上传进度条示例代码
Jan 25 #Javascript
You might like
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
js获取提交的字符串的字节数
2009/02/09 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
华为的Java面试题
2014/03/07 面试题
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
银行开业庆典方案
2014/02/06 职场文书
红与黑读书笔记
2015/06/29 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
Python何绘制带有背景色块的折线图
2022/04/23 Python