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


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 相关文章推荐
Js获取数组最大和最小值示例代码
Oct 29 Javascript
javascript 表格内容排序 简单操作示例代码
Jan 03 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
Feb 17 Javascript
jQuery简单实现隐藏以及显示特效
Feb 26 Javascript
javascript常用方法总结
May 14 Javascript
浅谈jquery拼接字符串效率比较高的方法
Feb 22 Javascript
bootstrap弹出层的多种触发方式
May 10 Javascript
jQuery简单绑定单个事件的方法示例
Jun 10 jQuery
微信小程序中post方法与get方法的封装
Sep 26 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 jQuery
区分vue-router的hash和history模式
Oct 03 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
Dec 03 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 static局部静态变量和全局静态变量总结
2014/03/02 PHP
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
对Python中9种生成新对象的方法总结
2018/05/23 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
Python单元测试与测试用例简析
2019/11/09 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
大四学生毕业自荐信
2013/11/07 职场文书
驾驶员安全责任书
2014/07/22 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
今日说法观后感
2015/06/08 职场文书
七年级思品教学反思
2016/02/20 职场文书
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android