问题 使用可滚动内容在CSS中创建可变高度“固定”标头


我想在页面上创建一个页眉,当你滚动页面时它不会移动。

这看起来很简单,只需在样式中添加“position:fixed”,但随后内容会显示在标题下方,因为标题是“从流中删除”。所以我认为解决方案是在内容中添加“margin-top:height”。

当标题的高度可变时,最好的解决方法是什么?

我有一个小提琴演示了这个问题:

http://jsfiddle.net/waterlooalex/j4Z8F/2/

提供你的浏览器窗口不是太大,内容文本将滚动到'hello world header'下面,问题是第一行文本“Lorem ipsum ...”被隐藏。我有一些注释掉javascript解决这个问题。


3630
2017-07-20 13:53


起源

所以你想制作一个能够保持在页面顶部而不移动的标题?为什么不把它变成一个 div 它的样式像标题?似乎是最简单的方法 - Stanley Cup Phil
我不确定我理解。我正在使用div,请参阅上面的小提琴链接。 - Alex Black


答案:


您可以添加标题div的第二个副本  固定并使用类似的东西 visibility:hidden 在上面。这样就可以将内容推送到您需要的确切位置,但不使用JavaScript。有点hackish但我尝试了你的小提琴,它的工作原理。


10
2017-07-20 14:16



这是一个很酷的想法,但如果我有更多的内容是位置,那就开始感觉更加hackish:固定...... - Alex Black
是的,我同意这是hackish。您可以通过使用隐藏版本的替代HTML来最小化在HTML中创建的额外占用空间,隐藏版本的高度相同但使用较少的文本。在小提琴示例中,类似于<h1> X </ h1>而不是<h1> hello world </ h1>。琐碎的例子,但有一个更复杂的标题,它可能很重要。 - curtisdf
肮脏但有效,太棒了! - Gaston Sanchez
应该 visibility:hidden? - funkybro
你是对的。我会编辑帖子。谢谢@funkybro! - curtisdf


这个javascript将采用固定标头的可变高度,并将内容的上边距设置为在下面流动。只需要调用onload

<script type="text/javascript">
    function AdjustHeight() {
        var height = document.getElementById("fixedheader").offsetHeight;
        document.getElementById("content").style.marginTop = height + 'px';
    }    
</script>

3
2017-11-28 05:23





你可以用它来解决这个问题 Flexbox的 布局模型如下面的演示所示。

请注意,我已添加 display:flex 至 <body> 出于演示目的,理想情况下,您应该将其提供给更具体的父元素。

* {
  margin: 0;
  padding: 0;
}
html,
body {
  height: 100%;
}
body {
  display: flex;
  flex-direction: column;
}
#header {
  background: dodgerblue;
}
h1 {
  font-size: 2em;
  font-weight: 700;
}
#content {
  flex: auto;
  overflow-y: auto;
}
<div id="header">
  <h1>hello world</h1>
