当前位置: 首页 > news >正文

h5移动端适配-dvh

📱 前端 H5 开发中合理使用 dvh 单位指南

在移动端 Web 开发中,使用 height: 100vh 经常会遇到布局被遮挡跳动的问题。这通常是由于移动浏览器的地址栏和底部工具栏在滚动时会隐藏或显示,而 100vh 包含了这些工具栏区域,不是真正的可视区域。

为了解决这个问题,我们可以使用新的 CSS 单位 —— dvh


❓ 为什么 100vh 有问题?

  • 移动浏览器(如 iOS Safari 或 Android Chrome)中,100vh 包括地址栏和底部工具栏。
  • 当用户滚动页面,地址栏隐藏时,页面高度会变化,导致:
    • 页面布局跳动
    • 内容被遮挡或超出可视区域

✅ 什么是 dvh

  • dvh 代表 Dynamic Viewport Height
  • 1dvh = 当前可视区域高度的 1%会自动适应地址栏的显隐变化
  • vh 的现代替代方案。

示例:

.fullscreen {height: 100dvh;
}

✅ 优点

  • 自动适应浏览器工具栏高度变化
  • 无需额外 JS 监听或计算
  • 在现代浏览器中工作良好

🔧 浏览器兼容性

浏览器支持情况
✅ Chrome 108+支持
✅ Safari 15.4+支持
✅ Edge 108+支持
❌ Firefox尚未完整支持
❌ 旧安卓浏览器不支持

📚 参考:Can I use dvh


🔙 回退方案(渐进增强)

为了更好的兼容性,可以采用以下写法:

.fullscreen {height: 100vh;   /* 回退:旧浏览器使用 */height: 100dvh;  /* 覆盖:现代浏览器使用 */
}

🧠 高级方案:使用 JS 设置变量兼容旧浏览器

若需兼容旧浏览器,可使用 JavaScript 设置 CSS 变量:

function setViewportHeight() {const vh = window.innerHeight * 0.01document.documentElement.style.setProperty('--vh', `${vh}px`)
}setViewportHeight()
window.addEventListener('resize', setViewportHeight)

配合 CSS 使用:

.fullscreen {height: calc(var(--vh, 1vh) * 100);
}

✅ 总结

方案是否推荐优势劣势
100vh简单不适配地址栏变化
dvh自动适应,现代浏览器表现优秀旧浏览器不支持
--vh + JS✅✅高兼容,适配旧浏览器与现代浏览器需写 JS,稍微复杂一些

📌 最佳实践建议

  • 现代项目可直接使用 100dvh
  • 兼容性要求高时,推荐使用 --vh CSS 变量 + JS 动态计算

📂 示例代码封装(Vue 版本)

// useViewportHeight.ts
export function useViewportHeight() {const update = () => {const vh = window.innerHeight * 0.01document.documentElement.style.setProperty('--vh', `${vh}px`)}onMounted(update)onBeforeUnmount(() => window.removeEventListener('resize', update))onMounted(() => window.addEventListener('resize', update))
}

📚 延伸阅读

  • Viewport units
  • CSS Tricks on dvh

相关文章:

  • SVN 中文路径访问报错(权限已正确分配)
  • YAFFS2 文件系统的 `yaffs_dev` 数据结构详解
  • UE RPG游戏开发练手 第二十二课 卸下手上武器
  • 蓝牙AVDTP协议概述
  • WSF12N15 MOS 管在筋膜枪中的高效应用
  • 【C++】语言深处的“精灵”:探索内存的奥妙
  • 【日撸 Java 三百行】Day 11(顺序表(一))
  • Python_SSE案例实现
  • PostgreSQL 中的序列(Sequence)
  • 深度解析Crawl4AI:面向大模型的新一代智能爬虫
  • 【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案
  • 学习黑客BitLocker与TPM详解
  • 【文献分享】机遇还是挑战:数字化转型对农业企业经营绩效的影响
  • 【markdown】介绍如何在markdown中绘制流程图
  • 具身-机器人-分层框架-大脑模块-RoboBrain1.0 RoboOS
  • DDR的PCB设计(T点)
  • 数据可视化:用一张图讲好一个故事
  • 防止网页被爬取的方法与第三方用户行为检测组件分析
  • ThreadLocal原理分析--结合Spring事务
  • Hive原理
  • Manus向全球用户开放注册
  • 季后赛主场优势消失之谜,这事竟然要赖库里
  • 第1现场 | 印巴停火次日:当地民众逐渐恢复正常生活
  • 金俊峰已跨区任上海金山区委副书记
  • 浙江公开征集涉企行政执法问题线索,包括乱收费、乱罚款等
  • 著名文物鉴赏家吴荣光逝世,享年78岁