当前位置: 首页 > news >正文

uni-app动态获取屏幕边界到安全区域距离的完整教程

目录

一、什么是安全区域?

二、获取安全区域距离的核心方法

三、JavaScript动态获取安全区域距离

1. 核心API

2. 完整代码示例

3. 关键点说明

四、CSS环境变量适配安全区域

1. 使用 env() 和 constant()

3. 注意事项

五、不同平台的适配策略

1. H5 端

2. 小程序端

3. App端

六、总结


一、什么是安全区域?

安全区域是指屏幕边缘预留的非内容显示区域,用于避免UI元素被系统组件(如状态栏、底部导航栏)遮挡。在全面屏设备中,安全区域的顶部和底部距离尤为重要。例如:

  • 顶部安全距离:状态栏高度(如iPhone的刘海区域)。
  • 底部安全距离:设备底部的传感器区域或虚拟按键区域。

二、获取安全区域距离的核心方法

在uni-app中,可以通过以下两种方式动态获取安全区域距离:

  1. JavaScript API:使用 uni.getSystemInfoSync() 获取系统信息。
  2. CSS环境变量:通过 env(safe-area-inset-xxx) 和 constant(safe-area-inset-xxx) 实现样式适配。

 

三、JavaScript动态获取安全区域距离

1. 核心API
const systemInfo = uni.getSystemInfoSync();
const { safeAreaInsets } = systemInfo;
console.log("顶部安全距离:", safeAreaInsets.top);
console.log("底部安全距离:", safeAreaInsets.bottom);
2. 完整代码示例
<template><view class="container" :style="{ paddingBottom: bottomPadding + 'px' }"><!-- 页面内容 --><view class="content">动态适配安全区域</view></view>
</template><script>
export default {data() {return {bottomPadding: 0, // 底部安全距离};},onReady() {this.getSafeAreaInsets();},methods: {getSafeAreaInsets() {try {const systemInfo = uni.getSystemInfoSync();const { safeAreaInsets } = systemInfo;// 设置底部安全距离this.bottomPadding = safeAreaInsets.bottom;// 可选:设置顶部安全距离const topPadding = safeAreaInsets.top;console.log("顶部安全距离:", topPadding);} catch (err) {console.error("获取安全区域失败:", err);}},},
};
</script><style>
.container {background-color: #f0f0f0;position: relative;
}.content {padding: 20px;
}
</style>
3. 关键点说明
  • uni.getSystemInfoSync():同步获取系统信息,包含 safeAreaInsets(安全区域距离)。
  • safeAreaInsets:对象包含 topleftrightbottom 四个属性,分别表示安全区域到屏幕边缘的距离。
  • 兼容性:此方法适用于所有平台(H5、小程序、App),但部分安卓设备可能需要额外测试。

 

四、CSS环境变量适配安全区域

1. 使用 env() 和 constant()

在CSS中,可以通过环境变量直接设置安全区域的内边距或外边距:

/* 底部安全区域适配 */
.container {padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */padding-bottom: env(safe-area-inset-bottom);      /* 兼容 iOS >= 11.2 */
}/* 顶部安全区域适配 */
.header {padding-top: env(safe-area-inset-top);
}

 2. 完整代码示例

<template><view class="container"><view class="header">顶部导航栏</view><view class="content">页面内容</view><view class="footer">底部导航栏</view></view>
</template><style>
.container {background-color: #ffffff;height: 100vh;display: flex;flex-direction: column;
}.header {padding-top: env(safe-area-inset-top); /* 适配顶部安全区域 */background-color: #f8f8f8;height: 60px;text-align: center;line-height: 60px;
}.content {flex: 1;background-color: #e0e0e0;
}.footer {padding-bottom: env(safe-area-inset-bottom); /* 适配底部安全区域 */height: 60px;background-color: #f0f0f0;text-align: center;line-height: 60px;
}
</style>
3. 注意事项
  • 顺序要求constant() 和 env() 必须同时存在,且 constant() 在前。
  • 兼容性env() 仅支持 iOS 11.2+ 和部分安卓机型,需结合JavaScript动态适配。

 

五、不同平台的适配策略

1. H5 端
  • 推荐方法:优先使用 uni.getSystemInfoSync() 动态计算安全区域距离。
  • CSS限制:部分浏览器不支持 env(),需通过JavaScript动态设置样式。
2. 小程序端
  • 安全区域APIuni.getSystemInfoSync() 支持所有平台。
  • CSS适配env() 在微信小程序中可能不可用,建议通过JavaScript动态设置。
3. App端
  • 原生配置:在 manifest.json 中配置安全区域(仅限App端):
{"plus": {"distribute": {"android": {"webview": {"overflow": "hidden"}}}}
}

 

六、总结

通过结合JavaScript动态获取安全区域距离和CSS环境变量,可以高效适配全面屏设备。以下是关键步骤总结:

  1. JavaScript动态适配:使用 uni.getSystemInfoSync() 获取 safeAreaInsets
  2. CSS环境变量:通过 env(safe-area-inset-xxx) 设置内边距或外边距。
  3. 兼容性处理:针对不同平台(H5、小程序、App)选择合适的适配策略。

 

http://www.dtcms.com/a/294677.html

相关文章:

  • 【Node.js】使用ts-node运行ts文件时报错: TypeError: Unknown file extension “.ts“ for ts 文件
  • PBR策略路由
  • LeetCode二叉树的公共祖先
  • #Linux内存管理# 详细介绍使用mmap函数创立共享文件映射的工作原理
  • 篇四 tcp,udp客户端服务器编程模型
  • [Linux入门] Linux 文件系统与日志分析入门指南
  • 欢迎咨询年度规划2025
  • 第二阶段-第二章—8天Python从入门到精通【itheima】-136节(Python操作MySQL的基础使用)
  • C++ 多态全解析:静态多态与动态多态详解
  • Packmol聚合物通道模型建模方法
  • OpenCV 图像预处理:颜色操作与灰度、二值化处理详解
  • 最长递增子序列(LIS)问题详解
  • 0723 单项链表
  • FreeRTOS学习笔记之调度机制
  • MySQL 8.0 OCP 1Z0-908 题目解析(34)
  • 打造你的AI助手:Sim Studio 开源工作流构建工具
  • 鸿蒙应用开发:使用Navigation组件和Tab组件实现首页tab选项卡及子页跳转功能
  • 第一次实习经历
  • Java——Spring中Bean配置核心规则:id、name、ref的用法与区别
  • freqtrade在docker运行一个dryrun实例
  • 内容梳理|新手体会大模型AI接口调用
  • EDoF-ToF: extended depth of field time-of-flight imaging解读, OE 2021
  • 《WebGL打造高性能3D粒子特效系统:从0到1的技术探秘》
  • AR维修辅助系统UI设计:虚实融合界面中的故障标注与操作引导
  • nginx.conf配置文件以及指令详解
  • 暑期自学嵌入式——Day06(C语言阶段)
  • 红松推出国内首个银发AI播客产品,首创“边听边问”交互体验
  • 5.综合案例 案例演示
  • [硬件电路-76]:无论是波长还是时间,还是能量维度来看,频率越高,越走进微观世界,微观世界的影响越大;频率越低,越走进宏观世界,微观世界的影响越小;
  • 销采一体化客户管理系统核心要点速通