移动端布局的坑:100vh在手机上为何不靠谱?

更新日期: 2026-02-15 阅读: 30 标签: 布局

前端开发的朋友应该都遇到过这种情况。写了一个全屏的页面模块,用了下面这行代码

.hero {
  height: 100vh;
}

在电脑浏览器上看,一切正常。可一拿到手机上测试,问题就全冒出来了。页面布局乱跳,底部内容被截掉一半,滑动起来也不顺畅。很多人第一反应是怀疑自己代码写错了,反复检查flex布局、padding、margin,可问题依旧存在。

其实,这真不是你的技术问题。问题出在100vh这个单位上。在移动端浏览器里,100vh并不等于屏幕可视区域的高度。


为什么100vh在手机上会出问题?

手机浏览器和电脑浏览器不一样。手机屏幕上有一些固定元素:

当你上下滑动页面时,这些元素会隐藏或显示。这就导致了一个问题:浏览器其实有两个高度。

一个是可视区域高度,就是你现在实际能看到的部分。另一个是完整高度,包括了工具栏背后隐藏的空间。

问题在于,100vh取的是完整高度,而不是可视高度。这就意味着,你设置height:100vh的元素,实际高度比用户看到的屏幕还要高出一截。底部自然就被切掉了一块。


三个真实场景,看100vh如何毁掉页面

场景一:首屏内容被截断

你做了一个落地页,大标题、副标题、按钮都在一个全屏模块里居中显示。在电脑上看着特别完美。可到了手机上,按钮不见了,或者只露出半个。用户想点按钮都点不到。

场景二:输入框弹出后布局错乱

登录页面设置了100vh。用户点输入框,手机键盘弹出来。视口高度瞬间变小,整个页面开始疯狂跳动,布局缩成一团,用户体验极差。

场景三:全屏弹窗不全屏

写了一个模态框,用fixed定位,高度设100vh。在iOS Safari上,模态框比屏幕大了一点,底部出现滚动条,关闭按钮跑到看不见的位置。


三个新的css单位解决问题

CSS新出了三个视口单位,专门解决这些问题。

svh:小视口高度

这个单位取的是最小可视高度。不管浏览器的工具栏怎么变化,它都使用那个不会被挡住的高度。适合用在首屏大图、落地页这些绝对不能出错的场景。

dvh:动态视口高度

这个单位会随着浏览器工具栏的显示隐藏实时变化。当地址栏出现或消失,它会自动调整高度。适合做全屏应用、聊天界面这些需要填满屏幕的布局。

lvh:大视口高度

这个取的是最大高度,包括工具栏背后的空间。这个单位用得很少,大多数场景都不适合。


实际开发中怎么用

首屏模块这样写

.hero {
  min-height: 100vh;
  min-height: 100svh;
  display: grid;
  place-items: center;
  padding: 20px;
}

用min-height而不是height,是为了防止内容太多时被截断。写两行是为了兼容老浏览器,不认识的会使用100vh,认识的用100svh覆盖。

全屏应用这样写

.app {
  height: 100dvh;
  overflow: auto;
}

工具栏显示隐藏时,应用高度会自动调整,始终填满屏幕。

弹窗这样写

.modal {
  position: fixed;
  inset: 0;
  height: 100dvh;
  overflow: auto;
}

这样弹窗用起来就像原生应用一样顺滑。


常见问题解答

是不是以后不能用100vh了?

不是。100vh在电脑上完全没问题,问题主要出在移动端浏览器。

三个新单位怎么选?

记住这个原则:落地页首屏用svh,追求稳定;应用类布局用dvh,追求实时适配;lvh基本用不上。

能不能全部用dvh?

不太建议。因为浏览器工具栏显示隐藏时,dvh会不断变化,导致页面频繁重绘。对于首屏来说,我们需要的是稳定,不是动态变化。


总结

以后在手机上做全屏布局,别再死磕100vh了。用100svh做落地页,100dvh做应用界面。你的页面会稳如泰山,再也不会出现布局乱跳、内容被截的尴尬情况。代码简单,效果靠谱,用户看着舒服,自己也省心。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13330

相关推荐

css两端对齐——div+css布局实现2端对齐的4种方法总结

css两端对齐,通过margin负值、justify、space-between、column-count等多种方式来实现css的两端对齐。

html通过css,js实现div悬浮效果总汇,如原生JS实现滚动到一定位置实现div悬浮

在我们的实际开发中,经常会遇到页面中需要悬浮效果,本文将介绍通过fixed的实现,以及通过原生Js实现滚动到一定位置,实现div的悬浮

网站首页设计常见的6种布局方式

看到太多的网页设计师发布企业站的个人作品,设计中总是摆脱不了大框套小框的设计布局思路,不加思索的跳入单一的网页布局形式中,于是就有了把企业站常用的页面布局方式总结一下的想法

使用flex实现5种常用布局

flex常用布局:经典的上-中-下布局。在上-中-下布局的基础上,加了左侧定宽 sidebar。左边是定宽 sidebar,右边是上-中-下布局。还是上-中-下布局,区别是 header 固定在顶部,不会随着页面滚动。左侧 sidebar 固定在左侧且与视窗同高,当内容超出视窗高度时,在 sidebar 内部出现滚动条。

html实现时间轴_纯css实现响应式竖着/垂直时间抽布局效果

html实现用时间点来展示事件发生点来代替用table展示一条条数据,能够给人清晰、一目了然能够看清事情发生的过程,UI页面也显示的那么清晰。如何用css+html做出时间轴展示事件点的?

基于jquery 横向/纵向 时间轴插件推荐

这篇文章主要整理一些关于基于jquery,实现横向/纵向时间轴的插件推荐:jquery.jqtimeline插件、timeline.js插件、Timeglider.js插件、Melon HTML5 、jQuery Timelinr、Timeline Porfolio

解决页面缩小时页面布局会乱的问题

给body加上一个min-width最小宽度,以px为单位,这样当页面变小时,当达到你所设置的最小宽度,body的宽度不再改变,超出的部分会用横向滚动条显示,其内所有元素的布局也不会受影响。

css实现保持div的等宽高比

css如何实现高度height随宽度width变化保持比例不变呢?即给定可变宽度的元素,它将确保其高度以响应的方式保持成比例(即,其宽度与高度的比率保持恒定)。这里以 4:3 为例,通过2种方式来实现

JQuery实现的固定位置下拉隐藏上拉显示悬浮导航菜单

JQuery实现:1、页面打开时,导航栏悬浮的页面上部 2、页面向下拉的时候导航栏隐藏 3、页面向上拉的时候导航栏出现。

css vertical-align对齐规则

只能应用于内联元素以及 display 值为 table-cell 的元素。vertical-align 属性只能作用在 display 计算值为 inline、inline- block,inline-table 或 table-cell 的元素上。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!