小程序中吸底按钮适配 iPhone X 方案

针对iPhoneX的特殊屏幕设计,本文介绍了一种小程序底部按钮的适配方案,通过检测设备型号并调整布局参数,确保用户体验不受影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着第二三批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)
    console.log(res.pixelRatio)
    console.log(res.windowWidth)
    console.log(res.windowHeight)
    console.log(res.language)
    console.log(res.version)
    console.log(res.platform)
  }
})

其中model便是设备的型号等信息,如果model中包含iPhone X,便可认为该设备为iPhone X,我们在入口文件app.js中去进行检测,然在全局增加一个isIpx字段,将结果赋予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底部圆角的方案就完成了。至于为什么采用68rpx,因为iPhone X和iPhone 6的屏幕宽度都是375px,小程序中750rpx = 375px = 750物理像素,结合下面两图能解释原因:



最最后,iPhone X壕可以扫描下面小程序码进行体验,欢迎拍砖指正~~~


本文作者:壮壮壮
原文地址: 小程序中吸底按钮适配 iPhone X 方案

### 微信小程序中苹果设备按钮适配问题的解决方案微信小程序开发过程中,针对苹果设备上的按钮适配问题,主要涉及两个方面:一是由于 iPhone X 及以上版本引入了底部虚拟 Home 键区域导致的安全区问题;二是不同屏幕尺寸可能导致按钮位置不一致或被遮挡的情况。 #### 安全区适配 对于带有底部虚拟 Home 键的设备(如 iPhone X),可以通过 CSS 中的 `env()` 或 `constant()` 函数来动态调整布局,确保按钮不会被虚拟按键覆盖。以下是具体的实现方式: ```css page { /* 使用 CSS 变量定义安全边距 */ --safe-area-bottom: 0; --safe-area-bottom: env(safe-area-inset-bottom); } .button-container { padding-bottom: var(--safe-area-bottom); /* 动态设置底部间距 */ } ``` 通过这种方式可以有效避免按钮被虚拟 Home 键遮挡的问题[^3]。 #### 获取系统信息并动态计算高度 为了进一步提升兼容性和灵活性,还可以利用 `wx.getSystemInfo` 接口获取当前设备的信息,并结合 `SelectorQuery` 计算特定节点的高度,从而精确控制按钮的位置。以下是一个完整的示例代码: ```javascript Page({ data: { buttonBottomMargin: 0, // 按钮距离底部的距离 }, onLoad() { this.calculateButtonPosition(); }, calculateButtonPosition() { const self = this; // 获取窗口高度 wx.getSystemInfo({ success(res) { const screenHeight = res.screenHeight; const safeArea = res.safeArea || {}; const bottomHeight = screenHeight - (safeArea.bottom || screenHeight); // 更新数据中的底部间隔 self.setData({ buttonBottomMargin: bottomHeight }); // 查询页面中其他固定高度元素的影响 const query = wx.createSelectorQuery().in(this); query.select('.other-fixed-element').boundingClientRect((rect) => { if (rect) { const adjustedBottomMargin = bottomHeight + rect.height; self.setData({ buttonBottomMargin: adjustedBottomMargin }); } }).exec(); }, }); }, }); ``` 在此基础上,可以在 WXML 文件中绑定动态样式属性: ```html <view class="button-container" style="padding-bottom: {{buttonBottomMargin}}px;"> <button>提交</button> </view> ``` 这种做法能够很好地应对因设备差异而导致的布局错乱问题[^2][^4]。 #### 总结 综合来看,解决苹果设备上按钮适配的核心在于合理运用 CSS 的环境变量以及借助 API 实现精准测量与动态调整。无论是静态配置还是运行时计算,都需要充分考虑目标用户的设备特性及其可能带来的视觉干扰因素。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值