翼度科技»论坛 编程开发 html5 查看内容

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

8

主题

8

帖子

24

积分

新手上路

Rank: 1

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



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

什么是移动视口错误?
你是否曾经在网页上创建过全屏元素?只需添加一行 CSS 并不难:
  1. .my-page {
  2.      height: 100vh
  3. }
复制代码
1vh是视口高度的1% ,正是我们所需要的。但当我们在移动设备上测试时,就会出现问题。移动浏览器的视口可以动态改变,但值保持不变。因此在移动浏览器中vh变成静态值并且不反映视口的实际高度。
在下图中,可以看到移动屏幕的两种状态:
带有隐藏的地址栏
具有可见的地址栏

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

1. CSS + Javascript
使用的解决方案涉及使用CSS 自定义属性和一些Javascript。
简而言之,我们监听resize事件并在每次窗口大小更改时设置--vh自定义属性(窗口高度的1% ):
核心功能代码:
  1. //首先获得视口高度并将其乘以1%以获得1vh单位的值
  2. let vh = window.innerHeight * 0.01
  3. // 然后,我们将——vh自定义属性中的值设置为文档的根
  4.   document.documentElement.style.setProperty('--vh', `${vh}px`)
  5. // 监听resize事件 视图大小发生变化就重新计算1vh的值
  6.   window.addEventListener('resize', () => {
  7.      // 执行与前面相同的脚本
  8.      let vh = window.innerHeight * 0.01
  9.      document.documentElement.style.setProperty('--vh', `${vh}px`)
  10. })
复制代码
  1.   20%
  2.   40%
  3.   60%
  4.   80%
  5.   100%
复制代码
  1. body {
  2.   background-color: #333;
  3. }
  4. .module {
  5.   height: 100vh; /* 不支持自定义属性时的回退操作*/
  6.   height: calc(var(--vh, 1vh) * 100);
  7.   margin: 0 auto;
  8.   max-width: 30%;
  9. }
  10. .module__item {
  11.   align-items: center;
  12.   display: flex;
  13.   height: 20%;
  14.   justify-content: center;
  15. }
  16. .module__item:nth-child(odd) {
  17.   background-color: #fff;
  18.   color: #F73859;
  19. }
  20. .module__item:nth-child(even) {
  21.   background-color: #F73859;
  22.   color: #F1D08A;
  23. }
复制代码
2. 使用 -webkit-fill-available
  1. .my-page {
  2.     background-color: #ffffff;
  3.     min-height: 100vh;
  4.     min-height: -webkit-fill-available;
  5.     overflow-y: scroll;
  6.     padding-bottom: 50px;
  7. }
复制代码
此方法chrome浏览器中在某些情况下使用会有问题。
因此引出下文第三种方法。
3. postcss-100vh-fix
当然,你也可以使用第三方库来进行修复,具体使用可查看其官网 postcss-100vh-fix。
它适用于 Chrome( -webkit-fill-available 在某些情况下只会在 Chrome 中导致问题)、iOS/iPad/MacOS Safari 和 所有其他浏览器 。纯CSS解决方案,无需JS。
  1. body {
  2.   /* Footer will be hidden on iOS Safari because of bottom panel */
  3.   height: 100vh;
  4. }
  5. body {
  6.   height: 100vh;
  7. }
  8. /* Avoid Chrome to see Safari hack */
  9. @supports (-webkit-touch-callout: none) {
  10.   body {
  11.     /* The hack for Safari */
  12.     height: -webkit-fill-available;
  13.   }
  14. }
复制代码
此方法不适用于部分高度,例如height: 90vh 或height: calc(100vh - 60px)
三、更好的方法

根据CSS Values 4 规范:视口相对长度,我们可以使用新的视口单位。
有一个dvh单位可以完成全部工作。它始终会适应视口大小。最后,浏览器支持如下:

 有了这个很酷的功能,解决方案变得非常简单,只需要一行 CSS:
  1. .my-page {
  2.      height: 100dvh
  3. }
复制代码
可以在此了解更多的动态视口单元信息,如:dvw、dvh、dvi、dvb、dvmin 和 dvmax等。
结论

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

https://juejin.cn/post/7313979304513552435

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

 


来源:https://www.cnblogs.com/smileZAZ/p/17914404.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具