Chrome 69中引入了对 env() 常量的支持。尽管我观察到的行为与 iOS 不同。在 iPhone 8 屏幕上没有刘海env(safe-area-inset-top)
等于 20px,而在 Moto G 屏幕上,同样没有刘海,它等于 0。
作为一种解决方法,我使用此函数在页面加载后立即将类设置为正文:
/**
* Android save-area env variables behave differently from iOS ones:
* env(safe-area-inset-top) will return 0 on Android and 20px on iOS.
* In case android behavior spotted, body is added class `app-android-safe-area`
*/
function checkSafeArea() {
const $body = $(document.body);
const $div = $('<div style="padding-top: env(safe-area-inset-top); padding-top: constant(safe-area-inset-top);"></div>');
$div.appendTo($body);
const safeAreaInsetTop = $div.outerHeight();
if (!safeAreaInsetTop) {
$body.addClass('app-android-safe-area');
}
$div.remove();
}
并像这样调整了我的风格:
body.app-ts-mobile & {
margin-top: 20px; // fallback for no safe area support
margin-top: constant(safe-area-inset-top); // iOS 11
margin-top: env(safe-area-inset-top); // iOS 11.2+
}
body.app-ts-mobile.app-android-safe-area & {
margin-top: 20px;
}
虽然我还没有检查env(safe-area-inset-top)
存在缺口的 Android 屏幕上的值是多少。可能是它缺少状态栏高度。