Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >css 实现刘海屏样式兼容并支持 js 获取刘海屏高度后动态修改

css 实现刘海屏样式兼容并支持 js 获取刘海屏高度后动态修改

作者头像
蓓蕾心晴
发布于 2024-11-28 01:17:46
发布于 2024-11-28 01:17:46
32900
代码可运行
举报
文章被收录于专栏:前端小叙前端小叙
运行总次数:0
代码可运行

css

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:root {
  --safe-area-inset-top: 0px;
  --safe-area-inset-right: 0px;
  --safe-area-inset-bottom: 0px;
  --safe-area-inset-left: 0px;
  --safe-area-inset-constant-top: 0px;
  --safe-area-inset-constant-right: 0px;
  --safe-area-inset-constant-bottom: 0px;
  --safe-area-inset-constant-left: 0px;
}

@supports (top: env(safe-area-inset-top, 44px)) {
  :root {
    --safe-area-inset-top: env(safe-area-inset-top, 44px);
    --safe-area-inset-right: env(safe-area-inset-right, 34px);
    --safe-area-inset-bottom: env(safe-area-inset-bottom, 34px);
    --safe-area-inset-left: env(safe-area-inset-left, 34px);
  }
}

@supports (top: constant(safe-area-inset-top)) {
  :root {
    --safe-area-inset-constant-top: constant(safe-area-inset-top);
    --safe-area-inset-constant-right: constant(safe-area-inset-right);
    --safe-area-inset-constant-bottom: constant(safe-area-inset-bottom);
    --safe-area-inset-constant-left: constant(safe-area-inset-left);
  }
}

首先设置 css 根属性变量值,如果是 less,通过 calc 计算出增加刘海屏高度后的值,注意 calc 计算不支持不带单位的数字相加,会导致结果为 0 ,所以一定要处理不带单位的场景。

由于安卓不支持 constant css 函数,以及安卓 9 以下低版本系统不支持 env css 函数,会导致获取的结果为 0 从而导致 calc 计算结果也为 0 ,所以要在初始化写为 0px,则通过 css  @supports 来判断支持 constant 和 env 函数的情况下再赋值刘海屏高度值。

js 通过与iOS 和安卓的接口获取到客户端返回的实际刘海屏的高度,当返回的高度存在时,则重新赋值 root 跟元素的变量,否则用浏览器默认的。

这样实现的目的是为了解决部分机型下,env 函数和 constant 函数都获取失败导致无法处理刘海屏高度的场景。

js vue3 代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { readonly, reactive, watch, ref } from 'vue'
import { setRootProperty } from '@/common/util'

