数据API 案例 开发者 关于
掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务
新闻动态 > 媒体报道

微信小程序图片自适应,支持多图

微信小程序图片自适应,是一个比较常见的需求,平时我们在WEBView中,只需要设置max-width:100%.在微信里面虽然widthFix也能实现,但有一个缺陷就是图片的宽度值要大于或者等于设定的值,否则就会发生拉伸变形,本文通过另外一种来适应。

首先我们来看看图片组件给的一些说明:

注:image组件默认宽度300px、高度225px

mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式。

如果说要有一种比较合适的方案,大概是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
    })
  }
})

原文来自:前端开发博客

掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务
新闻动态 > 媒体报道
微信小程序图片自适应,支持多图
发布:2017-02-28

微信小程序图片自适应,是一个比较常见的需求,平时我们在WEBView中,只需要设置max-width:100%.在微信里面虽然widthFix也能实现,但有一个缺陷就是图片的宽度值要大于或者等于设定的值,否则就会发生拉伸变形,本文通过另外一种来适应。

首先我们来看看图片组件给的一些说明:

注:image组件默认宽度300px、高度225px

mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式。

如果说要有一种比较合适的方案,大概是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
    })
  }
})

原文来自:前端开发博客

电话 0512-88869195
数 据 驱 动 未 来
Data Drives The Future