当前位置: 移动技术网 > IT编程>开发语言>JavaScript > 微信小程序图片自适应支持多图实例详解

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

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

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

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网