如何使内容显示在固定的DIV元素下?

Mus*_*Guy 49 css menu

我的目的是在页面顶部创建一个菜单,即使用户滚动也会保留在页面顶部(例如Gmail的最新功能,其中常用按钮向下滚动,以便用户执行对消息的操作,而不必滚动到页面顶部).

我还想将下面菜单下面的内容设置在它下面 - 目前,它出现在它后面.

我的目标是这样的:

+________________________+
|          MENU          | <--- Fixed menu - stays at top even when scrolling.
+¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬+
|     CONTENT BEGINS     |
|          HERE          |
|                        |
|                        |
|                        |
|                        |
|                        |
|                        |
+¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬+   <--- Bottom of page.
Run Code Online (Sandbox Code Playgroud)

我希望顶部的菜单永远不会移动,并且位于页面顶部,即使用户向下滚动也是如此.当用户位于页面顶部时,我也希望主菜单在菜单下面开始,但是当用户向下滚动时,菜单是否超出内容的顶部并不重要.

摘要:

  • 我希望页面顶部有一个固定的位置菜单,滚动时跟在用户后面.
  • 仅当用户位于页面顶部时,内容才必须显示在菜单下方.
    • 当用户向下滚动时,菜单可以与内容重叠.

有人可以解释一下如何实现这个目标吗?

谢谢.

更新:

CSS代码:

#floatingMenu{
clear: both;
position: fixed;
width: 85%;
background-color: #78AB46;
top: 5px;
}
Run Code Online (Sandbox Code Playgroud)

HTML代码:

<div id="floatingMenu">
    <a href="http://www.google.com">Test 1</a>
    <a href="http://www.google.com">Test 2</a>
    <a href="http://www.google.com">Test 3</a>
</div>  
Run Code Online (Sandbox Code Playgroud)

目前,我可以将菜单显示在页面顶部,并将其置于我的内部中心container div.但是,内容落后于菜单.我已经设定clear: both;,这没有帮助.

Kyl*_*yle 49

你需要的是一个额外的间距div(据我所知你的问题).

此div将放置在菜单和内容之间,并且与菜单div,包括填充的高度相同.

HTML

<div id="fixed-menu">
    Navigation options or whatever.
</div>
<div class="spacer">
    &nbsp;
</div>
<div id="content">
    Content.
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

#fixed-menu
{
    position: fixed;
    width: 100%;
    height: 75px;
    background-color: #f00;
    padding: 10px;
}

.spacer
{
    width: 100%;
    height: 95px;
}
Run Code Online (Sandbox Code Playgroud)

见我的例子在这里.

这通过抵消将由nav div占用的空间来工作,但是因为它已经position: fixed;从文档流中取出.


实现此效果的首选方法是margin-top: 95px;/*your nav height*/在内容包装器上使用.

  • 令人非常失望的是,在响应式设计的时代,我们仍然需要破解固定的尺寸. (11认同)
  • 没有JavaScript,这仍然是不可能的.如果你是"position:fixed"标题有一个可变的高度(例如,当你缩小浏览器窗口的宽度和标题选项包装时,它的高度会增加)...除了JavaScript之外,没有办法让这样的间隔div或以与该可变高度同步的方式增加边际. (6认同)
  • 今天这还有必要吗?一个额外无用的div? (3认同)
  • @Triynko,如果您对标题高度的更改是由媒体查询(屏幕宽度断点)驱动的,例如当您使用类似材料设计的框架(例如layout-sm ="column")或twitter bootstrap(例如col-md-6)时,您可以根据相同的断点简单地调整内容元素的填充.那有意义吗? (2认同)

grd*_*phl 14

如果您的菜单高度是可变的(为了响应或因为它是动态加载的),您可以将上边距设置为固定div结束的位置.例如:

CSS

.fixed-header {
    width: 100%;
    margin: 0 auto;
    position: fixed;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ms-box-sizing: border-box;
    box-sizing: border-box;
    z-index: 999;
}
Run Code Online (Sandbox Code Playgroud)

使用Javascript

$(document).ready(function() {
    var contentPlacement = $('#header').position().top + $('#header').height();
    $('#content').css('margin-top',contentPlacement);
});
Run Code Online (Sandbox Code Playgroud)

HTML

...
<div id="header" class="fixed-header"></div>
<div id="content">...</div>
...
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴(https://jsfiddle.net/632k9xkv/5/)与固定的导航菜单和标题有点超出这个范围,试图有希望使这个成为一个有用的样本.

  • 我比凯尔(Kyle)更喜欢这个答案,因为它解决了抬头改变高度时该怎么办的问题。从这种角度来看,当布局框架(材质设计或引导程序等)达到某个媒体断点时,我觉得您的标题通常会改变高度。在这种情况下,您可以为匹配的媒体查询断点添加自己的CSS选择器,以将边距/填充调整为适合该屏幕尺寸的任何内容。 (2认同)

aha*_*usa 13

刚刚遇到这种情况并且不喜欢一些"黑客"的解决方案,我发现这很有用而且干净:

#floatingMenu{
  position: sticky;
  top: 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 惊人的!不知道`位置:粘性`!等一下,我的菜单有点粘,然后我滚动得越多,它就会滚出页面。将需要进行更多实验。 (3认同)

Dan*_*mal 5

我刚遇到这个问题,这是我的解决方案:

#floatingMenu + * {
    margin-top: 35px;
}
Run Code Online (Sandbox Code Playgroud)

调整floatingMenu的高度.如果您不确定它是否为div,那么您可以使用*而不是div.这都是有效的CSS2.


Ty *_*ick 5

我最喜欢grdevphl 的 Javascript 答案,但在我自己的用例中,我发现height()在计算中使用仍然留下了一点重叠,因为它没有考虑填充。如果您遇到同样的问题,请尝试outerHeight()补偿填充和边框。

$(document).ready(function() {
    var contentPlacement = $('#header').position().top + $('#header').outerHeight();
    $('#content').css('margin-top',contentPlacement);
});
Run Code Online (Sandbox Code Playgroud)


Der*_*ike 5

有(至少)一种方法可以在没有 javascript 的情况下获得真正的动态高度:插入菜单两次

  • 一旦在流中定位以下元素,以及
  • 一旦固定以获得所需的视觉效果。

<div id="the-menu-container">
    <nav class="position-static">...</nav>
    <nav class="position-fixed">...</nav>
</div>
Run Code Online (Sandbox Code Playgroud)

根据您网站的其余部分,您可能需要调整元素的z-index样式<nav>

  • 除了“position:sticky”之外,这是唯一纯 CSS 且支持动态高度的解决方案。如果使用 React、Vue 等框架,您可以通过创建可重用组件来删除大部分重复内容。 (2认同)