为何导航栏.navbar及其子元素.navbar ul都需设置display: flex?
我是一名刚学习HTML&CSS的新手,出于好奇想了解背后的逻辑。以下是我写的使用Flexbox制作响应式导航栏的代码:
HTML代码
<nav class="navbar"> <ul> <li><a href="#">Home</a></li> <li><a href="#">About me</a></li> <li><a href="#">Portfolio</a></li> <li><a href="#">Services</a></li> <li><a href="#">Contact me</a></li> </ul> </nav>
CSS代码
.navbar { display: flex; justify-content: center; align-items: center; background-color: rgb(0, 0, 0, 0.5); position: sticky; top: 0; border: 3px dotted red; } .navbar ul { display: flex; margin: 20px 0px; border: 3px dotted blue; }
我的问题是:按照Flexbox规则,只需给父元素设置display: flex即可,为何仅给nav元素设置不行,必须同时给.navbar和它的直接子元素.navbar ul都设置display: flex?
解答
核心原因是Flexbox的作用范围只限于「设置了display:flex的容器」和它的「直接子元素」,不会自动影响更深层的后代元素,咱们拆解来看:
给
.navbar(也就是<nav>标签)设置display:flex时,它的直接子元素是<ul>。这一步的作用是让<ul>作为flex项目,在.navbar容器里遵循flex布局——比如你加的justify-content:center就是让<ul>整体在导航栏的水平中间位置,align-items:center让它垂直居中。但这时候<ul>本身还是默认的块级元素,它内部的<li>依然是垂直堆叠的默认样式。给
.navbar ul设置display:flex时,<ul>变成了flex容器,它的直接子元素<li>就会变成flex项目,自动横向排列(flex容器默认主轴是水平方向),这才是导航栏需要的横向菜单效果。
如果只给.navbar设置display:flex,你只会看到<ul>被居中,但里面的菜单选项还是上下叠在一起,完全不是导航栏该有的样子。所以这两个display:flex是分别作用在不同层级的容器上,各司其职:一个控制<ul>在导航栏里的位置,另一个控制<li>在<ul>里的排列方式。
内容的提问来源于stack exchange,提问作者Super_Cow

