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


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 相关文章推荐
js操作textarea方法集合封装(兼容IE,firefox)
Feb 22 Javascript
jquery 查找select ,并触发事件的实现代码
Mar 30 Javascript
javascript删除option选项的多种方法总结
Nov 22 Javascript
javascript 表格内容排序 简单操作示例代码
Jan 03 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
Feb 04 Javascript
js 获取input点选按钮的值的方法
Apr 14 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
Dec 17 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
Jan 21 Javascript
bootstrap select插件封装成Vue2.0组件
Apr 17 Javascript
webpack优化的深入理解
Dec 10 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
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和ACCESS写聊天室(九)
2006/10/09 PHP
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
Python进行统计建模
2020/08/10 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
科室工作的个人自我评价
2013/10/30 职场文书
房地产广告策划方案
2014/05/15 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
升职感谢信
2015/01/22 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
新党员入党决心书
2015/09/22 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript