首页 > 其他分享 >记录--一行代码修复100vh bug

记录--一行代码修复100vh bug

时间:2023-12-19 18:22:05浏览次数:42  
标签:浏览器 -- height vh 视口 100vh bug CSS

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

你知道奇怪的移动视口错误(也称为100vh bug)吗?或者如何以正确的方式创建全屏块?

一、100vh bug

什么是移动视口错误?

你是否曾经在网页上创建过全屏元素?只需添加一行 CSS 并不难:

.my-page {
     height: 100vh
} 

1vh是视口高度的1% ,正是我们所需要的。但当我们在移动设备上测试时,就会出现问题。移动浏览器的视口可以动态改变,但值保持不变。因此在移动浏览器中vh变成静态值并且不反映视口的实际高度。

在下图中,可以看到移动屏幕的两种状态:

带有隐藏的地址栏

具有可见的地址栏

核心问题是移动浏览器(Chrome 和 Safari)有一个“有用”的功能,地址栏有时可见,有时隐藏,从而改变视口的可见大小。这些浏览器并没有随着视口高度的变化而将高度调整100vh为屏幕的可见部分,而是将100vh地址栏设置为隐藏地址的浏览器高度。结果是,当地址栏可见时,屏幕的底部将被切断,从而违背了100vh最初的目的。

有什么方法可以解决这个问题?

二、常规修复

1. CSS + Javascript

使用的解决方案涉及使用CSS 自定义属性和一些Javascript。

简而言之,我们监听resize事件并在每次窗口大小更改时设置--vh自定义属性(窗口高度的1% ):

核心功能代码:

//首先获得视口高度并将其乘以1%以获得1vh单位的值
 let vh = window.innerHeight * 0.01
 // 然后,我们将——vh自定义属性中的值设置为文档的根
  document.documentElement.style.setProperty('--vh', `${vh}px`)
 // 监听resize事件 视图大小发生变化就重新计算1vh的值
  window.addEventListener('resize', () => {
     // 执行与前面相同的脚本
     let vh = window.innerHeight * 0.01
     document.documentElement.style.setProperty('--vh', `${vh}px`)
 })
<div class="module">
  <div class="module__item">20%</div>
  <div class="module__item">40%</div>
  <div class="module__item">60%</div>
  <div class="module__item">80%</div>
  <div class="module__item">100%</div>
</div>
body {
  background-color: #333;
}

.module {
  height: 100vh; /* 不支持自定义属性时的回退操作*/
  height: calc(var(--vh, 1vh) * 100);
  margin: 0 auto;
  max-width: 30%;
}

.module__item {
  align-items: center;
  display: flex;
  height: 20%;
  justify-content: center;
}

.module__item:nth-child(odd) {
  background-color: #fff;
  color: #F73859;
}

.module__item:nth-child(even) {
  background-color: #F73859;
  color: #F1D08A;
}

2. 使用 -webkit-fill-available

.my-page { 
    background-color: #ffffff; 
    min-height: 100vh; 
    min-height: -webkit-fill-available; 
    overflow-y: scroll; 
    padding-bottom: 50px;
 }

此方法chrome浏览器中在某些情况下使用会有问题。

因此引出下文第三种方法。

3. postcss-100vh-fix

当然,你也可以使用第三方库来进行修复,具体使用可查看其官网 postcss-100vh-fix。

它适用于 Chrome( -webkit-fill-available 在某些情况下只会在 Chrome 中导致问题)、iOS/iPad/MacOS Safari 和 所有其他浏览器 。纯CSS解决方案,无需JS。

body {
  /* Footer will be hidden on iOS Safari because of bottom panel */
  height: 100vh;
}

body {
  height: 100vh;
}

/* Avoid Chrome to see Safari hack */
@supports (-webkit-touch-callout: none) {
  body {
    /* The hack for Safari */
    height: -webkit-fill-available;
  }
}

此方法不适用于部分高度,例如height: 90vh 或height: calc(100vh - 60px)

三、更好的方法

根据CSS Values 4 规范:视口相对长度,我们可以使用新的视口单位。

有一个dvh单位可以完成全部工作。它始终会适应视口大小。最后,浏览器支持如下:

 有了这个很酷的功能,解决方案变得非常简单,只需要一行 CSS:

.my-page {
     height: 100dvh
}

