微信小程序圖片自適應(yīng)實(shí)現(xiàn)解析
這篇文章主要介紹了微信小程序圖片自適應(yīng)實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
關(guān)于微信小程序圖片自適應(yīng)的做法
在日常業(yè)務(wù)場景中,很多地方都需要圖片進(jìn)行列表的顯示,但是這樣就存在一個(gè)問題,由于每張上傳的圖片規(guī)格并不是一樣的,就會發(fā)生圖片要么過大,要么過小,或者被拉伸的情況,如下圖

對于這個(gè)情況,我的思路是可以使用image標(biāo)簽內(nèi)的bindload屬性進(jìn)行計(jì)算,bindload屬性的介紹如下

下面就是具體的方法流程
1、首先我們在頁面上進(jìn)行布局,只需要給image標(biāo)簽的view容器添加寬高即可,并使用wx:for進(jìn)行遍歷渲染,通過自定義屬性data-i傳入索引值,容器我同時(shí)也加入了動態(tài)屬性,就是為了計(jì)算后圖片不會超出整個(gè)容器的大小導(dǎo)致布局的錯(cuò)亂
<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中定義模擬數(shù)據(jù),并定義image屬性空對象,用該對象通過key值放入相對應(yīng)下標(biāo)的圖片寬高屬性
page({
data:{
list_1: [{ url: '../../img/1.jpg' }, { url: '../../img/2.jpg' }, { url: '../../img/3.jpg' }, { url: '../../img/4.jpg' }],
imgmsg:{}
}
})
3、添加imageLoad方法去進(jìn)行圖片大小的計(jì)算,這里我們可以通過wx.createSelectorQuery()方法去獲取圖片容器的寬高,通過事件對象可以獲取圖片原始寬高,具體方法如下
//顯示圖片自適應(yīng)
imageLoad(e) {
//獲取小程序節(jié)點(diǎn)屬性的api
const query = wx.createSelectorQuery()
var imgw = e.detail.width, //圖片原始寬度
imgh = e.detail.height, //圖片原始高度
index = e.currentTarget.dataset.i, //圖片下標(biāo)
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;
//由于圖片的大小不一定,可能寬高都會超出整個(gè)圖片容器,因此這里多用了圖片本身的寬高進(jìn)行的判斷
if (imgw > imgh || imgw > viewW) { //當(dāng)圖片自身的寬大于圖片自身的高,將圖片的寬等于容器的寬,去計(jì)算圖片的高
imgw = viewW;
imgh = imgw / ratio;
} else if (imgw < imgh || imgh > viewH) { //當(dāng)圖片自身的寬小于圖片自身的高,將圖片的高等于容器的高,去計(jì)算容器的寬
imgw = viewH * ratio;
imgh = viewH;
}
//把圖片計(jì)算后的寬高屬性根據(jù)下標(biāo)存入到對象中,并使用math的floor方法取整
image[index] = {
width: Math.floor(imgw),
height: Math.floor(imgh)
}
//更新視圖
that.setData({
imgmsg: image
})
})
query.exec()
},
好了,到這里,我們可以看下具體的結(jié)果了



簡單的列表圖片自適應(yīng)功能實(shí)現(xiàn)了,但是這個(gè)方法還能進(jìn)行擴(kuò)展和優(yōu)化,如果有好的想法可以一起學(xué)習(xí)交流,共同提高
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
PhantomJS快速入門教程(服務(wù)器端的 JavaScript API 的 WebKit)
Phantom JS是一個(gè)服務(wù)器端的 JavaScript API 的 WebKit。其支持各種Web標(biāo)準(zhǔn): DOM 處理, CSS 選擇器, JSON, Canvas, 和 SVG2015-08-08
es6學(xué)習(xí)筆記之Async函數(shù)基本教程
這篇文章主要給大家介紹了關(guān)于es6中Async函數(shù)的基本教程,文中介紹的非常詳細(xì),對大家學(xué)習(xí)async函數(shù)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-05-05
TypeScript?使用?Tuple?Union?聲明函數(shù)重載
這篇文章主要介紹了TypeScript?使用?Tuple?Union?聲明函數(shù)重載,TypeScript 中為函數(shù)添加多個(gè)簽名后,依然需要添加相應(yīng)的代碼來判斷并從不同的簽名參數(shù)列表中獲取對應(yīng)的參數(shù),下文就來探索方法和技巧吧2022-04-04
原生JS實(shí)現(xiàn)匯率轉(zhuǎn)換功能代碼實(shí)例
這篇文章主要介紹了原生JS實(shí)現(xiàn)匯率轉(zhuǎn)換功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Radio 單選JS動態(tài)添加的選項(xiàng)onchange事件無效的解決方法
radio 單選JS動態(tài)添加的選項(xiàng),onchange事件無效。使用delegate()函數(shù)可以解決該問題,具體解決方案大家通過本文詳細(xì)了解下2016-12-12
關(guān)于JavaScript的內(nèi)存與性能問題解決匯總
這篇文章主要介紹了關(guān)于JavaScript的內(nèi)存與性能問題解決匯總,在JavaScript中,頁面中事件處理程序的數(shù)量與頁面整體性能直接相關(guān),原因有很多,下面就一起來看看具體的總結(jié)吧2022-04-04
JS和css實(shí)現(xiàn)檢測移動設(shè)備方向的變化并判斷橫豎屏幕
這篇文章主要介紹了JS和css實(shí)現(xiàn)檢測移動設(shè)備方向的變化并判斷橫豎屏幕,本文分別給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05
js實(shí)現(xiàn)背景圖片感應(yīng)鼠標(biāo)變化的方法
這篇文章主要介紹了js實(shí)現(xiàn)背景圖片感應(yīng)鼠標(biāo)變化的方法,實(shí)例分析了javascript針對鼠標(biāo)事件與css樣式圖片的操作技巧,需要的朋友可以參考下2015-02-02
javascript實(shí)現(xiàn)鼠標(biāo)拖動改變層大小的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)鼠標(biāo)拖動改變層大小的方法,涉及javascript操作鼠標(biāo)事件及樣式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
兼容IE與firefox火狐的回車事件(js與jquery)
今天看了網(wǎng)上的朋友說了,很多網(wǎng)站提供的回車事件代碼都是不兼容firefox的,其實(shí)腳本之家提供的代碼,一直以來都是盡量的兼容多瀏覽器。2010-10-10

