我试图同时实现两种样式,一种包括粘滞位置,另一种包括粘滞元素的父元素:

  1. 我想我的网页的第一部分,让我们称之为"英雄节",采取整个屏幕的高度(这部分有一个bottom元素,应该在屏幕的底部,当页面滚动到顶部,其余的内容应该遵循后)
  2. 我也希望导航栏粘在网站的顶部,但这个导航栏不是在网站的开头(当页面滚动到顶部时),它在第二个位置,就在标题之后

另外,我试图找到一个不使用JavaScript的解决方案,css only.

以下是一段代码片段,其中包含两列,一列表示问题的两个方面:

body {
  margin: 0px 10px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  font-size: 10px;
}
.hero_bottom {
  height: 50px;
  background-color: lightblue;
  margin: 10px 0px;
}
main {
  height: 200vh;
  background-image: linear-gradient(red, yellow);
}
section.left header {
  display: grid;
  grid-template-rows: 1fr 1fr auto;
  gap: 10px;
  height: 100vh;
  border: 1px solid blue;
}
nav {
  position: sticky;
  top: 0px;
}
<section class="left">
  <!-- HERO SECTION -->
  <header>
    <h1>
     either I have the "bottom" element at the bottom of the screen view...
    </h1>
    <nav>
      <a href="#">link</a>
      <a href="#">link</a>
      <a href="#">link</a>
    </nav>
    <div class="hero_bottom">hero-bottom</div>
  </header>
  <!-- end HERO SECTION -->
  <main>main content</main>
</section>

<section class="right">
  <!-- HERO SECTION -->
  <h1>
   ...or I have the navbar that stick through the entire website. But how to have both ?
  </h1>
  <nav>
    <a href="#">link</a>
    <a href="#">link</a>
    <a href="#">link</a>
  </nav>
  <div class="hero_bottom">hero-bottom</div>
  <!-- end HERO SECTION -->
  <main>main content</main>
</section>

如果navbar是body的直接子元素(或者任何具有网站高度的元素,如我的示例中的<section>),那么很容易使navbar贯穿整个网站,如果页面顶部出现的所有内容都在块级包装器中,那么很容易将hero-bottom元素放置在hero部分的底部,包括navbar.

但是一个阻止了另一个:底层元素需要块级包装器,而包装器防止导航栏贯穿整个网站.那是我的问题!

我不觉得有一个解决方案,使导航栏粘到它的祖父(在这种情况下,因为我知道这有时是可能的,如果你可以使父内联级别例如),所以也许它是更好地找到一个解决方案,有bottom元素在底部的英雄节没有包装?

推荐答案

我已经找到了一个解决方案,所以我会回答我自己的问题,但这是一个老套的技巧,不是一个干净的解决方案:/

这是对第二个方面的解决方案,即如何将"英雄底部"和页面的其余部分放置在英雄部分的底部,而不是在直接块级父级之外使用粘滞的解决方案

诀窍是在Hero部分使用一个不可见的Float元素,赋予它100vh的高度,并清除页面的主要内容,以便它跟随Float元素.然后,我移动了Main-Content中的"Hero-Bottom"部分,并使其绝对位于顶部

举个例子可以更好地解释这一点:

body {
  margin: 0px 10px;
  font-size: 10px;
}
body > h1, body > nav {
  border: 1px solid blue;
}
.float {
  float: left;
  border: 2px solid green;
  height: 100vh;
}
nav {
  position: sticky;
  top: 0px;
  z-index: 1;
}
main {
  position: relative;
  height: 400vh;
  background-image: linear-gradient(red, yellow);
  clear: both;
}
main .hero_bottom {
  height: 50px;
  background-color: lightblue;
  margin: 10px 0px;
  position: absolute;
  bottom: 100%;
  left: 0px;
  width: 100%;
}
<div class="float"></div>
<h1>
 title
</h1>
<nav>
  <a href="#">link</a>
  <a href="#">link</a>
  <a href="#">link</a>
</nav>
<main>
  <div class="hero_bottom">hero-bottom</div>
  main-content
</main>

然而,由于主人公部分不能位于任何类型的块级元素内(包括FlexBox和GRID),因此定制标题和导航栏的位置并不容易

可以使用"clearfix" trick来实现一点定制:

body {
  margin: 0px 10px;
  font-size: 10px;
}
header, nav {
  border: 1px solid blue;
}
body * {
  margin: 0px;
  padding: 0px;
}
.float {
  float: left;
  border: 2px solid green;
}
.float_header {
  height: 60vh;
}
.float_nav {
  height: 40vh;
}
.clearfix::after {
  content: "";
  clear: both;
  display: block;
}
.clear {
  clear: both;
  width: 0px;
  height: 0px;
}
header {
  display: block;
  position: relative;
}
h1 {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  border: 1px solid orange;
}
nav {
  position: sticky;
  top: 0px;
  z-index: 1;
  text-align: center;
}
main {
  position: relative;
  height: 400vh;
  background-image: linear-gradient(red, yellow);
  clear: both;
}
main .hero_bottom {
  height: 50px;
  background-color: lightblue;
  margin: 10px 0px;
  position: absolute;
  bottom: 100%;
  left: 0px;
  width: 100%;
}
<div class="float float_header"></div>
<header class="clearfix">
  <h1>
   title
  </h1>
</header>
<div class="clear"></div>
<div class="float float_nav"></div>
<nav>
  <a href="#">link</a>
  <a href="#">link</a>
  <a href="#">link</a>
</nav>
<main>
  <div class="hero_bottom">hero-bottom</div>
  main-content
</main>

现在,我不确定我会不会在生产中使用它

Html相关问答推荐

后续使用收件箱从网页表中提取值

如何才能完成这个背景按钮

弹性项在主轴方向溢出

如何防止SVG图标出现断行?

仅包含名为X的子元素的元素的XPath?

如何使用html和css将两个项目垂直对齐

图像不在HTML文件中显示

在弹性框布局中的第n个元素后强制换行

Html视频标签:圆角像素化

当底部进入视图时从底部粘性定位

如何从通过 find-each 方法(在 Rails 应用程序中)生成的列表创建下拉菜单?

带有数据 URI 的音频在 Chrome 中失败

我真的需要一个容器来让行和列正常工作吗? ( bootstrap 程序 v5)

如何在Rmarkdown中添加千位分隔符?

从垫分页器中删除输入边框

获取 div 中每个元素的 href 并使用它

如果不透明的元素出现在下方,为什么不透明度会使一个元素出现在另一个元素上方?

如何在没有 JS 的情况下创建带搜索的 Select 菜单

将固定/绝对伪元素放置在相对 div(具有滚动条)内,始终位于底部

SVG 适用于 Safari,不适用于 Chrome