ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

微信小程序 image 组件实战:14 种图片显示模式完整解析

微信小程序 image 组件实战:14 种图片显示模式完整解析 前言在微信小程序开发当中image图片组件是使用频率极高的基础组件。我们在开发时经常遇到图片尺寸和容器尺寸不匹配的问题图片被拉伸变形、部分画面被裁剪、留白过多等等。小程序 image 组件内置了多种 mode 显示模式用来控制图片的缩放、裁剪行为不需要写复杂 CSS 就可以实现各式各样图片展示效果。本文通过一个实战案例一次性演示 image 全部 14 种显示模式同时利用小程序列表渲染循环输出每一种模式、文字说明以及作业拓展的序号编号帮助理解不同 mode 之间的差异以及开发注意事项。案例需求介绍本案例目标是开发一个小程序页面统一使用一张本地风景图片演示 image 组件全部 14 种显示模式。页面纵向滚动浏览每一项包含模式编号、模式文字介绍、实际渲染出来的图片效果。页面外层采用卡片式布局标题红色居中。每一组内容依次展示显示模式编号、该模式的功能描述文本、固定大小容器内渲染的图片。图片容器设置固定宽高以及灰色背景能够直观看到图片拉伸、裁剪、留白效果。作业拓展要求在每段文字说明上方增加模式编号编号从 1 开始一直到 14。重要限制top、bottom、center 等裁剪类模式仅 webview 渲染引擎支持skyline 渲染引擎对这部分 mode 不兼容项目配置需要手动指定渲染引擎为 webview。项目前期准备新建小程序项目选择不使用云服务、不使用模板。在项目根目录新建 images 文件夹把要展示的本地图片放入文件夹内。同时修改 app.json 配置文件将 renderer 设置为 webview保证全部 14 种模式都可以正常运行。页面顶部使用自定义导航栏组件需要通过 npm 安装导航栏依赖执行构建 npm 操作否则导航栏无法正常渲染。页面主体使用 scroll‑view 实现纵向滚动适配内容超出屏幕的场景。核心技术知识点讲解1.image 组件 mode 属性image 组件的 mode 属性是整个组件的灵魂mode 决定图片在给定宽高容器里面如何摆放。总共分为两大类缩放模式与裁剪模式。缩放模式包含 scaleToFill、aspectFit、aspectFill、widthFix、heightFix。这类模式会对图片进行缩放处理。scaleToFill不保留原图宽高比例直接拉伸图片填满整个 image 容器图片很容易变形。aspectFit保持原图比例进行缩放把图片长边缩放到容器范围内整张图片完整显示容器会出现留白。aspectFill保持原图比例缩放短边铺满容器长边超出容器部分直接裁剪适合做头像封面。widthFix容器宽度固定高度跟随原图比例自动变化。heightFix容器高度固定宽度跟随原图比例自动变化。裁剪模式包含 top、bottom、center、left、right 以及四个角落模式。该类模式不会缩放原图直接对原图做局部裁切只展示图片某一块区域仅 webview 引擎可用。例如 top 只显示图片顶部区域bottom right 只截取原图右下角画面。2.wx:for 列表渲染与 block案例中有 14 种图片模式如果手动写 14 份 image 标签会产生大量重复代码维护麻烦。这里使用小程序列表渲染wx:for配合block标签循环渲染页面。block 是逻辑包装标签它本身不会渲染出真实 DOM 节点只做循环判断逻辑。js 中定义 imgArray 数组数组每一个对象保存 mode 模式值和对应的 text 文字说明。wxml 通过 wx:for 遍历这个数组循环输出编号、说明文字、image 组件。wx:for 循环自带内置变量 index代表数组下标下标从 0 开始。作业需要编号从 1 开始直接使用表达式index1实现输出 “显示模式编号1、显示模式编号2……”不需要手动维护编号字段。3. 数据绑定页面上图片地址 src、mode 显示模式、说明文字全部采用双大括号语法做数据绑定。src 绑定图片本地路径item.mode读取循环数组对象里面的模式动态赋值给 image 的 mode 属性实现一张图片切换 14 种展示效果。4. 页面布局思路页面 page 设置高度 100vh采用 flex 纵向布局。scroll‑view 设置 flex:1 占满剩余屏幕高度实现内容滚动。外层盒子 box 设置外边距、内边距、边框模拟卡片容器。标题设置红色、加粗居中。图片容器设置居中上下设置外边距拉开各组模式之间距离。image 标签写死固定宽高 480rpx设置灰色背景图片没有填满容器的时候灰色背景会显露方便观察留白效果。JS 业务逻辑说明在 Page 的 data 中定义两个核心数据src 存放本地图片路径imgArray 是对象数组一共 14 个对象。每一个对象包含 mode 和 text 两个属性。mode 对应 image 组件 mode 合法属性值text 保存该模式的中文功能描述。页面不需要写额外事件函数属于纯展示页面。wxml 通过列表渲染读取 data 里面数组数据自动循环生成全部页面内容。后期如果想要增加或者删除图片模式只需要修改 js 中 imgArray 数组即可wxml 不需要改动代码复用性高。开发踩坑与常见问题总结裁剪模式没有效果skyline 渲染引擎不支持 top、left 等裁剪模式必须修改 app.json 把 renderer 改为 webview。图片不显示图片路径书写错误本地图片路径建议以/开头写绝对路径确认图片已经放入 images 文件夹。wx:for 循环警告wx:for 需要配置 wx:key这里直接用 mode 作为 key提升渲染性能消除控制台警告。导航栏报错忘记 npm 安装导航栏组件或者没有执行 “构建 npm”自定义 navigation‑bar 组件无法识别。图片看不出 mode 效果image 没有设置固定宽高容器和原图尺寸一样缩放裁剪的差异无法直观体现。案例中将 image 设置统一 480rpx 正方形容器方便对比各个 mode 效果。编号输出 0wx:for 的 index 下标从 0 开始需要index1运算实现从 1 开始编号。拓展思考这个案例完整演示 image 的全部 mode实际项目中我们会高频用到 aspectFit、aspectFill、widthFix。比如商品详情图片预览用 aspectFit 完整展示图片首页封面图、头像常用 aspectFill 保证铺满容器超出部分裁剪信息流列表图片使用 widthFix宽度适配屏幕高度自适应。在此案例基础之上还可以做功能拓展可以增加下拉选择器动态切换单张图片 mode或者增加图片上传把本地图片替换成用户上传图片观察不同原图尺寸下各个 mode 的表现。结语image 组件 mode 属性是小程序图片处理的核心能力分为缩放模式与裁剪模式不同模式适合不同业务场景。借助 wx:for 列表渲染我们可以用少量代码批量渲染多组 UI。同时要留意渲染引擎兼容性部分裁剪模式只能运行在 webview 引擎。理解 image 各个 mode 的区别就能够在实际开发中避免图片拉伸变形、显示异常等问题是小程序前端开发必备的基础知识。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进