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

时间:2011-07-20 13:53:38

标签: css header css-position

我想在页面上创建一个在滚动页面时不会移动的标题。

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

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

我有一个小提琴来证明这个问题:

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

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

5 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

您可以使用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 :(得分:0)

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

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

答案 4 :(得分:0)

为了解决这个问题,我最终添加了一个虚拟的&#39; 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();

请注意,由于aurelia.io's ref implementation,我可以引用真实头文件(me.summary)和虚拟(me.summaryDummy),但是您可以使用JQuery或ID来引用div。