我正在创建一个用CSS网格制作的导航条。
我决定用网格来制作它,这样我就可以重新排列的节(条目),而不需要修改html (只需修改CSS)。
然后,我创建了三个区域的网格:徽标,菜单,切换。
我增加了一点空白,这样每个项目就不会粘在一起了。

到目前为止,直到我尝试删除一个/部分部分之前,的空白仍然存在,即使这个部分已经消失了。
然后,我试图消除空白,并以一个空白的每一节。但是边距不会在网格的开始/结束时崩溃。它的行为与常规块元素不同。
我知道使用柔性盒比使用网格更实用,但我更喜欢网格,因为可以在不修改html的情况下重新排列部分。这是可以移动标志在顶部或其他地方。一些不可能的东西。
有人能解决我的网格缺口问题吗?或者你有不同的方法来创建导航条?
见我的沙盒
.navbar {
background: pink;
display: grid;
grid-template-rows: auto;
grid-template-columns: max-content auto max-content;
grid-template-areas: "logo menus toggler";
justify-items: stretch;
align-items: stretch;
column-gap: 20px;
}
.logo {
background: green;
grid-area: logo;
width: 60px;
}
.menus {
background: lightsalmon;
grid-area: menus;
display: flex;
flex-direction: row;
justify-content: start;
}
.menus * {
padding: 5px;
}
.toggler {
background: lightskyblue;
grid-area: toggler;
}<p>navbar with complete sections:</p>
<nav class="navbar">
<div class="logo">
LoGo
</div>
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
<div class="toggler">
X
</div>
</nav>
<hr>
<p>navbar without logo:</p>
<nav class="navbar">
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
<div class="toggler">
X
</div>
</nav>
<hr>
<p>navbar without toggler:</p>
<nav class="navbar">
<div class="logo">
LoGo
</div>
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
</nav>
发布于 2021-04-19 10:47:03
在这种情况下,您可以依赖隐式列。您只定义一个显式列,并且只在元素存在时才创建新列。你也可以很容易地用问题交换位置。
.navbar {
background: pink;
display: grid;
grid-template-rows: auto;
grid-template-columns: 1fr; /* only column intially */
grid-auto-flow:dense;
justify-items: stretch;
align-items: stretch;
column-gap: 20px;
}
.logo {
background: green;
width: 60px;
grid-column:-3; /* create an implicit one at the beginning */
}
.menus {
background: lightsalmon;
display: flex;
flex-direction: row;
justify-content: start;
grid-column: 1; /* take the explicit one */
}
.menus * {
padding: 5px;
}
.toggler {
background: lightskyblue;
grid-column:2; /* create an implicit one at the end */
}<p>navbar with complete sections:</p>
<nav class="navbar">
<div class="logo">
LoGo
</div>
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
<div class="toggler">
X
</div>
</nav>
<hr>
<p>navbar without logo:</p>
<nav class="navbar">
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
<div class="toggler">
X
</div>
</nav>
<hr>
<p>navbar without toggler:</p>
<nav class="navbar">
<div class="logo">
LoGo
</div>
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
</nav>
<hr>
<p>navbar without toggler and log at the end </p>
<nav class="navbar">
<div class="logo" style="grid-column:2">
LoGo
</div>
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
</nav>
<hr>
<p>navbar without logo and toogler at the beginning </p>
<nav class="navbar">
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
<div class="toggler" style="grid-column:-3">
X
</div>
</nav>
发布于 2021-04-19 09:08:06
在本例中,您可以尝试以下方法而不是column-gap: 20px;:
nav > div:not(:first-child){
margin-left:20px;
}它为第一级div增加了空间,并将第一个div排除在选择范围之外。
.navbar {
background: pink;
display: grid;
grid-template-rows: auto;
grid-template-columns: max-content auto max-content;
grid-template-areas: "logo menus toggler";
justify-items: stretch;
align-items: stretch;
}
nav > div:not(:first-child){
margin-left:20px;
}
.logo {
background: green;
grid-area: logo;
width: 60px;
}
.menus {
background: lightsalmon;
grid-area: menus;
display: flex;
flex-direction: row;
justify-content: start;
}
.menus * {
padding: 5px;
}
.toggler {
background: lightskyblue;
grid-area: toggler;
}<p>navbar with complete sections:</p>
<nav class="navbar">
<div class="logo">
LoGo
</div>
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
<div class="toggler">
X
</div>
</nav>
<hr>
<p>navbar without logo:</p>
<nav class="navbar">
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
<div class="toggler">
X
</div>
</nav>
<hr>
<p>navbar without toggler:</p>
<nav class="navbar">
<div class="logo">
LoGo
</div>
<div class="menus">
<div>menu-1</div>
<div>menu-2</div>
<div>menu-3</div>
</div>
</nav>
发布于 2021-04-19 02:51:27
这完全可以用网格来完成,而且网格的优点是完全正确的,它似乎可以重新排列html元素。我认为问题是,您的列间隔适用于所有三种情况,因为它是您的导航栏类的一部分。
.navbar {
column-gap: 20px;
}在下面的示例中,我使用同一个类创建了两个网格区域容器。我把列间隙应用在顶部的容器上,而不是底部的容器上。
我还使用了for : end表示左边的蓝色div显示列之间没有间隙,尽管您也可以使用chrome工具来查看顶部网格有空隙,而底部则没有空隙。
.container {
display: grid;
grid-template-areas: "left center right";
margin-bottom: 40px;
}
.top {
column-gap: 20px;
}
.bottom{
column-gap: 0;
}
.d1 {
grid-area: left;
background: red;
}
.d2 {
grid-area: center;
background: red;
}
.d3 {
grid-area: right;
background: red;
}
.d4 {
grid-area: left;
background: blue;
justify-self: end;
}
.d5 {
grid-area: center;
background: blue;
}
.d1,
.d2,
.d3,
.d4,
.d5 {
width: 200px;
height: 50px;
}<div class="container top">
<div class="d1"></div>
<div class="d2"></div>
<div class="d3"></div>
</div>
<div class="container bottom">
<div class="d4"></div>
<div class="d5"></div>
</div>
https://stackoverflow.com/questions/67154896
复制相似问题