可以在此了解更多的动态视口单元信息,如:dvw、dvh、dvi、dvb、dvmin 和 dvmax等。

结论

如今,CSS 发展迅速,对解决前端问题有很大帮助。该dvh单位是制作视口相关高度的最佳选择。这是一个非常简单而强大的 CSS 功能,可以让你的工作变得更加轻松。

本文转载于:

https://juejin.cn/post/7313979304513552435

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:浏览器,--,height,vh,视口,100vh,bug,CSS
From: https://www.cnblogs.com/smileZAZ/p/17914404.html

相关文章

  • 第十二单元 `T-SQL` 编程
    createdatabasestep2_unit12;gousestep2_unit12;go--部门表CREATETABLE[dbo].[Department]([Id][int]PRIMARYKEYIDENTITY(1,1)NOTNULL,[Name][varchar](20)NULL);--职位表CREATETABLE[dbo].[Job]([Id][int]PRIMARYKEYIDENTITY(1,1)......
  • 2023-2024第一学期第十二周助教总结
    本次总结所属课程2023-2024第一学期计算机基础与程序设计本次作业要求作业要求作业提交情况提交情况一、作业提交情况:本周大部分同学可以做到按时提交作业,只有一小部分同学在作业截止时间内未能按时提交,希望这些同学可以重视每老师布置的作业,认真完成并按时提......
  • 深入 K8s 网络原理(一)- Flannel VXLAN 模式分析
    目录1.概述2.TL;DR3.Pod间通信问题的由来4.测试环境准备5.从veth设备聊起6.网桥cni06.1在Pod内看网卡信息6.2在host上看网卡信息7.VTEPflannel.18.最后看下Flannel的配置9.总结1.概述这周集中聊下K8s的集群网络原理,我初步考虑分成3个方向:Pod-to-Pod......
  • 阅读笔记5
    《代码大全2》的前两章主要介绍了软件构建的基本概念、原则和流程,使我理解和应用代码的意义和方法产生了深刻的影响。在第一章中,作者强调了代码的重要性,并指出编程的目标是生成可执行代码。并通过一系列实例阐述了编程过程中的关键要素,如可读性、可维护性和可测试性。在第二章中......
  • 【Verilog】编码规范-coding sytle
    目前所在单位并没有代码规范文档,以致于阅读代码很吃力,并且久而久之自己写的代码可读性也没法保证。在参考了很多资料后,决定按以下规范来写:一、命名规范1、文件命名a、每个文件中只包含一个module、class、package,文件名于文件内容名称应相同。 2、module、class、package、f......
  • 任务调度处理系列之 Spring源码分析-【SchedulingConfigurer实现原理】转
     一、可能的场景在做业务平台的时候我们经常会遇到,某些跟时间打交道的需要修改状态,比如说在时间区间之前,属于未生效状态,区间之内属于有效期,区间之后,属于过期,或者需要每天每周每月,甚至是年为单位的做一些固定的操作。通过定时任务可以通过开启定时任务来完成这些需求。我做合......
  • Windows 了解一下Windows
    运行1.“运行”这个软件是windows里面经常要用到的工具,它可以通过一些程序的名称快速打开管理程序,以下是常用管理程序,如果你觉得你的记忆能力足够好的话,可以进入C:\windows\system32里面找找所有管理软件并记住他们的名称,然后在运行里面直接使用名称就可以快速打开。taskmg......
  • tomcat随笔
    JDK的线程池,是先使用核心线程数配置,接着使用队列长度,最后再使用最大线程配置。Tomcat的线程池,就是先使用核心线程数配置,再使用最大线程配置,最后才使用队列长度核心10最大200队列 Integer.Max_Valueserver.tomcat.max-connections=10默认值是8192server.tomcat.accept-c......
  • 写mq消息失败
     有时候解决问题的方式很简单,如下:消费模式:    集群模式普通消息:    单向发送pom.xml配置<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.4</version></d......
  • syoj.1827. 线段传送带题解
    前情提要-三分1827.线段传送带P2571[SCOI2010]传送带省流:三分套三分。在二维平面上有两个传送带,一个从A点到B点,一个从C点到D点,速度分别是p和q,在平面内其他点的速度为r。求A点到D点的最小速度。考虑从A到D的路程一定是\(AE+EF+FD\),即通过这两个点连......