</div>
<div id="content">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer et ante quam, vitae fringilla odio. Nulla molestie, justo non adipiscing varius, mi turpis luctus ligula, sit amet posuere massa elit a tellus. Cras metus risus, sagittis hendrerit sollicitudin
    in, lobortis at elit. Nam posuere molestie enim, sagittis mattis justo vehicula gravida. Fusce placerat porta fermentum. Sed laoreet leo ac tellus consectetur blandit. Sed consequat, ipsum a imperdiet convallis, elit est ultrices elit, et malesuada
    lorem magna eu eros. Sed convallis adipiscing nibh ut volutpat. In consequat egestas elit, eget venenatis lacus condimentum sed. Maecenas semper sapien in lacus feugiat volutpat vestibulum dolor pulvinar. Duis ultricies interdum ante elementum tempor.</p>

  <p>Aliquam nulla tellus, consequat nec suscipit vitae, laoreet non erat. Donec tempor ligula in nisi porttitor nec interdum magna gravida. Aenean eleifend, ipsum eu tincidunt tristique, orci mi molestie libero, at aliquam massa velit ut tortor. Aenean
    nisi velit, feugiat ut posuere eget, porta ac erat. Morbi lobortis ligula nec sem bibendum in imperdiet ipsum tempus. Integer tincidunt mauris quis justo consequat eget pharetra arcu rutrum. Nullam auctor libero luctus eros porta commodo. Aenean auctor
    libero eu arcu porta cursus. Fusce viverra arcu nec elit rutrum et fringilla lectus vulputate. Integer sed leo sit amet ligula aliquam suscipit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla commodo
    varius lectus, non pellentesque dui ornare vel. Duis pretium purus at sapien sollicitudin posuere. Curabitur volutpat posuere diam, at tincidunt leo lacinia quis. Quisque eu arcu enim. Vestibulum condimentum condimentum erat. Sed eros erat, volutpat
    et molestie nec, pharetra vitae diam. Proin tempus, massa vitae malesuada dignissim, ipsum ipsum sagittis neque, ac vehicula neque odio nec urna.</p>

  <p>Praesent sed arcu in nunc egestas sagittis sollicitudin at nunc. Curabitur mattis viverra odio. Donec volutpat mauris nec libero molestie quis venenatis mauris convallis. Mauris porta varius nibh, id tincidunt nunc ullamcorper in. Vestibulum ante ipsum
    primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce auctor ultrices vulputate. Nam in lacus metus. Duis tempus fringilla lacus ut tristique. Nunc sed hendrerit nunc. Nunc non tellus a magna accumsan volutpat. Aenean sollicitudin
    orci in sapien interdum rhoncus cursus ligula iaculis. Nunc mauris sapien, euismod non egestas vitae, dapibus at libero.</p>

  <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque tortor nisi, pellentesque et vestibulum eu, scelerisque eget est. Vivamus porta erat vitae eros sodales accumsan. Duis ligula dui, scelerisque sollicitudin
    blandit quis, sollicitudin vel ipsum. Sed semper dictum eleifend. Duis diam leo, ultricies at consequat nec, consectetur vel lacus. Proin semper luctus nisl, ut luctus sapien egestas vitae. Maecenas eu est nisi. Aliquam erat volutpat. Sed vulputate
    ligula rutrum nunc fermentum vitae consequat magna congue. Donec accumsan consequat pellentesque. Cras justo enim, venenatis non venenatis eu, faucibus id ligula. Aliquam et lorem purus. Sed fringilla gravida dui vitae viverra. Sed id erat nisl. Nulla
    nibh nisi, luctus sed scelerisque id, congue in risus.</p>

  <p>Phasellus eu purus nibh, sit amet sodales dui. Integer tincidunt magna id sem varius faucibus. Etiam id condimentum velit. Cras cursus diam eget libero tristique malesuada. Pellentesque quis arcu tincidunt dolor adipiscing congue ut a enim. Nulla nec
    lacinia est. Pellentesque nec dui mauris, eu eleifend felis. Aliquam feugiat ultrices mi id hendrerit. Phasellus varius sagittis urna, ut fringilla nisi sollicitudin non. Pellentesque ac ligula dolor, ut volutpat sapien. Curabitur vitae diam quis
    ante laoreet suscipit non vitae tellus. Nam id magna est, eu tincidunt odio.
  </p>
</div>


3
2018-04-19 12:19





我总是在内容上设置一个余量,但是标题是高的,因为我的标题通常永远不需要改变高度。

如果你的标题确实改变了高度,那么你将不得不去寻找它来解决它,我担心。脱离流程意味着页面的其余部分将继续正常进行,JavaScript将不得不介入以提供帮助。


0
2017-07-20 14:11



啊,它不是标题改变高度,它只是我不知道它的高度。例如。它不是100px,只是基于其中的任何内容的高度,以及浏览器决定呈现该内容的任何大小。 - Alex Black


为了解决这个问题,我最终在我的内容中添加了一个“虚拟”div。 此div与标题div具有相同的高度,因此将内容精确地压缩到足以创建正确的偏移量。 这与@curtisdf的上述答案相同,但是他建议制作一个标题的副本,我建议制作一个高度相同的空div。

由于高度可以改变的原因很多(窗口调整大小,内容改变,......)我最终使用了 https://github.com/marcj/css-element-queries/blob/master/src/ResizeSensor.js 保持虚拟div的高度与真实标题同步:

        var me = this;
        var summary = me.summary;
        var dummy = me.summaryDummy;
        var resize = function () {
            dummy.style.height = summary.clientHeight + 'px';
        };
        new ResizeSensor(summary, resize);
        resize();

请注意,我可以引用真实的标题(me.summary)和虚拟(me.summaryDummy)因为 aurelia.io的ref实现,但是您可以使用JQuery或ID获取对div的引用。


0
2018-06-10 21:59