移动端布局避坑:从 `100vh` 到 `100dvh`

曾几何时,我们用 height: 100vh 信心满满地实现移动端全屏布局。
但上线后你可能发现——页面一加载就跳,弹出键盘直接遮住输入框,滚动时布局还会“鬼畜”一抖?

这些问题的元凶,正是你信任的 100vh。今天我们就来聊聊它的“背刺”,以及现代 CSS 的救星:svh / lvh / dvh 三兄弟。


在这里插入图片描述

🤕 vh 的坑:全屏布局不等于全屏体验

vh 是视口高度单位,100vh 表示「当前视口的 100% 高度」。听起来完美?可惜在移动端世界,“当前”并不稳定

你可能遇到的坑:

  • 📱 页面初始加载时:地址栏展开 → 页面高度较小
  • ⬆️ 滚动页面:地址栏收起 → 页面变高,内容跳动
  • ⌨️ 键盘弹出:视口缩小 → 页面溢出,输入框被遮挡
.fullscreen {
  height: 100vh; /* 看似全屏,实则陷阱 */
}

✅ 新单位上线:svh / lvh / dvh 谁该上场?

为了解决这些布局混乱,CSS 推出了 3 个全新的视口高度单位,它们能更准确地描述真实视图空间

单位含义用途建议
svhSmall Viewport Height初始加载时的最小视口高度
lvhLarge Viewport Height地址栏收起后的最大视口高度
dvhDynamic Viewport Height(推荐)当前状态下的实时视口高度

🧠 记忆小技巧:

  • s = small(保守)
  • l = large(最大)
  • d = dynamic(最灵活)

💡 用法场景举例

📱 页面加载避免抖动:用 svh

.safe-screen {
  height: 100svh; /* 地址栏展开时不会跳动 */
}

⌨️ 弹出键盘不遮住内容:用 dvh

.input-wrapper {
  height: 100dvh;
  overflow-y: auto;
}

🖼️ 想“贪心”铺满整个屏幕?用 lvh

.full-max {
  height: 100lvh; /* 地址栏收起时占满所有空间 */
}

🛠️ 回退写法:兼容旧浏览器

不是所有浏览器都支持新单位,所以建议写成:

height: 100vh;    /* fallback for old browsers */
height: 100dvh;   /* modern preferred behavior */

你也可以借助 @supports 做兼容性判断:

@supports (height: 100dvh) {
  .layout {
    height: 100dvh;
  }
}

🌍 浏览器支持情况(2025 年中)

浏览器svh / lvh / dvh 支持
✅ Chrome 106+支持
✅ Safari 15.4+支持(iOS/macOS)
✅ Firefox 109+支持
✅ Edge支持
⚠️ 微信小程序尚未完全支持(需实测)

🔚 总结:再也不用怕“vh 背刺”

场景推荐单位原因
初始全屏布局svh防止加载跳动
响应键盘/滚动变化dvh跟随真实视口
最大化利用空间lvh地址栏收起后最大填充

🧪 快速测试 Demo

你可以复制以下代码粘贴到 CodePen / jsFiddle 试试效果:

<style>
  body, html {
    margin: 0;
    padding: 0;
  }
  .wrapper {
    height: 100dvh;
    background: linear-gradient(to bottom, #4facfe, #00f2fe);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.5rem;
    color: white;
  }
</style>
<div class="wrapper">
  这是 100dvh 布局,试试滚动或调出键盘吧!
</div>

写在最后:
vhdvh,不只是单位变化,而是开发者对真实用户体验的精细掌控
别再让你的布局在移动端出洋相,是时候更新你的 CSS 知识库了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@井九

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值