關於微信小程序圖片自適應的部分做法


關於微信小程序圖片自適應的做法

在日常業務場景中,很多地方都需要圖片進行列表的顯示,但是這樣就存在一個問題,由於每張上傳的圖片規格並不是一樣的,就會發生圖片要么過大,要么過小,或者被拉伸的情況,如下圖

對於這個情況,我的思路是可以使用image標簽內的bindload屬性進行計算,bindload屬性的介紹如下

 

下面就是具體的方法流程

1、首先我們在頁面上進行布局,只需要給image標簽的view容器添加寬高即可,並使用wx:for進行遍歷渲染,通過自定義屬性data-i傳入索引值,容器我同時也加入了動態屬性,就是為了計算后圖片不會超出整個容器的大小導致布局的錯亂

<block wx:for="{{list_1}}" wx:key="{{index}}">
   <view class="top_img" style="width:{{imgmsg?imgmsg[index].width:''}}px;height:{{imgmsg?imgmsg[index].height:''}}px">
            <image style="width:{{imgmsg[index].width}}px !important;height:{{imgmsg[index].height}}px !important;" 
            src="{{item.url}}" 
            bindload="imageLoad"
            data-i="{{index}}" />
        </view>
  </block>

2、在js中定義模擬數據,並定義image屬性空對象,用該對象通過key值放入相對應下標的圖片寬高屬性

page({
    data:{
        list_1: [{ url: '../../img/1.jpg' }, { url: '../../img/2.jpg' }, { url: '../../img/3.jpg' }, { url: '../../img/4.jpg' }],
        imgmsg:{}
    }
})

3、添加imageLoad方法去進行圖片大小的計算,這里我們可以通過wx.createSelectorQuery()方法去獲取圖片容器的寬高,通過事件對象可以獲取圖片原始寬高,具體方法如下

//顯示圖片自適應
  imageLoad(e) {
    //獲取小程序節點屬性的api
    const query = wx.createSelectorQuery()
    var imgw = e.detail.width, //圖片原始寬度
      imgh = e.detail.height, //圖片原始高度
      index = e.currentTarget.dataset.i, //圖片下標
      ratio = imgw / imgh, //圖片寬高比
      image = this.data.imgmsg, //圖片寬高的索引對象
      that = this,
      viewW = null,//容器寬度
      viewH = null;//容器高度
    query.select('.top_img').boundingClientRect(function(res) {
      viewW = res.width; 
      viewH = res.height;
      //由於圖片的大小不一定,可能寬高都會超出整個圖片容器,因此這里多用了圖片本身的寬高進行的判斷
      if (imgw > imgh || imgw > viewW) { //當圖片自身的寬大於圖片自身的高,將圖片的寬等於容器的寬,去計算圖片的高
        imgw = viewW;
        imgh = imgw / ratio;
      } else if (imgw < imgh || imgh > viewH) { //當圖片自身的寬小於圖片自身的高,將圖片的高等於容器的高,去計算容器的寬
        imgw = viewH * ratio;
        imgh = viewH;
      }
      //把圖片計算后的寬高屬性根據下標存入到對象中,並使用math的floor方法取整
      image[index] = {
        width: Math.floor(imgw),
        height: Math.floor(imgh)
      }
      //更新視圖
      that.setData({
        imgmsg: image
      })
    })
    query.exec()
  },

好了,到這里,我們可以看下具體的結果了

 

 

 簡單的列表圖片自適應功能實現了,但是這個方法還能進行擴展和優化,如果有好的想法可以一起學習交流,共同提高


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM