为什么在使用 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>

我尝试将对齐自身属性位置更改为 ul 的设置并利用 top。还试图通过仅使用div 和 clases 来消除列表,但仍然没有结果。

从规范:

粘滞定位元素与粘性

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

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

如果您添加一个大高度来增加内容框,您可能会有粘性行为。

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. 否则,包含块由祖先的填充边缘形成。

最新更新