安卓:
scroll-view
滚动到底部有时候不触发滚动事件(2022.01.25):
IOS 滚动到底部滚动条还能往上拉一段距离,因此不存在这个问题。
解决方法:如果是想监听 bindscrolltolower 事件,可以通过将 lower-threshold
的数值设置得大一些;如果是想监听 bindscroll 事件,暂时没有解决方法。
IOS:
scroll- view
的最后一个子元素设置 margin-bottom
无效(2022.01.25):
解决方法:使用 padding-bottom
替代 margin-bottom
。
给 page 设置背景色,下拉或者上拉页面,页面会出现一块白色区域(橡皮筋效果):
解决方法:可以在 app.json
或者 page.json
中设置 backgroundColor/backgroundColorTop/backgroundColorBottom。
安全距离兼容问题:
iPhone X 之后的苹果机型都需要注意安全区域的问题。安全区域距离上下左右都有一段安全距离。
例如:如果不处理 IOS 底部安全距离兼容的问题,那么 iPhone X 之后的苹果机型将会出现底部操作栏被底部横条遮挡的问题。
解决方法:
- 可以通过微信小程序提供的
wx.getSystemInfo()
来获取整个屏幕的高度和安全区域底部的纵坐标,然后计算出安全区域距离底部边界的距离,借助计算出的这个值设置下内边距,将这段距离撑开。
这种方式需要先获取高度,然后计算,最后再赋值,比较繁琐。
// 自定义固定在页面底部的操作栏组件
// 此处 padding-bottom 中的 +30 是自己编写的默认内边距样式
<view class="container" style="padding-bottom: {{safeAreaInsetBottom + 30}}rpx">
<view class="action-bar">
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
</view>
</view>
Component({
data: {
safeAreaInsetBottom: 30,
},
pageLifetimes: {
show() {
wx.getSystemInfo({
success: (res) => {
// 使用屏幕高度减去安全区域底部的纵坐标,得到安全区域距离底部边界的距离
const safeAreaInsetBottom = res.screenHeight - res.safeArea.bottom
this.setData({safeAreaInsetBottom})
}
})
}
},
})
.container {
width: 100%;
padding: 30rpx;
box-sizing: border-box;
background: #fff;
border-top: 2rpx solid #efefef;
position: fixed;
bottom: 0;
z-index: 99;
}
.action-bar {
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
}
- 创建一个安全距离的自定义组件,通过苹果官方提供的函数来获取安全距离,撑开自定义组件,在需要的地方引入放置这个自定义组件即可。
苹果官方提供了两个 CSS 函数:
constant()
(兼容 IOS < 11.2)和env()
(兼容 IOS >= 11.2)用于获取安全区域与边界的距离。推荐使用。
有 4 个预定义变量:
safe-area-inset-left
:安全区域距离左边边界的距离。safe-area-inset-right
:安全区域距离右边边界的距离。safe-area-inset-top
:安全区域距离顶部边界的距离。safe-area-inset-bottom
:安全区域距离底部边界的距离。
// 自定义安全距离组件
<view class="safe-distance-{{direction}}"></view>
Component({
properties: {
direction: String,
},
})
.safe-distance-top {
width: 100%;
padding-top: constant(safe-area-inset-top);
padding-top: env(safe-area-inset-top);
}
.safe-distance-bottom {
width: 100%;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
.safe-distance-left {
width: 100%;
padding-left: constant(safe-area-inset-left);
padding-left: env(safe-area-inset-left);
}
.safe-distance-right {
width: 100%;
padding-right: constant(safe-area-inset-right);
padding-right: env(safe-area-inset-right);
}
.safe-distance-all {
width: 100%;
padding-top: constant(safe-area-inset-top);
padding-top: env(safe-area-inset-top);
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
padding-left: constant(safe-area-inset-left);
padding-left: env(safe-area-inset-left);
padding-right: constant(safe-area-inset-right);
padding-right: env(safe-area-inset-right);
}
// 在固定在页面底部的操作栏组件中使用自定义安全距离组件
<view class="container">
<view class="action-bar">
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
</view>
<safe-dsitance direction='bottom'></safe-dsitance>
</view>