CSS适配刘海屏的几种方式

前言

前些年的iphone X一出现 手机厂商纷纷取消了实体的物理按键,ios取而代之的是底部的一个大横条 安卓这边基本上也有不少虚拟按键的厂商 就会导致一些比较奇葩的问题出现 比如
在这里插入图片描述
这种的情况的发生,或者说刘海屏,挖孔屏
一般来说这种时候,都需要我们前端去进行设备适配。

适配之前需要了解的几个新知识

安全区域
安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)的影响,以及横屏状态下他们的影响。
更详细说明介绍,参考官方文档:Human Interface Guidelines -iphone - X

viewport-fit

iOS11 新增特性,苹果公司为了适配 iPhoneX 对现有 viewport meta 标签的一个扩展,用于设置网页在可视窗口的布局方式,可设置三个值:

  • contain: 可视窗口完全包含网页内容(下图)
  • cover:网页内容完全覆盖可视窗口(下图)
  • auto:默认值,跟 contain 表现一致

在这里插入图片描述

注意:网页默认不添加扩展的表现是 viewport-fit=contain,
需要适配 iPhoneX 必须设置 viewport-fit=cover,这是适配的关键步骤。

env() 和 constant()

iOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量:

  • safe-area-inset-left:安全区域距离左边边界距离
  • safe-area-inset-right:安全区域距离右边边界距离
  • safe-area-inset-top:安全区域距离顶部边界距离
  • safe-area-inset-bottom:安全区域距离底部边界距离

一般来说的话,只需要关注 safe-area-inset-bottom以及safe-area-inset-top即可,他俩的值代表的是顶部的刘海以及底部的黑条距离安全区的距离。

后来官方给其加了一段说明:
The env() function shipped in iOS 11 with the name constant(). Beginning with Safari Technology Preview 41 and the iOS 11.2 beta, constant() has been removed and replaced with env(). You can use the CSS fallback mechanism to support both versions, if necessary, but should prefer env() going forward.
这就意味着,之前使用的 constant() 在 iOS11.2 之后就不能使用的,但我们还是需要做向后兼容,像这样:

padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */

注意:env() 跟 constant() 需要同时存在,而且顺序不能换。

如何更加具体适配

第一步:设置网页在可视窗口的布局方式

新增 viweport-fit 属性,使得页面内容完全覆盖整个窗口:

<meta name="viewport" content="width=device-width, viewport-fit=cover">

第二步:页面主体内容限定在安全区域内

这一步根据实际页面场景选择,如果不设置这个值,可能存在小黑条遮挡页面最底部内容的情况。

body {
  padding-bottom: constant(safe-area-inset-bottom);
  padding-bottom: env(safe-area-inset-bottom);
}

第三步:fixed 元素的适配

如果说直接设置bottom = 0;
那么会出现底部固定定位和小黑条重叠的样式就和图示一样。
在这里插入图片描述
这种情况的话可以通过增加外部盒子的padding-bottom来解决这个问题

{
  padding-bottom: constant(safe-area-inset-bottom);
  padding-bottom: env(safe-area-inset-bottom);
}

还有一种方法就是通过增加一个空的底部固定定位占位元素,来实现小横条不重叠

/* 空元素css样式 */
{
  position: fixed;
  bottom: 0;
  width: 100%;
  height: constant(safe-area-inset-bottom);
  height: env(safe-area-inset-bottom);
  background-color: #fff;
}

类型二:fixed 非完全吸底元素(bottom ≠ 0),比如 “返回顶部”、“侧边广告” 等
像这种只是位置需要对应向上调整,可以仅通过外边距 margin 来处理:

{
  margin-bottom: constant(safe-area-inset-bottom);
  margin-bottom: env(safe-area-inset-bottom);
}
### 实现 UniApp 页面高度铺满屏幕的方法 为了使页面能够完全填充整个屏幕,在样式设置上需考虑多个方面,包括但不限于视图容器的高度设定、状态栏以及导航栏的影响等。对于 UniApp 开发而言,有几种常见的方式可以达到这一效果。 #### 使用 `100vh` 单位调整页面高度 通过 CSS 中的 viewport 高度单位 (`vh`) 来定义元素的高度是一个简单有效的方法。具体来说,可以让根节点或主要布局容器占据 100% 的可视窗口高度: ```css /* 设置 body 和 html 元素的高度为 100%,确保子元素能继承 */ html, body { height: 100%; } /* 主要的内容区域也应设为 100% 或者更具体的数值 */ .page-container { min-height: 100vh; } ``` 这种方法适用于大多数情况下的全屏显示需求[^1]。 #### 处理顶部安全区距离 考虑到不同设备可能存在圆角屏幕或是刘海屏等情况,应该利用 `safe-area-inset-top` 等环境变量来适配这些特殊状况,从而保证内容不会被遮挡: ```css .content-box { padding-top: constant(safe-area-inset-top); /* iOS < 11.2 */ padding-top: env(safe-area-inset-top); /* iOS >= 11.2 & Android */ } ``` 这有助于防止因硬件特性而导致的部分界面无法正常展示的问题。 #### 动态计算并应用页面高度 如果遇到某些特定场景下静态方式难以满足要求,则可以通过 JavaScript 获取当前窗口的实际可用高度,并将其赋值给目标 DOM 对象作为内联样式属性: ```javascript // 假定有一个名为 &#39;dynamicHeightElement&#39; 的 div 容器需要动态适应屏幕大小变化 const dynamicHeightElement = document.querySelector(&#39;.dynamic-height-element&#39;); function setDynamicHeight() { const windowHeight = window.innerHeight || document.documentElement.clientHeight; dynamicHeightElement.style.height = `${windowHeight}px`; } window.addEventListener(&#39;resize&#39;, setDynamicHeight); setDynamicHeight(); // 初始化时调用一次以确保首次加载即生效 ``` 此方法特别适合那些依赖于精确尺寸测量的应用逻辑场合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值