开发 | 小程序中吸底按钮适配 iPhone X 方案
文 | 张少壮 @ 豌豆公主前端工程师
随着第二、三批 iPhone X 的陆续到货,身边的土豪们纷纷用了起来。又因为 iPhone X 的齐刘海导致的适配问题很多,所以这群土豪更沉浸在各种找 bug 中。
不出所料,「豌豆公主」小程序在一些地方也出现了一丢丢体验不好的地方。首当其冲的,是商品详情页和购物车的吸底按钮栏,会与 Home Indicator 横条(俗称「小白条」)重叠,这样在点击下方按钮时很容易误触发手势操作。
是 bug 就得修,是体验问题就得优化,于是立马搞了一台 iPhone X 开始研究。
网页端的适配还好,有 viewport meta 标签,以及下面的方案进行处理
{
position: fixed;
bottom: 0;
width: 100%;
height: constant(safe-area-inset-bottom);
background-color: #fff;
}
但小程序就比较尴尬了。
从四个角被裁掉的表现,可以推测小程序里的 viewport-fit
默认为 cover
,但是没有接口去更改。所以网页端通过 viewport-fix=cover
和 constant(safe-area-inset-bottom);
的适配方案不适合小程序。
目前,也没有看到小程序有对 iPhone X 等异形屏有特殊的接口或字段。小程序本身的底部 tab 栏对 iPhone X 的适配,也只是简单的加了一个白色底栏,提高了原有 tab 栏的位置。
为什么这么说呢?因为这一点可以从我们购物车页面看出,购物车页吸底操作并非通过 position: fixed; bottom: 0;
实现的,而是根据 windowHeight
减去自身高度,计算 top 值,从而模拟的吸底。
在小程序新版本自身适配 iPhone X 后,导致购物车底部按钮被盖住了一半,由此得出上面的结论(当然,此处为猜测)。
言归正传,既然没有特殊的方案获取该值,我们只能通过 wx.getSystemInfo 接口取获取设备信息,该接口使用方法如下:
wx.getSystemInfo({
success: function(res) {
console.log(res.model)
}
})
其中,res.model
便是设备的型号等信息,如果 model
中包含 iPhone X
字样,便可认为该设备为 iPhone X。我们在 app.js
中进行检测,然在全局增加一个 isIpx
字段,用于判断机型。
在子页面中可以读取该值,举个商品详情页的栗子:
<!-- goods.wxml -->
<view class="button-group {{isIpx?'fix-iphonex-button':''}}">
这是一个吸底按钮区域
</view>
// goods.js
let app = getApp();
Page({
data: {
isIpx: app.globalData.isIpx?true:false
}
})
/* app.wxss */
.fix-iphonex-button {
bottom:68rpx!important;
}
.fix-iphonex-button::after {
content: ' ';
position: fixed;
bottom: 0!important;
height: 68rpx!important;
width: 100%;
background: #fff;
}
于是,一个简单的适配 iPhone X 底部圆角的方案就完成了。
至于为什么是 68 rpx,因为 iPhone X 的屏幕宽度和 iPhone 6 一样,都是 375 pt,但高度要比 iPhone 6 高了 145 pt。而小程序中 750 rpx = 375 pt = 750 物理像素,换算一下,就可以得出这个结论了。
最最后,iPhone X 壕可以扫描下面小程序码进行体验,欢迎拍砖指正~
「豌豆公主」小程序使用链接
https://minapp.com/miniapp/5112/
原文地址:
https://juejin.im/post/5a1d396551882546d71f157b
关注「知晓程序」公众号,在微信后台回复「开发」,让你的小程序性能再上一层楼。