无法滚动菜单 - 内容 "behind" 菜单滚动
Can not scroll menu - content "behind" the menu scrolls
我基于tailwindcss 创建了一个小菜单。它工作正常,但有一点:如果此菜单显示在移动设备上,用户将滚动 "behind" 菜单页面的内容。所以有些菜单项无法显示。
我创建了一个代码笔来演示这一点:
https://codepen.io/spqrinc/pen/RwPBBKq
我是这样定义固定菜单位置的:
<div class="bg-gray-500 md:flex md:justify-between md:items-center md:px-4 md:py-3 w-full z-50 top-0 fixed">
<div class="flex items-center justify-between px-4 py-3 md:p-0">
[...]
</div>
</div>
我还创建了一个 gif 来展示我的意思 - 只需单击图像即可启动 gif 动画:
我不确定为什么会这样。我想我把固定位置搞砸了。所以我非常感谢您的帮助 - 我的目标是拥有一个可滚动并固定在移动设备上的菜单。
那是因为你在那里申请了fixed
。对于小屏幕,你可以使用 absolute
之类的东西,这取决于你想要实现什么。
但是 absolute md:fixed
应该可以修复它。从那里,您可以根据需要进行调整。
我可以看到两个可能的解决方案,一个涉及 JavaScript,另一个不涉及。
我会推荐没有 JavaScript 的解决方案,稍后,用 JavaScript 增强它。
第一个解决方案是在导航栏上使用 粘性 位置而不是固定位置。
我创建了一个 codepen here 来演示它(调整大小 "mobile layout")。
好的部分是开箱即用,只有 class 变化(粘性 class):
<div class="bg-gray-500 md:flex md:justify-between md:items-center md:px-4 md:py-3 w-full z-50 top-0 sticky">
<div class="flex items-center justify-between px-4 py-3 md:p-0">
[...]
</div>
</div>
缺点是菜单不固定。
为此,我们需要一些 JavaScript(未添加到 codepen)。
基本上我们需要防止 "body" 溢出(在您的情况下,不是实际的正文,而是包含内容的区域)并添加底部 属性 来分隔导航栏除了导航上的 overflow-y: scroll;
之外的高度。
我创建了 this codepen 来说明它。再次,在 "mobile layout".
中查看
这些是涉及的 classes:
.header-wrapper {
bottom: 0;
overflow-y: scroll;
}
body {
overflow: hidden;
}
我将此 class 添加到 header
元素的第一个子元素:
<header class="lg:mb-20">
<div class="header-wrapper bg-gray-500 md:flex md:justify-between md:items-center md:px-4 md:py-3 w-full z-50 top-0 fixed">
</div>
</header>
您只需要将此 class 添加到移动设备,并且仅在菜单打开时添加。
希望对您有所帮助!
鉴于您的菜单是 full-screen,您可以使用一个技巧。简短的故事:让你的 body 位置固定,然后让你的菜单处于相对位置,这样你就可以自然滚动。
假设您将整个用户界面包裹在一个容器中(一个简单的 div
就足够了)而不是直接放置在您的 body
中,则应适用以下内容。
打开菜单后,执行以下操作:
const uiContainer = document.getElementById('ui-container');
uiContainer.style.position = 'fixed';
/* Store scrollX and scrollY in some safe location.
* You will need them when the menu closes. */
uiContainer.style.top = `-${window.scrollY}px`;
uiContainer.style.left = `-${window.scrollX}px`;
uiContainer.style.width = '100%';
菜单关闭时,执行以下操作:
uiContainer.style.position = null;
uiContainer.style.width = null;
uiContainer.style.top = null;
uiContainer.style.left = null;
window.scrollTo(savedScrollX, savedScrollY);
然后您可以将菜单作为 child 添加到 body
并使用 position: relative
设置样式,滚动将自然地由任何浏览器处理。
HTH
我基于tailwindcss 创建了一个小菜单。它工作正常,但有一点:如果此菜单显示在移动设备上,用户将滚动 "behind" 菜单页面的内容。所以有些菜单项无法显示。
我创建了一个代码笔来演示这一点:
https://codepen.io/spqrinc/pen/RwPBBKq
我是这样定义固定菜单位置的:
<div class="bg-gray-500 md:flex md:justify-between md:items-center md:px-4 md:py-3 w-full z-50 top-0 fixed">
<div class="flex items-center justify-between px-4 py-3 md:p-0">
[...]
</div>
</div>
我还创建了一个 gif 来展示我的意思 - 只需单击图像即可启动 gif 动画:
我不确定为什么会这样。我想我把固定位置搞砸了。所以我非常感谢您的帮助 - 我的目标是拥有一个可滚动并固定在移动设备上的菜单。
那是因为你在那里申请了fixed
。对于小屏幕,你可以使用 absolute
之类的东西,这取决于你想要实现什么。
但是 absolute md:fixed
应该可以修复它。从那里,您可以根据需要进行调整。
我可以看到两个可能的解决方案,一个涉及 JavaScript,另一个不涉及。
我会推荐没有 JavaScript 的解决方案,稍后,用 JavaScript 增强它。
第一个解决方案是在导航栏上使用 粘性 位置而不是固定位置。
我创建了一个 codepen here 来演示它(调整大小 "mobile layout")。
好的部分是开箱即用,只有 class 变化(粘性 class):
<div class="bg-gray-500 md:flex md:justify-between md:items-center md:px-4 md:py-3 w-full z-50 top-0 sticky">
<div class="flex items-center justify-between px-4 py-3 md:p-0">
[...]
</div>
</div>
缺点是菜单不固定。
为此,我们需要一些 JavaScript(未添加到 codepen)。
基本上我们需要防止 "body" 溢出(在您的情况下,不是实际的正文,而是包含内容的区域)并添加底部 属性 来分隔导航栏除了导航上的 overflow-y: scroll;
之外的高度。
我创建了 this codepen 来说明它。再次,在 "mobile layout".
中查看这些是涉及的 classes:
.header-wrapper {
bottom: 0;
overflow-y: scroll;
}
body {
overflow: hidden;
}
我将此 class 添加到 header
元素的第一个子元素:
<header class="lg:mb-20">
<div class="header-wrapper bg-gray-500 md:flex md:justify-between md:items-center md:px-4 md:py-3 w-full z-50 top-0 fixed">
</div>
</header>
您只需要将此 class 添加到移动设备,并且仅在菜单打开时添加。
希望对您有所帮助!
鉴于您的菜单是 full-screen,您可以使用一个技巧。简短的故事:让你的 body 位置固定,然后让你的菜单处于相对位置,这样你就可以自然滚动。
假设您将整个用户界面包裹在一个容器中(一个简单的 div
就足够了)而不是直接放置在您的 body
中,则应适用以下内容。
打开菜单后,执行以下操作:
const uiContainer = document.getElementById('ui-container');
uiContainer.style.position = 'fixed';
/* Store scrollX and scrollY in some safe location.
* You will need them when the menu closes. */
uiContainer.style.top = `-${window.scrollY}px`;
uiContainer.style.left = `-${window.scrollX}px`;
uiContainer.style.width = '100%';
菜单关闭时,执行以下操作:
uiContainer.style.position = null;
uiContainer.style.width = null;
uiContainer.style.top = null;
uiContainer.style.left = null;
window.scrollTo(savedScrollX, savedScrollY);
然后您可以将菜单作为 child 添加到 body
并使用 position: relative
设置样式,滚动将自然地由任何浏览器处理。
HTH