全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

微信小程序实现图片自适应(支持多图)

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# 小程序图片自适应  # 小程序里图片自适应  # 微信小程序自适应  # 微信小程序实现富文本图片宽度自适应的方法  # 微信小程序之swiper轮播图中的图片自适应高度的方法  # 微信小程序实现image组件图片自适应宽度比例显示的方法  # 微信小程序图片自适应支持多图实例详解  # 微信小程序 图片宽度自适应的实现  # 微信小程序 图片等比例缩放(图片自适应屏幕)  # 微信小程序图片自适应实现解析  # 自适应  # 只需要  # 求出  # 有一个  # 的是  # 是一个  # 也就是说  # 我是  # 他们的  # 就会  # 大家都  # 就能  # 将会  # 有可能  # 也能  # 有一种  # 来看看  # 说要  # 只在  # 这篇文章 


相关文章: 大学网站设计制作软件有哪些,如何将网站制作成自己app?  建站之星导航如何优化提升用户体验?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何高效利用亚马逊云主机搭建企业网站?  为什么Go需要go mod文件_Go go mod文件作用说明  如何在万网开始建站?分步指南解析  制作企业网站建设方案,怎样建设一个公司网站?  个人摄影网站制作流程,摄影爱好者都去什么网站?  网站制作企业,网站的banner和导航栏是指什么?  定制建站流程解析:需求评估与SEO优化功能开发指南  如何高效利用200m空间完成建站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何通过PHP快速构建高效问答网站功能?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  如何快速使用云服务器搭建个人网站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  网站制作软件有哪些,制图软件有哪些?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在搬瓦工VPS快速搭建网站?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  西安大型网站制作公司,西安招聘网站最好的是哪个?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  建站主机与服务器功能差异如何区分?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  深圳网站制作的公司有哪些,dido官方网站?  如何在香港服务器上快速搭建免备案网站?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  建站之家VIP精选网站模板与SEO优化教程整合指南  Swift中循环语句中的转移语句 break 和 continue  盘锦网站制作公司,盘锦大洼有多少5G网站?  linux top下的 minerd 木马清除方法  微信推文制作网站有哪些,怎么做微信推文,急?  官网网站制作腾讯审核要多久,联想路由器newifi官网  如何在IIS中新建站点并配置端口与IP地址?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  如何快速生成可下载的建站源码工具?  表情包在线制作网站免费,表情包怎么弄?  已有域名如何快速搭建专属网站?  如何通过cPanel快速搭建网站?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  ,sp开头的版面叫什么?  如何确保FTP站点访问权限与数据传输安全?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  免费视频制作网站,更新又快又好的免费电影网站?  如何选择高性价比服务器搭建个人网站?  如何选择服务器才能高效搭建专属网站?  如何续费美橙建站之星域名及服务?  php json中文编码为null的解决办法  专业商城网站制作公司有哪些,pi商城官网是哪个? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。