【问题标题】:CSS To Make Vertical Scrolling Region Under Fixed Header?CSS在固定标题下制作垂直滚动区域?
【发布时间】:2018-12-06 19:41:14
【问题描述】:

目标: 模拟 此 StackOverflow 页面的固定标题和可滚动内容:

  • 随着内容向上滚动,内容下方的页脚会向上滚动。
  • 向下翻页(通过键盘)时,页眉不会截断任何内容。即,内容不能放在标题后面。
  • 锚点不在标题后面。
  • 没有双滚动条。
  • 如果我增加标题的高度(例如在悬停时),页面内容不会被进一步向下推(即,较高的标题只会覆盖更多的内容)。
  • #header#content#footer div 是兄弟姐妹

<div id="header">This is the header.</div>

<div id='content'>This is the content.</div>

<div id='footer'>This is the footer.</div>

要申请的网址:https://gunretort.xyz/index.php/Portal:Tag?Tag=CommonGround

正文填充失败: 一个常见的建议是body{padding-top:...},将#content 向下推。但它并没有真正将内容向下推——内容仍然在页眉后面滚动,所以当你向下翻页时,内容的顶部会被页眉剪掉。锚点落在头球后面,看不到它们。

标题后面的内容示例:

在此示例中单击“转到锚点”以查看问题。 https://codepen.io/johnyradio/pen/pKxBwQ

堆栈溢出: StackOverflow 做得对。根据需要,页脚随内容向上滚动。 #content 和#footer 是同胞。我在此页面的 CSS 中看到以下内容,但我不知道这是否是魔法。

#content {
    max-width: 1100px;
    width: calc(100% - 164px);
    background-color: #FFF;
    padding: 24px;
    box-sizing: border-box;
}

div {
    display: block;
}

#content:before, #content:after {
    content: "";
    display: table;
}

body *, body *:before, body *:after {
    box-sizing: inherit;
}

#content:after {
    clear: both;
}

弹性: 我还在这个 SO 页面的 .css 文件中看到了很多 Flex。下面的答案中使用了 Flex。这些答案有问题——他们打破了#footer

网格: 网格似乎应该就是这样。但我担心浏览器的兼容性。另外,到目前为止,我还没有找到网格解决方案。

溢出: 这种方法使用固定位置将#content 放置在标题下方,没有重叠。使用overflow:auto 使其成为一个固定大小的框,为#content div 提供了它自己的滚动条。我们可以修复#content 下面的#footer 位置,但缺点是页脚不会向上滚动——它必须占据视口底部的永久不动产。

https://codepen.io/johnyradio/pen/aKReor

+边距-边距: 一些解决方案涉及填充和边距。对于来自同一页面或不同页面的跨度锚、a 链接,这并不能始终如一地工作。在不知道目标 ID 时使用 :target 并非在所有情况下都有效。此外,它没有解决正确的向下翻页问题。此外,将样式应用于主要 div 似乎更有效,而不是每个链接目标。任何需要 id 或类名知识的解决方案都行不通,因为我们不会拥有这些知识——此外,涵盖所有当前和未来案例的强大 CSS 解决方案不应该需要这些知识。

a[name] {
  padding-top: 40px;
  margin-top: -40px;
  display: inline-block;
}

https://css-tricks.com/hash-tag-links-padding/

框架: 我在想一个框架可能是一个选项,但问题是我无法更改 HTML。

不是重复的:这个问题不是这里其他线程的重复。我在 SO 上看到的解决方案不能处理未知的链接目标、正确的页面和滚动页脚(如本页)。例如,

Body top gap; should I use margin or padding?

【问题讨论】:

    标签: css


    【解决方案1】:

    overflow-x: auto 用于您要滚动的内容。

    在这种情况下,<main /> 块拥有自己的滚动条。内容不会落后于 header 元素。

    body {
      margin: 0;
      background-color: red;
      flex-direction: column;
      display: flex;
      height: 100vh;
    }
    
    header {
      opacity: .3;
      background-color: yellow;
      height: 50px;
    }
    
    main {
      overflow-x: auto;
      flex: 1;
    }
    <body>
      <header>Header is semi-opaque</header>
      <main>
        <p><a href='#myAnchor'>Go to anchor</a> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
        <p>Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr.
        <p><a href='#myAnchor'>Go to anchor</a> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et earebum.
        <p><span style='color:yellow' id=myAnchor>ANCHOR</span>  Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr.
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea
        <p> rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr.
      </main>
    </body>

    【讨论】:

    • 我在这里应用了你的代码。没有为我工作。内容在标题后面滚动,并且锚点落在标题后面。请参阅有关双滚动条的说明。此外,您的示例不包括锚跨度。 codepen.io/johnyradio/pen/pKxBwQ
    • 那么你使用的是不同的css。使用此代码,内容不可能出现在标题后面。
    • 好的,我再次尝试了您的代码(没有与代码混合)。 codepen.io/johnyradio/pen/VdEOer 可以,但是双滚动条是个问题。请参阅有关双滚动条的注释。
    • 您忘记在正文中添加margin: 0;。因为默认边距被添加到100vh,所以你得到了双滚动条。正文没有边距,100vh 应该是窗口的确切高度,并且文档元素本身没有额外的滚动条。
    • 我认为可能有更简单的方法来获得你想要的东西。但由于它与此解决方案完全不同,我将其作为不同的答案发布。
    【解决方案2】:

    给你的内容容器一个固定的position,并相应地设置它的topheight。最后,使用overflow: auto 使其可滚动。

    简而言之,只需将您的 #content 样式替换为:

    #content{
      position: fixed;
      top: 50px;
      height: calc(100vh - 50px);
      overflow: auto;
      flex: 1;
    }
    

    编辑:

    Here's 指向您的笔叉的链接以及工作解决方案。

    【讨论】:

    • 您的代码正在破坏我的网站。 没有您的代码的站点: image.ibb.co/hFcZzo/Screenshot_366.png 有您的代码的站点: image.ibb.co/kTXpX8/Screenshot_365.png 添加到问题的网址。
    • 我尝试将内容宽度更改为 100%。这解决了宽度问题,但页脚(内容下的 div)仍然会丢失。
    • 您上面的答案不包括您的代码笔中的完整代码。您的 codepen 还包括 body 的 CSS。它提供双滚动条。有趣的是,如果我只使用您的 content CSS,而不使用您的 body CSS,我仍然可以获得所需的行为,但没有双滚动条!唯一的问题是,页脚会丢失(有或没有body css)。
    【解决方案3】:

    这里有一个技巧可以让锚看起来更大,这样点击链接就不会覆盖实际的锚文本。由于您有负边距,因此锚元素不会占用更多空间。但它的滚动位置会高出 50 像素。

    :target {
      padding-top: 50px; 
      margin-top: -50px
    }
    

    这使用了:target 伪类。

    :target CSS 伪类表示一个唯一元素(目标 element) 的 id 与 URL 的片段匹配。

    示例:https://codepen.io/haakenlid/pen/oyarva

    【讨论】:

    • thx,该修复的问题是页面上还有其他锚点,不是我创建的,将来可能会有更多锚点不是我创建的。我不会知道他们的 ID。
    • 您可以使用:target 伪类。查看更新的示例
    • 太棒了!这可能会解决锚问题。但我认为这不会解决向下翻页时文本在标题后面的问题(请参阅有问题的修订版)。
    • 我认为你应该发布一个关于这个的新问题,而不是改变这个。
    • 如果我发布了一个新问题,那将是同一个问题。这都与内容的滚动区域有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多