一行代码修复100vh bug | 京东云技术团队
你知道奇怪的移动视口错误(也称为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 功能,可以让你的工作变得更加轻松。
作者:京东保险 张洁
来源:京东云开发者社区 转载请注明来源

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kafka核心逻辑介绍 | 京东云技术团队
1、概念 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica)分布式消息系统(kafka2.8.0版本之后接触了对zk的依赖,使用自己的kRaft做集群管理,新增内部主体@metadata存储元数据信息),它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。 类似产品还有 JBoss、MQ(ActiveMQ、RabbitMQ-erlang、RocketMQ-支持事务型消息) 2、kafka的特性 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒。(RecordAccumulate) 可扩展性:kafka集群支持热扩展 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败) ...
- 下一篇
Zadig 深度集成 Apollo 实现跨环境配置的一致性传递
在现代软件系统中,配置管理是确保软件质量的关键环节。应用程序的配置直接影响到其功能、性能和安全性。通过有效的配置管理,可以确保应用程序在不同环境中的一致性和稳定性,从而避免因配置错误而导致的问题和事故。然而,实现配置一致性变更,面临着诸多挑战,包括多环境的差异、多组件系统的复杂性、动态性以及安全性等方面,这些因素增加了对系统可维护性和安全保障的难度。 Zadig 通过深度集成 Apollo,为工程师提供更便捷的途径,使其能够在不同环境中传递一致性的配置,从而提高系统的稳定性、降低维护成本,为团队提供更高效的开发和部署体验。 接下来我们将结合实际案例,介绍如何通过 Zadig 解决 Apollo 配置管理复杂性和一致性传递的难题。 管理员配置 管理员在 Zadig 中集成 Apollo 配置管理系统,配置工作流 「Apollo 配置变更」任务,即可实现配置的自动化变更、帮助工程师方便的完成配置的一致性传递。 第一步:集成 Apollo 访问 Zadig 系统设置 > 集成管理 > 配置管理 > 添加 Apollo 配置管理系统。 第二步:配置工作流任务 将 「Ap...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6