DCloud_App_Array
DCloud_App_Array
  • 发布:2015-10-28 18:05
  • 更新:2019-01-07 15:31
  • 阅读:67593

如何动态兼容沉浸式状态栏模式

分类:HTML5+

HBuilder6.6.1版本已经完全支持沉浸式状态栏,可以下载最新版本HelloH5应用体验。
各平台配置参考:

  1. Android平台设置沉浸式状态栏显示效果
  2. iOS平台设置沉浸式状态栏显示效果

由于各系统版本的限制,沉浸式状态栏对系统有要求(Android4.4及以上、iOS7.0及以上),如果要兼容各系统版本,需要动态判断当前环境是否支持沉浸式状态栏以及系统状态栏的高度:

使用5+API

  • 判断当前环境是否支持沉浸式状态栏
    plus.navigator.isImmersedStatusbar()
    如果当前支持沉浸式状态栏则返回true,否则返回false。
  • 获取当前系统状态栏高度
    plus.navigator.getStatusbarHeight()
    获取系统状态栏高度,Number类型。
    其单位是逻辑像素值,即css中可直接使用的像素值,可能存在小数点。

实际用法参考HelloH5应用的“plus/doc.html”:

    // 创建加载内容窗口  
    var topoffset='45px';  
    if(plus.navigator.isImmersedStatusbar()){// 兼容immersed状态栏模式  
        // 获取状态栏高度并根据业务需求处理,这里重新计算了子窗口的偏移位置  
        topoffset=(Math.round(plus.navigator.getStatusbarHeight())+45)+'px';  
    }  
    // 使用偏移位置创建子窗口  
    wc=plus.webview.create(null,'doccontent',{top:topoffset,bottom:'0px',bounce:'vertical',bounceBackground:'#FFFFFF'});

通过userAgent判断
5+API需要在plusready事件后才能调用,通常此事件在DOM加载渲染后才会触发,无法再渲染前根据不同的状态来设置css。
为了解决此问题,在支持5+API运行环境的userAgent中特定字段Html5Plus/1.0后添加Immersed标识,如下:
"Html5Plus/1.0 (Immersed/30)"
其中Immersed/后的30表示状态栏的高度,单位为逻辑像素值。

可以使用正则表达式进行获取:

var immersed = 0;  
var ms=(/Html5Plus\/.+\s\(.*(Immersed\/(\d+\.?\d*).*)\)/gi).exec(navigator.userAgent);  
if(ms&&ms.length>=3){ // 当前环境为沉浸式状态栏模式  
    immersed=parseFloat(ms[2]);// 获取状态栏的高度  
}

immersed值如果大于0则表示当前环境支持沉浸式状态栏。
获取状态栏高度后,可以使用js动态修改DOM元素的css属性来设置样式,如设置界面头区域的顶部内边距为状态栏的高度(避免系统状态栏与界面头重叠),示例如下:

var t=document.getElementById('header');  
t&&t.style.paddingTop=immersed+'px';

具体项目中可根据界面设计,灵活使用immersed值来动态适配各种效果。
完整用法可参考HelloH5应用中的“js/immersed.js”

11 关注 分享
meijj522 老醒 rabet Trust fsyang 1***@QQ.COM 可苦可乐 雪之梦技术驿站 wenju 5***@qq.com 1***@qq.com

要回复文章请先登录注册

1***@qq.com

1***@qq.com

回复 Lalapalooza :
同意,刚测试过,plus/doc里面common.css跟mui.css有冲突,导致选项卡页面沉浸样式实现不了
2017-05-23 22:36
昵称都被用了

昵称都被用了

求解 http://ask.dcloud.net.cn/question/31964
2017-05-17 18:01
1***@qq.com

1***@qq.com

回复 3***@qq.com :
怎么mark啊?
2016-09-20 10:25
3***@qq.com

3***@qq.com

mark一下
2016-09-19 23:09
三石头

三石头

回复 lacorey :
你这个下拉刷新位置拿不到啊;一直是空的;
2016-07-18 12:19
lacorey

lacorey

//===================沉浸式判断并设置=====================
var immersed = 0;
var topoffset = 44;
var ms=(/Html5Plus\/.+\s\(.*(Immersed\/(\d+\.?\d*).*)\)/gi).exec(navigator.userAgent);
if(ms && ms.length>=3){ // 当前环境为沉浸式状态栏模式
immersed = parseFloat(ms[2]);// 获取状态栏的高度
topoffset = topoffset + immersed;
var t = document.getElementsByTagName('header')[0];
if(t){
t.style.paddingTop = immersed+'px';
t.style.height= topoffset +'px';
}
var mc = document.getElementsByClassName('mui-content')[0];
if (mc) {
var newpt = 44 + immersed +'px';
mc.style.paddingTop = newpt;
}
//下拉刷新位置
var mptp = document.getElementsByClassName('mui-pull-top-pocket')[0];
if (mptp) {
mptp.style.top = immersed +'px';
}
}
//======================================================
2016-07-06 16:39
东哥的苹果

东哥的苹果

回复 DCloud_App_Array :
"UIReserveStatusbarOffset":false,/*iOS平台开启沉浸式状态栏样式*/状态栏直接就没了,我不要他消失,而且把他设置为和header一样的颜色,怎么搞?刚接触builder,这篇文章始终没看懂,还有
// 使用偏移位置创建子窗口
wc=plus.webview.create(null,'doccontent',{top:topoffset,bottom:'0px',bounce:'vertical',bounceBackground:'#FFFFFF'});那我原来的页面到哪里去了?覆盖了?
2016-02-24 17:55
DCloud_App_Array

DCloud_App_Array (作者)

回复 _Ryan :
Android平台系统状态栏的颜色无法通过5+ API修改,可以通过改变应用的主题来调整,参考:http://ask.dcloud.net.cn/article/238
但由于android的碎片化比较严重,无能确定指定的主题在所有的机器上样式一致。
2015-11-13 14:16
_Ryan

_Ryan

我是没有调整位置,而是把header设置了padding-top,但是系统栏颜色比header的深很多,这是什么原因啊
2015-11-12 14:20
Lalapalooza

Lalapalooza

这样的改动代价也太大了,那么多的页面包括子页面的位置都要通过动态计算来改变top的值.
有没有办法你们这是通过扩大了webview的显示面积,那在顶部增加一个状态栏高度的div或者什么, 类似页面页面的header + div.content 这样的处理方式呢 ? 保证我们简单的使用.
2015-11-12 11:49