首页 > 其他分享 >css 实现刘海屏样式兼容并支持 js 获取刘海屏高度后动态修改

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

时间:2024-11-27 15:44:25浏览次数:8  
标签:constant area -- top safe js inset 刘海 css

css

: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 代码

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))
  }
}

 

标签:constant,area,--,top,safe,js,inset,刘海,css
From: https://www.cnblogs.com/beileixinqing/p/18572460

相关文章

  • python+vue基于django/flask的企业综合管理系统(企业资源调度与员工绩效分析平台)java+n
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • node.js毕设旅游景点推荐系统 程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于旅游景点推荐系统的研究,现有研究主要以推荐算法改进、用户体验优化等为主。专门针对集用户、旅游景点、门票订单、旅游线路、酒店信息和酒店预定等......
  • node.js毕设潘龙村数字化综合管理系统 pc 程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于乡村综合管理系统的研究,现有研究主要以宏观的乡村治理或单一功能的乡村信息管理为主,专门针对数字化综合管理系统涵盖如村委、村民、财务信息、财产......
  • 华为OD机试E卷 --最大报酬 --24年OD统一考试(Java & JS & Python & C & C++)
    文章目录题目描述输入描述输出描述用例题目解析JS算法源码Java算法源码python算法源码c算法源码c++算法源码题目描述小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时间(单位h)和报酬,工作的总报酬为所有已完成工......
  • 华为OD机试E卷 --绘图机器人--24年OD统一考试(Java & JS & Python & C & C++)
    文章目录题目描述输入描述输出描述用例题目解析js算法源码Java算法源码python算法源码c算法源码c++算法源码题目描述绘图机器的绘图笔初始位置在原点(0,0)机器启动后按照以下规则来进行绘制直线.尝试沿着横线坐标正向绘制直线直到给定的终点E期间......
  • Nuxt.js 应用中的 webpack:progress 事件钩子
    title:Nuxt.js应用中的webpack:progress事件钩子date:2024/11/27updated:2024/11/27author:cmdragonexcerpt:webpack:progress钩子用于监听Webpack在构建过程中的进度更新。这是一个非常有用的特性,特别是在构建大型应用时,可以给开发者实时反馈,以便他们知道构建的......
  • 重拾JS-面向对象/原型以及原型链
    简言最近在做前端知识的复习和整理,有了一些自己新的体会。更多在于记录,通过反复的温习,写笔记消除自己以前学习知识点的误区什么是面向对象?要理解什么是面向对象,那么首先要知道什么是面向过程面向过程比如以做饭为例graphTD买菜-->切菜-->炒菜-->装盘在上述流程图中......
  • 用文字“画出”状态图:用 AI+Mermaid.js 解决对象状态变化的处理问题
    什么是状态图状态图用于描述对象在其生命周期内的状态变化及其处理,例如业务办理流程、病情处置等。什么是MermaidMermaid.js是一个开源项目,它允许你通过简单的语法来绘制图表。无论你是开发者、学生还是普通用户,它都能帮助你将复杂的信息以直观和易懂的方式呈现出来。什么是......
  • 浅谈Vue.js
    支持一对一答疑的购买网址Vue.js简介Vue.js的作者为EvanYou(尤雨溪),曾任职于GoogleCreativeLab,虽然是Vue是一个个人项目,但在发展前景上个人认为绝不输于Google的AngularJs,下面我会将Vue与Angular(Angular1.0+版本)做一些简单的比较。Vue的主要特点就和它官网(http://cn.vue......
  • JS实现 ZIP 压缩包的导入解析
    功能目标在前端实现ZIP压缩包的解析,将文件名通过下拉框展示,并支持查看所选文件的内容。使用技术JSZip:解析ZIP文件的库。FileReader:读取用户上传的文件。HTML和JavaScript:实现交互和动态内容展示。实现步骤1.引入JSZip通过CDN或npm引入JSZip:<scriptsrc=......