在移动端使用100vh的过程中遇到了什么问题?怎么解决?

前言

当我们想要将一个元素高度设置为全屏(整个视窗)高度时,经常使用以下代码:

.element {
    height: 100vh;
}

以上在 PC 上没有任何问题,问题主要出现在移动端。由于移动端屏幕尺寸小,寸土寸金,有些厂商(如 iOS Safari)会有特殊的处理(或者说是 bug)。Safari 上只在必要时才显示工具栏,尽可能给网站更多的空间,这就是为什么在滚动时工具栏会自动隐藏。这导致了处理视窗高度时出现问题:

  • 每次工具栏隐藏和显示时视窗高度会改变
  • 工具栏会遮挡视窗的一部分

问题说明

Alt
例如一个常规的网站布局,header 固定在顶部(sticky 或者 fixed 均可)。左侧是导航目录,高度为 视窗高度 - header 高度。右侧为内容区。如果我们将左侧导航目录高度设置为 100vh - header 高度,就会出现工具栏遮挡导航目录的问题,滚动条滚动到底部了,仍有一部分内容被工具栏遮挡。

如何解决这个问题呢?比较简单的就是使用 JavaScript 动态获取视窗高度。视窗高度变化时,更新导航目录高度。

解决方案

处理思路如下:

  1. 页面加载后,获取视窗高度,更新导航目录高度;
  2. 监听窗口resize事件,触发时,重新更新导航目录高度
    为了方便更新导航目录高度,我们使用css变量
// 定义一个视窗高度变量
:root {
    --i-window-height: 100vh;
}

// 设置导航目录高度,header 高度为 4rem
.sidebar {
    height: calc(var(--i-window-height) - 4rem);
}

接下来只需要更新–i-window-height就可以了

在vue3中实现代码如下:

<script setup>
import { onBeforeUnmount, onMounted } from "vue";

function updateWindowHeight() {
    let windowHeight = window.innerHeight;
    let html = document.querySelector(":root");
    if (windowHeight > 0 && html) {
        html.style.setProperty("--i-window-height", `${windowHeight}px`);
    }
}

onMounted(() => {
    updateWindowHeight();
    on(window, "resize", updateWindowHeight);
});

onBeforeUnmount(() => {
    off(window, "resize", updateWindowHeight);
});
</script>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值