【问题标题】:Sticky top div with absolute positioning具有绝对定位的粘性顶部 div
【发布时间】:2012-01-09 20:42:06
【问题描述】:

我使用绝对定位让 div 填满整个浏览器窗口。但是,我不想将它与有时存在有时不存在的粘性 div 结合起来。

为了让事情更清楚一点,请查看这个 jsFiddle:http://jsfiddle.net/henrikandersson/aDdRS/

我希望“顶部”、“左侧”和“副标题”始终保持在原位。 我还希望“内容” div 填充窗口的左侧。 但是,有时我想在“内容”之前显示“警报”div。 到目前为止一切顺利,正如您在 jsFiddle 中看到的那样。但是,我希望“警报”坚持“副标题”并在滚动时留在那里。如您所见,如果您调整窗口大小,“警报”现在将与“内容”一起滚动 - 我不希望这样。

有人知道如何解决这个问题吗?

编辑: 我在我的 jsFiddle 中进行了更改,我将“警报”放置在应该的位置(在子标题和内容区域之间)。如您所见(http://jsfiddle.net/henrikandersson/aDdRS/12),它不会将“内容区域”向下推,因为内容区域具有顶部:20 像素。而且我不能设置 top:40px 例如,因为“警报”应该能够改变高度,并且我希望内容区域在有或没有上述警报的情况下具有相同的 css。

编辑#2: 这个问题处理同样的问题,但也没有解决这个问题的办法。似乎不使用 JavaScript 是不可能的: variable height scrolling div, positioned relative to variable height sibling

【问题讨论】:

  • 如果<div id="alert"></div> 为空,是否有可能不存在,或者换句话说,如果它有内容,就打印这个div?
  • @HerrSerker 是的,应该可以隐藏/显示 div,但这是问题的一部分(参见上面的编辑)
  • 我的意思是不使用 CSS 隐藏/显示,而是将其从源代码 id 中完全删除为空?如果是这样,我编辑的 fiddel 符合您的需求,如果不是,它符合您在支持 :empty 伪类的浏览器中的需求

标签: css positioning css-position sticky


【解决方案1】:

位置:固定 是绝对和粘性的结合

【讨论】:

    【解决方案2】:

    编辑
    更新一些增强功能

    body {
        height: 100%;
        overflow: hidden;
    }
    #top{
        position: absolute;
        background: yellow;
        height: 50px;
        width: 100%;
        top: 0;
    }
    #left {
        background: #e3e3e3;
        position: absolute;
        bottom: 0;
        left: 0;
        top: 50px;
        width: 200px;
    }
    
    #right {
        position: absolute;
        bottom: 0;
        left: 200px;
        right: 0;
        top: 50px;
    }
    #sub-header {
        height: 20px;
        background: orange;
    }
    #content-area {
        position: absolute;
        top: 20px;
        right: 0;
        bottom: 0;
        left: 0;
    }
    #alert {
        background: red;
        color: white;
    
    }
    #content {
        width: 100%;
        top: 0px;
        left: 0px;
        bottom: 0px;
        right: 0px;
        overflow-y: auto;
        position: absolute;
    }
    #alert + #content {
        top: 20px;
    }
    #alert:empty + #content {
        top: 0px;
    }
    <body>
    <div class="container">
        <div id="top">top</div>
        <div id="left">left</div>
        <div id="right">
            <div id="sub-header">subheader</div>
            <div id="content-area">
                <div id="alert">alert!</div>
                <div id="content">content<br /><br /><br />Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eget nunc magna, eget vehicula ligula. Vestibulum in massa massa, ut feugiat arcu. Suspendisse feugiat commodo tellus, id aliquam dolor cursus eu. Aliquam erat volutpat. Nulla interdum ipsum ut lectus sollicitudin blandit sodales ante malesuada. Etiam ac neque ut turpis faucibus luctus non et arcu. Maecenas ut risus ut odio fringilla sagittis. Sed nulla lorem, suscipit at condimentum quis, adipiscing eget turpis. Morbi accumsan est at tellus hendrerit sed blandit nibh sagittis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent gravida, velit id sodales bibendum, nulla leo rutrum quam, vel tempus justo mi vitae sapien. In imperdiet blandit rhoncus. Phasellus at massa nulla, ut tincidunt est. Nam viverra dui non enim semper consequat. Etiam sed libero sed ante condimentum bibendum ultrices eu nunc.
    
    Integer massa nibh, interdum eget consectetur sed, scelerisque a ipsum. Fusce et ligula erat. Vestibulum lacus enim, facilisis id sollicitudin non, condimentum eu sem. Donec quis magna nec massa vulputate hendrerit. Nam leo nulla, fermentum eu congue quis, imperdiet sit amet orci. Aliquam ornare felis commodo est rhoncus blandit. Quisque at neque ac turpis vulputate sagittis. Donec et viverra risus. Fusce posuere lacus aliquam erat molestie sed tincidunt elit placerat. Sed pulvinar varius neque. Nullam congue adipiscing quam egestas convallis. Sed molestie massa euismod dolor facilisis laoreet.
    
    Cras sit amet nisi sapien, non fringilla arcu. Aenean euismod gravida sem. Donec eu luctus justo. Aliquam erat volutpat. Mauris vestibulum sagittis magna, eget bibendum dolor tempor nec. Nunc rhoncus suscipit felis eu imperdiet. Sed fermentum diam non turpis tempor sit amet adipiscing leo elementum. Donec aliquam consequat elit id auctor.
    
    Praesent vehicula, nibh a elementum imperdiet, urna nulla iaculis leo, ac hendrerit sem massa ac tortor. Suspendisse viverra consectetur libero a luctus. Maecenas iaculis mi id urna fermentum condimentum viverra tellus vulputate. Suspendisse potenti. Aliquam fermentum nulla quis dolor commodo scelerisque. Donec cursus laoreet consectetur. Praesent ultricies arcu ut ante hendrerit imperdiet. Etiam at metus lectus. Aliquam ut ligula neque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
    
    Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec auctor scelerisque purus non sollicitudin. Sed elementum facilisis nisl, eget commodo est congue in. Etiam tincidunt viverra felis, vel tincidunt nulla pretium vel. Phasellus commodo bibendum magna et imperdiet. Aenean euismod condimentum magna eget venenatis. Pellentesque lorem eros, ornare at egestas vel, tincidunt non nunc. Quisque non diam nisl, ut consectetur metus. Fusce ipsum tortor, viverra et lobortis et, ullamcorper non magna. Duis elementum molestie sem, et ullamcorper neque eleifend non. Nunc iaculis quam eros, in pellentesque nunc. Donec tincidunt faucibus est, porta cursus eros imperdiet volutpat.</div>
            </div>
        </div>
        
    </div>
    <body>

    第一次发帖
    为什么不只滚动.content 而不是.content-area

    body {
        height: 100%;
        overflow: hidden;
    }
    #top{
        position: absolute;
        background: yellow;
        height: 50px;
        width: 100%;
        top: 0;
    }
    #left {
        background: #e3e3e3;
        position: absolute;
        bottom: 0;
        left: 0;
        top: 50px;
        width: 200px;
    }
    
    #right {
        position: absolute;
        bottom: 0;
        left: 200px;
        right: 0;
        top: 50px;
    }
    #sub-header {
        height: 20px;
        background: orange;
    }
    #content-area {
        position: absolute;
        top: 20px;
        right: 0;
        bottom: 0;
        left: 0;
    }
    #alert {
        background: red;
        color: white;
    
    }
    #content {
        width: 100%;
        height: 100%;
        overflow-y: auto;
    }
    <body>
    <div class="container">
        <div id="top">top</div>
        <div id="left">left</div>
        <div id="right">
            <div id="sub-header">subheader</div>
            <div id="content-area">
                <div id="alert">alert!</div>
                <div id="content">content<br /><br /><br />Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eget nunc magna, eget vehicula ligula. Vestibulum in massa massa, ut feugiat arcu. Suspendisse feugiat commodo tellus, id aliquam dolor cursus eu. Aliquam erat volutpat. Nulla interdum ipsum ut lectus sollicitudin blandit sodales ante malesuada. Etiam ac neque ut turpis faucibus luctus non et arcu. Maecenas ut risus ut odio fringilla sagittis. Sed nulla lorem, suscipit at condimentum quis, adipiscing eget turpis. Morbi accumsan est at tellus hendrerit sed blandit nibh sagittis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent gravida, velit id sodales bibendum, nulla leo rutrum quam, vel tempus justo mi vitae sapien. In imperdiet blandit rhoncus. Phasellus at massa nulla, ut tincidunt est. Nam viverra dui non enim semper consequat. Etiam sed libero sed ante condimentum bibendum ultrices eu nunc.
    
    Integer massa nibh, interdum eget consectetur sed, scelerisque a ipsum. Fusce et ligula erat. Vestibulum lacus enim, facilisis id sollicitudin non, condimentum eu sem. Donec quis magna nec massa vulputate hendrerit. Nam leo nulla, fermentum eu congue quis, imperdiet sit amet orci. Aliquam ornare felis commodo est rhoncus blandit. Quisque at neque ac turpis vulputate sagittis. Donec et viverra risus. Fusce posuere lacus aliquam erat molestie sed tincidunt elit placerat. Sed pulvinar varius neque. Nullam congue adipiscing quam egestas convallis. Sed molestie massa euismod dolor facilisis laoreet.
    
    Cras sit amet nisi sapien, non fringilla arcu. Aenean euismod gravida sem. Donec eu luctus justo. Aliquam erat volutpat. Mauris vestibulum sagittis magna, eget bibendum dolor tempor nec. Nunc rhoncus suscipit felis eu imperdiet. Sed fermentum diam non turpis tempor sit amet adipiscing leo elementum. Donec aliquam consequat elit id auctor.
    
    Praesent vehicula, nibh a elementum imperdiet, urna nulla iaculis leo, ac hendrerit sem massa ac tortor. Suspendisse viverra consectetur libero a luctus. Maecenas iaculis mi id urna fermentum condimentum viverra tellus vulputate. Suspendisse potenti. Aliquam fermentum nulla quis dolor commodo scelerisque. Donec cursus laoreet consectetur. Praesent ultricies arcu ut ante hendrerit imperdiet. Etiam at metus lectus. Aliquam ut ligula neque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
    
    Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec auctor scelerisque purus non sollicitudin. Sed elementum facilisis nisl, eget commodo est congue in. Etiam tincidunt viverra felis, vel tincidunt nulla pretium vel. Phasellus commodo bibendum magna et imperdiet. Aenean euismod condimentum magna eget venenatis. Pellentesque lorem eros, ornare at egestas vel, tincidunt non nunc. Quisque non diam nisl, ut consectetur metus. Fusce ipsum tortor, viverra et lobortis et, ullamcorper non magna. Duis elementum molestie sem, et ullamcorper neque eleifend non. Nunc iaculis quam eros, in pellentesque nunc. Donec tincidunt faucibus est, porta cursus eros imperdiet volutpat.</div>
            </div>
        </div>
        
    </div>
    <body>

    【讨论】:

    • 如果#alert为空,则不可见。
    • 由于示例中的内容高度为 100%,因此整个滚动条将不可见。在我的示例中,溢出对 div 没有任何影响。
    • 是的,这几乎就是我想要的。问题是警报现在不能改变高度。如果没有其他方法可以做到这一点,我想我可以忍受。您知道#alert + #content 和#alert:empty + #content 在IE7 等旧版浏览器中的效果如何?
    • #alert + #content应该没有问题,如果你不使用javascript动态添加元素。 #alert:empty + #content 在 IE8 中不起作用-quirksmode.org/css/contents.html
    • 我认为我们对此无能为力。需要向 W3C 提出float:top 和float:bottom :)
    【解决方案3】:

    使用浮动:左;和 width: 0; 你可以使用 transform: translateX(xxx);用于设置左侧位置。

    问题解决了:)

    【讨论】:

    • 智能解决方案哈哈哈。非常感谢,对我帮助很大
    【解决方案4】:

    2018-6-18

    我选择position: sticky的CSS方式。

    那个https://github.com/abouolia/sticky-sidebar .
    对我不起作用(我正在使用带有 vue-router 和 vuex 的 Vue.js 2.0 SPA)

    我还想要元素position: absolute,
    然后position: sticky

    解决方案

    1. 父 HTML 元素使用position: absolute 拥有正确的位置。

    (不要忘记为父母设置height。例如height:100%)

    1. 子 HTML 元素 position: sticky

    为我工作。

    【讨论】:

    • 我在这个答案上制作了一个 Youtube 视频:(30 秒)youtube.com/watch?v=LVlD6NmCjts&feature=youtu.be
    • 我设法使它与相反的工作:父粘性和子绝对(这使父高度为 0)。但是感谢您指出正确的方向:)
    • 感谢您的视频,很好的回答。我也能够让它发挥作用。
    • 将高度设置为 100% 很重要!
    • 如果不能将高度设置为 100%,我可以确认@RyanPergent 的方法有效。将父级设置为粘性,将子级设置为绝对。不过,您仍然需要容器(无论是滚动的)具有相对位置。
    【解决方案5】:

    毕竟我选择了使用 JavaScript 方法。本来更喜欢纯 CSS 方法,但我对 IE8 支持的需求阻碍了我。 Myles Gray 的回答与我所做的差不多 - https://stackoverflow.com/a/4933509/940517

    【讨论】:

      【解决方案6】:

      警报随着内容滚动,因为它位于具有overflow-y: auto 的内容区域内。

      将其移出内容区域(将其放在子标题和内容区域之间),并从内容中删除 position: absolute(和上/左/右/下)属性。在该示例中,我认为没有理由将内容置于绝对位置,正常流程会将其放在它想要的位置。

      【讨论】:

      • 是的,在子标题和内容区域之间放置警报是我想要的,但是当我删除绝对定位和上/左/下/右时,内容不会填满窗口的整个高度我需要它。
      • 但不是100%,是100%减去上面div的高度。
      【解决方案7】:
      • 将固定高度和宽度 100% 添加到警报 + 位置:固定
      • 向内容添加 padding-top
      • 如果没有警报,唯一的缺点当然是额外的填充...

      见http://jsfiddle.net/aDdRS/5/

      【讨论】:

      • 是的,问题是我需要布局(填充)在有或没有警报的情况下相同。此外,这会使滚动条部分隐藏在警报后面。
      猜你喜欢
      • 2012-06-16
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多