微信小程序图片自适应支持多图实例详解


Posted in Javascript onJune 21, 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 CHECKBOX全选,取消全选,反选方法三
Aug 30 Javascript
JS图片自动轮换效果实现思路附截图
Apr 30 Javascript
JS+CSS实现电子商务网站导航模板效果代码
Sep 10 Javascript
详解JavaScript函数
Dec 01 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
Jun 03 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
May 23 Javascript
详解webpack 热更新优化
Sep 13 Javascript
微信小程序自定义轮播图
Nov 04 Javascript
微信小程序官方动态自定义底部tabBar的例子
Sep 04 Javascript
Vue 自定义指令实现一键 Copy功能
Sep 16 Javascript
vue实现扫码功能
Jan 17 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
Jul 27 Javascript
javascript+html5+css3自定义提示窗口
Jun 21 #Javascript
详解webpack分离css单独打包
Jun 21 #Javascript
AngularJS动态绑定ng-options的ng-model实例代码
Jun 21 #Javascript
Angular中ng-options下拉数据默认值的设定方法
Jun 21 #Javascript
基于jquery日历价格、库存等设置插件
Jul 05 #jQuery
详解Angular 自定义结构指令
Jun 21 #Javascript
详解Angular2 之 结构型指令
Jun 21 #Javascript
You might like
用PHP开发GUI
2006/10/09 PHP
php Static关键字实用方法
2010/06/04 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
JS实现简单的表格增删
2020/01/16 Javascript
Python多层装饰器用法实例分析
2018/02/09 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
python K近邻算法的kd树实现
2018/09/06 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
2020/05/15 Python
深入探究HTML5的History API
2015/07/09 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
财务会计毕业生自荐信
2013/11/02 职场文书
驾驶员安全责任书
2014/07/22 职场文书
手机销售员岗位职责
2015/04/11 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
关于保护环境的建议书
2019/06/24 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python
解决Oracle数据库用户密码过期
2022/05/11 Oracle