分类

链接

2025 年 12 月
1234567
891011121314
15161718192021
22232425262728
293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > 前端 > 正文
共享办公室出租
一个神奇的svh:解决iOS saferi高度问题
前端 暂无评论 阅读(13)

100svh 是专门为了解决 iOS Safari 这个经典问题而引入的。让我详细解释一下为什么它这么神奇:

为什么 100svh 有效?

iOS Safari 视口单位的演变:

  1. 100vh - 大视口高度

    • 包含地址栏和工具栏

    • 当滚动时工具栏隐藏,但高度不变

    • 导致底部内容被遮挡

  2. 100svh - 小视口高度

    • 始终是可见区域的高度(不包含工具栏)

    • 工具栏显示/隐藏时,这个值保持一致

    • 完美解决内容被底部栏遮挡的问题

  3. 100dvh - 动态视口高度

    • 动态变化,随工具栏显示/隐藏而变化

    • 可能导致页面跳动

  4. 100lvh - 大视口高度

    • 与 100vh 类似,包含工具栏

实际效果对比:

css
/* 问题:底部被遮挡 */
.container-vh {
  height: calc(100vh - 280px); /* 在 iOS 上会超出 */
}

/* 解决方案:完美适配 */
.container-svh {
  height: calc(100svh - 280px); /* 刚好在安全区域内 */
}

浏览器支持情况:

  • iOS Safari 15+ ✅ 完全支持

  • Chrome 108+ ✅ 支持

  • Firefox 101+ ✅ 支持

  • Edge 108+ ✅ 支持

完整的最佳实践:

css
.container {
  padding: 20px;
  margin-top: 42px;
  
  /* 首选方案 */
  height: calc(100svh - 280px);
  
  /* 后备方案(不支持 svh 时) */
  height: calc(100vh - 280px);
  
  /* 如果 dvh 支持更好,可以用这个 */
  @supports (height: 100dvh) {
    height: calc(100dvh - 280px);
  }
  
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  background: red;
}

结合其他 iOS 修复:

css
.container {
  /* 基础样式 */
  padding: 20px;
  margin-top: 42px;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  
  /* 视口高度(按优先级) */
  height: calc(100svh - 280px); /* 1. 首选 */
  height: calc(100dvh - 280px); /* 2. 备选 */
  height: calc(100vh - 280px);  /* 3. 最终后备 */
  
  /* 防止弹性滚动问题 */
  overscroll-behavior-y: contain;
  
  /* 处理底部安全区域 */
  padding-bottom: env(safe-area-inset-bottom);
  
  /* 盒子模型 */
  box-sizing: border-box;
}

渐进增强方案:

html
<style>
  .container {
    padding: 20px;
    margin-top: 42px;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    
    /* 默认值(假设 800px 作为后备) */
    height: 520px; /* 800-280 */
  }
  
  /* 如果支持 svh */
  @supports (height: 100svh) {
    .container {
      height: calc(100svh - 280px);
    }
  }
  
  /* 如果支持 dvh 但不支持 svh */
  @supports (height: 100dvh) and (not (height: 100svh)) {
    .container {
      height: calc(100dvh - 280px);
    }
  }
</style>

<!-- 如果有需要,可以添加 JS 检测 -->
<script>
  // 检测 svh 支持并添加类名
  if (CSS.supports('height', '100svh')) {
    document.documentElement.classList.add('supports-svh');
  } else if (CSS.supports('height', '100dvh')) {
    document.documentElement.classList.add('supports-dvh');
  }
</script>

调试技巧:

css
/* 添加调试边框查看实际尺寸 */
.debug .container {
  border: 2px solid #00ff00 !important;
  position: relative;
}

.debug .container::after {
  content: '高度: ' attr(style);
  position: absolute;
  top: 0;
  right: 0;
  background: rgba(0,0,0,0.7);
  color: white;
  padding: 5px;
  font-size: 12px;
}

实际部署建议:

  1. 首选方案:直接使用 100svh

  2. 监测支持情况:可以添加简单的统计,看看用户浏览器支持情况

  3. 优雅降级:对于不支持的用户,可以用 JS 动态计算高度

现在你知道为什么 100svh 这么神奇了吧?它是现代 CSS 为移动端开发的痛点量身定制的解决方案!🎉

一句话总结:对于 iOS Safari 的视口高度问题,100svh 就是官方的最佳答案!

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:一个神奇的svh:解决iOS saferi高度问题 | Bruce's Blog

发表评论

留言无头像?