Safari浏览器内容被地址栏、菜单栏或工具栏遮挡导致的兼容问题

Safari浏览器内容被地址栏、菜单栏或工具栏遮挡导致的兼容问题

最近写了一个网页,页面很多元素使用的是Fixed定位,当在手机端的Safari浏览器、安卓浏览器等测试时,会出现顶部元素、底部元素 被地址栏、菜单栏或工具栏遮挡的情况。于是,我查阅了相关资料,发现了一些解决方案,在iOS设备上使用Safari浏览器时,开发者经常会遇到内容被地址栏、菜单栏或工具栏遮挡的问题。本文将探讨如何使用 viewport-fit 属性和CSS的 env() 函数来解决这些问题。

viewport-fit属性

viewport-fit 属性是iOS Safari 13.4+ 引入的新属性,它可以用来控制页面内容的缩放行为。

• viewport-fit=cover:内容会被充满整个视窗,即内容不会被裁剪,但可能会被拉伸。
• viewport-fit=contain:内容会被缩放,以适应视窗的大小,但不会被裁剪。
• viewport-fit=auto:默认值,内容会根据设备的方向和大小进行缩放,以适应视窗的大小。

<meta name="viewport" content="viewport-fit=cover" />

有无安全距离100vh的视口大小

Safari浏览器内容被地址栏、菜单栏或工具栏遮挡导致的兼容问题

由于 vh 代表的是视口大小的高度,而在ios的Safari浏览器中,地址栏和菜单栏/工具栏也是属于视口的一部分,所以会导致有测试的时候ios14及以上的手机打开页面时,页面会出现少了一部分的情况,这种情况往往是设计之初就没有考虑到兼容问题导致的,在项目即将完成的时候,你可以通过以下代码来解决

/* 方案1:这种方案虽然有效,但是由于不同页面的类名不同,需要构建多套代码 */
padding-top: env(safe-area-inset-top, 0px);
/* 方案2:将你的高设置为内容的100%减去安全区域的距离即可,这种对我写的这个项目代码量最少,效果还不错的方案了 */
height: calc(100% - env(safe-area-inset-top, 0px));

CSS的 env() 函数

CSS的 env() 函数可以用来动态获取环境变量,例如设备的宽度、高度、分辨率等。H5网页设置viewport-fit=cover的时候才生效,小程序里的viewport-fit默认是cover。

safe-area-inset-top、safe-area-inset-right、safe-area-inset-bottom、safe-area-inset-left 是四个环境变量,它们的值代表了设备的安全区域距离屏幕边缘的距离。

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

body {
  padding-top: env(safe-area-inset-top);
  padding-right: env(safe-area-inset-right);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
  /* 等价于 */
  padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
}

兼容方案

为了兼容不同的设备,我们可以根据设备的安全区域距离屏幕边缘的距离来设置不同的 padding 值。

body {
  padding: 0;
}

/* 在竖屏模式下,我们设置 `padding-top` 和 `padding-bottom` 为 `env(safe-area-inset-top)` 和 `env(safe-area-inset-bottom)` 的值,以达到内容不被地址栏、菜单栏或工具栏遮挡的效果。 */
@media (orientation: portrait) {
  body {
    /* 当屏幕方向为竖屏时应用的样式 */
    padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom) 0;
  }
}

/* 在横屏模式下,我们设置 `padding-left` 和 `padding-right` 为 `env(safe-area-inset-left)` 和 `env(safe-area-inset-right)` 的值,以达到内容不被地址栏、菜单栏或工具栏遮挡的效果。 */
@media (orientation: landscape) {
  /* 当屏幕方向为横屏时应用的样式 */
  body {
    padding: 0 env(safe-area-inset-right) 0 env(safe-area-inset-left);
  }
}

转载作品,原作者:???,文章来源:https://www.vvhan.com/article/ios-safari-safe-padding.html

(0)
打赏 微信赞赏 微信赞赏 支付宝赞赏 支付宝赞赏
上一篇 2024-11-18 11:03
下一篇 2024-12-05 09:21

相关推荐

  • 常用的一些CSS代码规则

    常用的一些CSS代码规则:限制视口内的内容宽度、增加正文文本大小、增加文本行之间的间距、限制图片宽度、限制内容中文本的宽度、以更平衡的方式包裹标题、表单控件颜色与页面样式匹配、易于跟随的表格行

    2024-08-08 Html/CSS
    7480
  • 一行 CSS 代码实现响应式布局 – 使用 Grid 实现的响应式布局

    在这篇文章中,我将教你如何使用 CSS Grid(网格) 布局来创建一个超酷的图像网格,它会根据屏幕的宽度改变列的数量,以实现响应式布局。 而这篇文章中最漂亮的部分是:添加一行 C…

    2025-01-23 Html/CSS
    4640
  • CSS如何优雅的实现卡片多行排列布局?

    在前端开发中,我们经常遇见这样的开发需求,实现下列以此排布的卡片,这些卡片宽度一般是固定的。 并且在不同大小的屏幕宽度下自动换行。 实现这样的一个需求其实不难,我们很容易想到设置一…

    2025-01-24 Html/CSS
    5570
  • 有趣的css – 简约文字风格导航栏

    利用单选按钮来模拟导航栏点击选中效果,实现一个简约的文字类导航栏。 核心代码部分,简要说明了写法思路;完整代码在最后,可直接复制到本地运行。 导航栏主体结构html代码: css …

    2025-01-22
    5330
  • 无需公众号实现微信JSSDK分享卡片!Safari浏览器分享到微信自动成卡片!

    要在微信分享卡片,需要接入微信自家的JSSDK,比较麻烦,还需要认证公众号,但是如果你没有这样的条件,那么你也可以试试使用iOS的Safari浏览器轻松实现,只需要在html中加入…

    2023-12-06
    7580
  • CSS适配iOS全面屏底部横条

    CSS适配iOS全面屏底部横条,所有开发者应对资源页面做好不同手机型号的适配效果,不影响用户的正常浏览使用。其中IOS全面屏手机底部横线不可遮挡页面的具体功能和内容。

    2023-12-28
    7440

发表回复

登录后才能评论
扫码了解
扫码了解
反馈建议
分享本页
返回顶部