iPhone X适配
由于
iPhone X
屏幕顶部状态栏区域有刘海屏
,以及在屏幕底部增加了操作条
,在开发中需适配机型最近开发微信小程序:在
iPhone X, XS, XR, XS Max
机型适配,我在项目中写了iPhone X
适配的方法,在其它几个屏下也差不多(这里就没有详细适配)
ps
: 抽时间记录下,以下是个人使用方案(仅供参考),欢迎大神们指教…
文章目录
效果图
设计稿对比图
1. 通过getSystemInfo获取信息
通过 wx.getSystemInfo API获取相关数据。可以根据该方法返回的手机型号字段
model
是否包含iPhone X
字符串来判断设备,也可以根据媒体查询
来判断。
- 下图展示
真机调试
、模拟器
所获取数据。
步骤如下:
综合上面得到的相关信息,通过
model
值进行判断。注意: 模拟器
model
值跟真机上是不一样的,这里通过search()来检索字符串
- 在
app.js
文件中 创建全局变量
,然后获取设备型号 - 在需要的页面.js
onload
中获取app.js
定义的全局变量isIPhoneX
值 - 在
wxml
中判断为iPhoneX
添加类名 - 在
wxss
中添加需要的样式即可
app.js
App({
// 小程序启动入口
onLaunch: function (options) {
// 获取设备信息
this.getSystemInfo()
},
/**
* 全局数据
*/
globalData: {
isIPhoneX: false, //当前设备是否为 iPhone X
},
/**
* 获取设置信息
*/
getSystemInfo: function() {
let that = this;
wx.getSystemInfo({
success: function(res) {
console.log('获取系统信息', res);
let models = res.model;
if (models.search('iPhone X') != -1) {
that.globalData.isIPhoneX = true
}
}
});
},
})
index.js
//在data中这样获取模拟器上有效果, 真机上不行(请大神指教)
data: {
// isIphoneX: app.globalData.systemInfo.model == "iPhone X" ? true : false,
},
onLoad: function (options) {
let that = this;
//获取iphoneX..
let isIPhoneX = app.globalData.isIPhoneX;
if (isIPhoneX) {
that.setData({
isIPX: isIPhoneX
})
}
}
index.wxml
<view class="{{isIPX ? 'isIPXActives' : ''}}">tabbar</view>
/
<!-- 当元素上有类名时可以这样写 -->
<view class="tabbarBox {{isIPX ? 'isIPXActives' : ''}}">tabbar</view>
index.wxss
.isIPXActives {
// 操作条
padding-bottom: 68rpx;
}
2. 媒体查询方法
可以根据
高度
和Dpr
判断
/* iPhone X, iPhone XS */
@media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) {
.testBox {
font-size: 68rpx;
}
}
/* iPhone XR */
@media only screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) {
.testBox {
font-size: 78rpx;
}
}
/* iPhone XS Max */
@media only screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) {
.testBox {
font-size: 78rpx;
}
}
/* 以下这种写法iPhone X XS XR XS Max统一设置样式(发现有些项目中这样写不起作用?) */
@media screen and (min-device-height: 812px) and (max-device-height: 896px) {
.userInfoBox {
height: 44%;
}
.infoListBox {
height: 56%;
}
}
3. 小结
感谢 https://blog.csdn.net/qq_33608748/article/details/82769570整理的知识
iOS适配所用到的切图及对应机型
4. 通过设置viewport-fit
方法
说明: 这是iOS11
新增特性,苹果公司为了适配iPhoneX
对现有 viewport meta
标签的一个扩展,用于设置网页
在可视窗口的布局方式,可设置三个值:
contain
: 可视窗口完全包含网页内容(左图)cover
:网页内容完全覆盖可视窗口(右图)auto
:默认值,跟 contain 表现一致
注意:
网页
默认不添加扩展的表现是 viewport-fit=contain,需要
适配 iPhoneX 必须
设置 viewport-fit=cover
,这是适配的关键步骤。
env 函数
iOS11
新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个
预定义的变量:
- safe-area-inset-left:安全区域距离
左边
边界距离 - safe-area-inset-right:安全区域距离
右边
边界距离 - safe-area-inset-top:安全区域距离
顶部
边界距离 - safe-area-inset-bottom:安全区域距离
底部
边界距离
说明: 这里我们只需要关注 safe-area-inset-bottom
这个变量,因为它对应的就是小黑条的高度(横竖屏时值不一样)。
<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> -->
<meta name="viewport" content="... viewport-fit=cover">
.btn {
/* 底部 */
padding-bottom: env(safe-area-inset-bottom);
/* 顶部 */
padding-top: env(safe-area-inset-top);
}