首页 > 解决方案 > 为什么在使用 flex 时 align-self 属性不适用于导航栏?

问题描述

这应该是一个粘性导航栏,但永远不会变得粘性。我读过我必须用align-self: flex-start;flex 来解决这个问题,但遗憾的是没有这样做。

body { padding-bottom: 2000px;}
ul { list-style: none;}

.wrap {
 position: sticky;
 position: -webkit-sticky; 
 top: 0; 
 align-self: flex-start; 
}
.nav-bar { 
 display: flex; 
 flex-direction: row; 
 justify-content: flex-end; 
 background-color: #00aae4; 
 margin-bottom: 0;
 padding-right: 30px; 
 height: 50px; 
 margin-top:0; 
}
.nav-link { 
 padding-left: 0; 
 padding-right: 0; 
 background-color: #f1f1f1;
 width: 100px; 
 text-align: center;
 font-size: 20px; 
 margin-top: 5px; 
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<nav class="wrap">
          <ul class="nav-bar">
            <li class="nav-link">Luigis</li>
            <li class="nav-link">Menu</li>
            <li class="nav-link">Acerca de </li>
            <li class="nav-link">Contacto</li>
          </ul>
    </nav>
</body>
</html>

我尝试将 align-self 属性位置更改为 ul 的设置并使用 top. 还尝试通过仅使用带有类的 div 来消除列表,但仍然没有结果。

标签: htmlcssflexboxsticky

解决方案


规范

粘性定位元素和粘性约束矩形底部的交点限制了任何方向的移动,因此偏移量永远不会将粘性定位元素推到其包含块之外。但是,当页面滚动时元素可以在其包含块内自由移动时,它似乎被固定到相关的流根边缘,类似于固定位置元素。

默认情况下,您的元素包含在内容框而不是填充框中,并且在您的情况下,内容框由粘性元素定义,因此如果添加大填充,则不会出现粘性行为。

如果您添加较大的高度以增加内容框,您可能会有粘性行为。

body {
  height: 2000px;
}

ul {
  list-style: none;
}

.wrap {
  position: sticky;
  position: -webkit-sticky;
  top: 0;
}

.nav-bar {
  display: flex;
  flex-direction: row;
  justify-content: flex-end;
  background-color: #00aae4;
  margin-bottom: 0;
  padding-right: 30px;
  height: 50px;
  margin-top: 0;
}

.nav-link {
  padding-left: 0;
  padding-right: 0;
  background-color: #f1f1f1;
  width: 100px;
  text-align: center;
  font-size: 20px;
  margin-top: 5px;
}
<nav class="wrap">
    <ul class="nav-bar">
      <li class="nav-link">Luigis</li>
      <li class="nav-link">Menu</li>
      <li class="nav-link">Acerca de </li>
      <li class="nav-link">Contacto</li>
    </ul>
  </nav>

  1. 对于其他元素,如果元素的位置是“相对”或“静态”,则包含块由最近的块容器祖先框的内容边缘形成。参考

您可能对作为填充框的绝对定位元素的包含块感到困惑:

  1. 如果元素具有“位置:绝对”,则包含块由最近的祖先以“绝对”、“相对”或“固定”的“位置”建立,方式如下:

    1. 在祖先是内联元素的情况下,包含块是围绕该元素生成的第一个和最后一个内联框的填充框的边界框。在 CSS 2.1 中,如果内联元素被拆分为多行,则包含块是未定义的。
    2. 否则,包含块由祖先的填充边缘形成。

推荐阅读