HarmonyOS 鸿蒙Next网页安全区域计算与规避

HarmonyOS 鸿蒙Next网页安全区域计算与规避 如题,官方有没有关于网页安全区域计算与规避,开启沉浸式效果的指导或者案例

3 回复

【解决方案】

根据设计要素要求,可以通过如下五种方式实现应用沉浸式效果:

  • 方案一:全屏显示,不隐藏避让区:调整布局系统为全屏布局,界面元素延伸到状态栏和导航条区域实现沉浸式效果。通过接口查询状态栏和导航条区域进行可交互元素避让处理,并设置状态栏或导航条的颜色等属性与界面元素匹配。
  • 方案二:全屏显示,隐藏避让区:通过对应接口设置全屏布局即可(隐藏避让区场景适用于游戏、电影等应用场景,可以通过从底部上滑唤出导航条)。

注意:全屏显示设置针对的是窗口,如果希望实现单页面的全屏显示,可以在对应页面中添加如下代码:

@Entry
@Component
struct Index {
  onPageShow(): void {
    window.getLastWindow(getContext(this), (err, win) => {
      win.setWindowLayoutFullScreen(true)
    })
  }

  onPageHide(): void {
    window.getLastWindow(getContext(this), (err, win) => {
      win.setWindowLayoutFullScreen(false)
    })
  }

  build() {
  // ...
  }
}

不设置全屏显示下的方案:

  • 方案三:通过setWindowBackgroundColor设置窗口背景色风格与应用界面一致: EntryAbility中的onWindowStageCreate方法示例代码:
export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage): void {
    console.info('Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        console.error(`Failed to load the content. Cause: ${err}`);
        return;
      }

      // 设置全窗颜色和应用元素颜色一致
      windowStage.getMainWindowSync().setWindowBackgroundColor('#317AF7');
      console.info('Succeeded in loading the content.');
    });
  }
}
@Entry
@Component
struct Index {
  aboutToAppear(): void {
    let windowClass: window.Window | undefined = undefined;
    window.getLastWindow(getContext(), (err: BusinessError, data) => {
      windowClass = data
      let SystemBarProperties: window.SystemBarProperties = {
        statusBarColor: '#F08080',
        statusBarContentColor: '#008000'
      };
      try {
        let promise = windowClass.setWindowSystemBarProperties(SystemBarProperties);
        promise.then(() => {
          console.info('Succeeded in setting the system bar properties.');
        }).catch((err: BusinessError) => {
          console.error(`Failed to set the system bar properties. Cause code: ${err.code}, message: ${err.message}`);
        });
      } catch (exception) {
        console.error(`Failed to set the system bar properties. Cause code: ${exception.code}, message: ${exception.message}`);
      }
    })
  }

  build() {
  // ...
  }
}

更多关于HarmonyOS 鸿蒙Next网页安全区域计算与规避的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


鸿蒙Next中网页安全区域计算主要涉及避开系统UI区域(如状态栏、导航栏)。开发者需使用window.getWindowAvoidArea接口获取安全区域边界值,通过CSS环境变量env(safe-area-inset-top/bottom/left/right)进行动态适配。规避方案包括设置viewport-fit=cover并利用安全区域插入值调整布局边距,确保内容不被遮挡。

目前HarmonyOS Next官方文档中已明确提供了网页安全区域适配方案。开发者可通过CSS环境变量env(safe-area-inset-*)获取安全区域边界距离,结合viewport-fit=cover实现沉浸式布局:

  1. 在meta标签中声明:
<meta name="viewport" content="viewport-fit=cover">
  1. 通过CSS安全区域变量适配:
body {
  padding-top: env(safe-area-inset-top);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
  padding-right: env(safe-area-inset-right);
}

该方案可自动适配刘海屏、摄像头挖孔等异形屏设备,确保关键内容不被遮挡。对于需要全屏展示的场景,建议将安全区域变量应用于容器内边距而非外边距,避免触发浏览器默认安全区域规避行为。具体实现案例可参考官方文档《HarmonyOS Web开发指南》中"适配安全区域"章节。

回到顶部