export default {
  install: (app) => {
    const config = reactive({})

    const insets = ref({ top: 0, left: 0, bottom: 0, right: 0 })
    if (window.getSafeAreaInsets && typeof window.getSafeAreaInsets === 'function') {
      insets.value = window.getSafeAreaInsets() // 初始化获取刘海屏值
    }
    const setConfigAreaInsets = () => {
      config.areaInsets = insets.value
    }
    const updateInsets = (top, left, bottom, right) => {
      insets.value = { top, left, bottom, right }
    }

    function applySafeInsets() {
      if (!window.EVENTS.safeAreaInsetsChange) {
        return false
      }
      setConfigAreaInsets()
      ;['top', 'right', 'bottom', 'left'].forEach(prop => {
        setRootProperty(`--safe-area-inset-${prop}`, `${insets.value[prop]}px`)
        setRootProperty(`--safe-area-inset-constant-${prop}`, `${insets.value[prop]}px`)
      })
    }
    watch(insets, (val) => {
      applySafeInsets()
    })
    app.mixin({
      mounted() {
        applySafeInsets()
        if (this === this.$root) {
          window.mraid.addEventListener('safeAreaInsetsChange', updateInsets)
        }
      },
      beforeUnmount() {
        if (this === this.$root) {
          window.mraid.removeEventListener('safeAreaInsetsChange', updateInsets)
        }
      }
    })

    app.config.globalProperties.$config = config
    app.provide('config', readonly(config))
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
妙用 CSS 变量,让你的代码更优雅
这是介绍 css 的基础语法,了解地可以直接跳过到实际 demo . 既然是变量,他跟 JS 的变量很像,分为 声明、使用、作用域 三块。
Power
2025/03/04
700
兼容iphone x * 刘海的正确姿势
9月13日凌晨终于等来了万众瞩目的苹果新品发布会,相信很多小伙伴们都期待新 iphone 可以剪掉刘海胡子,但万万没想到的是等来了三款不同的尺寸的 iphone x ,我的天,等了这么久你给我看这个?码农慌得一批满地找新 iphone 的逻辑像素,然后想着怎么兼容这刘海和胡子。
IMWeb前端团队
2019/12/03
1.2K0
兼容iphone x * 刘海的正确姿势
H5 页面 iPhoneX 刘海屏适配
对于刘海屏的适配,你的脑子里首先得有苹果手机的 Safe Area 的概念,关于 Safe Area 网上的资料已经非常多了,这里就不再赘述,更偏向实战一点。但是为了比较,我这里给出一张苹果官方文档中,iPhone8之前的常规屏幕和刘海屏 Safe Area 区域的对比图。
Originalee
2020/06/02
4.6K1
H5 页面 iPhoneX 刘海屏适配
让你的WEB和APP一分钟适配 iPhone X
iPhone X昨日已经开抢了 然而面对 iPhone X 这个奇葩的屏幕 你和你的编辑器准备好了吗? 因为 iPhone X 的刘海设计,Web 在 iPhone X横屏时,可能会有些问题: 默认
腾讯NEXT学位
2018/05/14
1.3K0
Safari浏览器内容被地址栏、菜单栏或工具栏遮挡导致的兼容问题
最近写了一个网页,页面很多元素使用的是Fixed定位,当在手机端的Safari浏览器、安卓浏览器等测试时,会出现顶部元素、底部元素 被地址栏、菜单栏或工具栏遮挡的情况。于是,我查阅了相关资料,发现了一些解决方案,在iOS设备上使用Safari浏览器时,开发者经常会遇到内容被地址栏、菜单栏或工具栏遮挡的问题。本文将探讨如何使用 viewport-fit 属性和CSS的 env() 函数来解决这些问题。
Power
2025/03/31
5930
iphoneX 兼容
iphone 齐刘海兼容,作为前端开发几乎是绕不过去的一道坎。 很早之前就遇到过,这里记录一下其解决办法。
epoos
2022/06/06
1.1K0
网页适配 iPhoneX
iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可(即常见的吸底导航、返回顶部等各种相对底部 fixed 定位的元素)。
子润先生
2021/06/24
7350
适配iPhone X 的齐刘海
当苹果宣布发布他们的旗舰手机-- iPhone X 的时候,他们允诺将为未来移动设备设定新的标准。我们决定需要了解一些内容。 “屏幕再也不必是方形的” 除了无边框设计,就是我们熟悉的“齐刘海”,官方叫:Sensor Housing。它迅速成为一个热门话题,提出了一种全新的设计挑战:屏幕再也不必是方形的。虽然这对原生应用是一个更大的考验,但web开发也需要一些考虑。不管它是吓到你或者激发了你, sensor housing 都已存在。现在是为你的客户提供一种非常整洁体验的绝
前端黑板报
2018/01/29
1.1K0
适配iPhone X 的齐刘海
Web App 一分钟适配 iPhone X
iPhone X 已经开抢了,然而面对 iPhone X 这个奇葩的屏幕,你准备好了吗?
蜻蜓队长
2018/08/03
7700
Web App 一分钟适配 iPhone X
【HTML5 理论知识】就H5调试技巧,浅谈:iPhone X 适配方案!
image.png 2017年9月苹果发布了iPhone X机型,对于它的“刘海儿”和底部Home Indicator。我们可以通过以下三种方案进行适配~下面就让我来逐一介绍吧! 客户端适配 解决方案 客户端直接将webview的安全区域限制在除去安全区域的区域内。页面将展示在下图灰色webview内: image.png 利弊分析 优点:H5前端开发没有任何适配工作量。 缺点:页面会限制在客户端限制的webview区域内,没有满屏效果。 使用media query 解决方案 针对iPhoneX机型
QUXINGDONG.COM
2018/04/17
3.4K2
【HTML5 理论知识】就H5调试技巧,浅谈:iPhone X 适配方案!
极速适配 iPhone X 秘笈
iPhone X 适配方案 2017年9月苹果发布了 iPhone X 机型,对于它的“刘海儿”和底部 Home Indicator,QQ空间 H5 也在第一时间做了兼容适配。在适配过程中,我们尝试了这三种方案,如下。 解决方案1 客户端适配 客户端直接将 webview 的安全区域限制在除去安全区域的区域内。页面将展示在下图灰色 webview 内: 利弊分析 优点:H5 前端开发没有任何适配工作量。 缺点:页面会限制在客户端限制的 webview 区域内,没有满屏效果。 解决方案2 使用 media
腾讯ISUX
2018/06/29
1.4K0
移动端H5开发之页面适配篇
最近开发并上线了一款H5项目,在这里想和大家分享一下关于项目中使用到的移动端适配技巧,如果对你们有所帮助的话,就多多点赞收藏😃各位看官老爷别着急,在讲页面适配之前,我们先来捋一捋viewport(视口)的概念~在Web浏览器术语中,通常与浏览器窗口相同,但不包括浏览器的UI, 菜单栏等——即指你正在浏览的文档的那一部分。一般我们所说的视口共包括三种:布局视口、视觉视口和理想视口1.1 布局视口图片在移动端,布局视口被赋予一个默认值,大部分为980px,这保证PC的网页可以在手机浏览器上呈现,用户可以手动对网
三点水的洋
2022/06/10
7.8K1
移动端H5开发之页面适配篇
–移动端适配iPhoneX方案
移动端适配iPhoneX方案 对页面进行iPhoneX适配处理教程 在viewport 中添加 viewport-fit=cover 属性 <meta name="viewport" content="width=device-width,initial-scale=1.0, viewport-fit=cover"> 安全区设置 iOS 11中包含了一个新的CSS函数 env(),以及一组四个预定义的常量:safe-area-inset-left, safe-area-inset-right, safe-a
大象无痕
2018/07/17
1.1K0
H5移动端适配IphoneX等机型
图中,Iphonex机型在头部和底部新增了这两个区域,所以我们需要针对这类机型做些适配,方便我们的webapp的展示
青梅煮码
2023/01/12
9070
CSS Functions && CSS Variables
calc()用于对数值作计算,单位包括长宽(px、vw等)、频率(Hz等)、角度(deg、rad、turn等)、时间(s、ms)、小数和整数。
gojam
2019/05/14
1.2K0
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
作为一个开发了多个 H5 项目的前端工程师,在开发过程中难免会遇到一些兼容性等爬过坑的问题。现在我将这些问题一一汇总一下,并在后面给出坑产生的原理,和现阶段常规的填坑方案。由此来做一个阶段性的总结。
前端老道
2020/10/15
1.5K0
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
【HarmonyOS next】ArkUI-X休闲益智打地鼠【进阶】
跨平台开发不是追求100%一致,而是在理解差异的基础上实现最佳体验平衡。ArkUI-X的Web组件方案为多端适配提供了新思路,期待未来在HarmonyOS next中看到更强大的跨端能力。
用户11721038
2025/06/28
650
【HarmonyOS next】ArkUI-X休闲益智打地鼠【进阶】
📚一站式解决:H5开发全攻略,看这篇让你省时又省力
在 H5 中,我们通常会使用 REM 和 VW 这两种单位来实现页面的响应式布局。这两种单位可以让页面元素的大小随着根元素(对于 REM)或视口宽度(对于 VW)的大小变化而变化,从而适应不同尺寸的屏幕。
linwu
2023/07/27
1.4K0
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
作为一个开发了多个 H5 项目的前端工程师,在开发过程中难免会遇到一些兼容性等爬过坑的问题。现在我将这些问题一一汇总一下,并在后面给出坑产生的原理,和现阶段常规的填坑方案。由此来做一个阶段性的总结。
前端迷
2020/02/19
2.3K0
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
移动端自适应的常见手段
完整高频题库仓库地址:https://github.com/hzfe/awesome-interview
HZFEStudio
2021/10/01
2.1K0
相关推荐
妙用 CSS 变量,让你的代码更优雅
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档