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

网友投稿 292 2023-05-06


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

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

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

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

oGuLhmKDMQ

属性名

类型

默认值

说明

src

String

图片资源地址

mode

String

'scaleToFill'

图片裁剪、缩放的模式

binderror

oGuLhmKDMQ 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,我们通过这个位置来保存图片的宽度和高度。

bindLoad="imageLoad" style="width:{{imageSize[0].width}}rpx; height:{{imageSize[0].height}}

rpx" data-index="0" mode="scaleToFill"/>

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代码:

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.previewImagehttp://({

current: pictures[index],

urls: pictures

})

}

})

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

bindLoad="imageLoad" style="width:{{imageSize[0].width}}rpx; height:{{imageSize[0].height}}

rpx" data-index="0" mode="scaleToFill"/>

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代码:

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.previewImagehttp://({

current: pictures[index],

urls: pictures

})

}

})

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

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代码:

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.previewImagehttp://({

current: pictures[index],

urls: pictures

})

}

})

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mock工具服务器搭建(如何搭建mock服务)
下一篇:详解webpack分离css单独打包
相关文章

 发表评论

暂时没有评论,来抢沙发吧~