我知道有类似的问题,但这是特别询问如何使用CSS网格布局.
所以我们有这个基本的网格设置:
HTML(带侧边栏):
<div class="grid">
<div class="content">
<p>content</p>
</div>
<div class="sidebar">
<p>sidebar</p>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
CSS:
.grid {
display: grid;
grid-template-columns: 1fr 200px;
}
Run Code Online (Sandbox Code Playgroud)
要创建看起来像这样的布局:
| content | sidebar |
Run Code Online (Sandbox Code Playgroud)
如果页面没有侧边栏,即.html看起来像这样,但使用相同的CSS:
HTML(没有侧边栏):
<div class="grid">
<div class="content">
<p>content</p>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
页面布局如下所示(破折号表示空白区域)
| content | ------- |
Run Code Online (Sandbox Code Playgroud)
我知道为什么会这样做,网格列仍然在grid-template-columns
规则中定义.
我只是想知道如何告诉网格如果没有内容,那么填写剩余空间类似于flex-grow
工作方式flexbox
.
如果没有侧边栏,则期望的结果将如此.
| content |
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以通过使用内容大小调整关键字来接近,例如:
.grid {
display: grid;
grid-template-columns: 1fr fit-content(200px);
}
.sidebar {
width: 100%;
}
Run Code Online (Sandbox Code Playgroud)
该fit-content
关键字将着眼于内容的大小和行为像max-content
,直到它到达你传递值。
实际上,您可能不需要在侧边栏上粘贴尺寸,因为内容可能会规定至少 200 像素的尺寸(例如),但您可以使用它。
不要定义列明确用grid-template-columns
。
改为使列隐式,然后用于grid-auto-columns
定义其宽度。
.content
当第二列(.sidebar
)不存在时,这将允许第一列()占用该行中的所有空间。
.grid {
display: grid;
grid-auto-columns: 1fr 200px;
}
.content {
grid-column: 1;
}
.sidebar {
grid-column: 2;
}
.grid > * {
border: 1px dashed red; /* demo only */
}
Run Code Online (Sandbox Code Playgroud)
<p>With side bar:</p>
<div class="grid">
<div class="content">
<p>content</p>
</div>
<div class="sidebar">
<p>sidebar</p>
</div>
</div>
<p>No side bar:</p>
<div class="grid">
<div class="content">
<p>content</p>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我想我现在知道这个问题的明确答案了。到目前为止答案的问题是,它们没有解释如何处理主要内容左侧的侧边栏(主要是因为我没有在原始问题中要求它)。
<div class="grid">
<nav>
<p>navigation</p>
</nav>
<main>
<p>content</p>
</main>
<aside>
<p>sidebar</p>
</aside>
</div>
Run Code Online (Sandbox Code Playgroud)
你可以使用这个CSS:
.grid {
display: grid;
grid-template-columns: fit-content(200px) 1fr fit-content(200px);
}
nav, aside {
width: 100%;
}
/* ensures that the content will always be placed in the correct column */
nav { grid-column: 1; }
main { grid-column: 2; }
aside { grid-column: 3; }
Run Code Online (Sandbox Code Playgroud)
这也是网格区域的一个很好的用例
.grid {
display: grid;
grid-template-columns: fit-content(200px) 1fr fit-content(200px);
grid-template-areas: "nav content sidebar";
}
nav, aside {
width: 100%;
}
/* ensures that the content will always be placed in the correct column */
nav { grid-area: nav; }
main { grid-area: content; }
aside { grid-area: sidebar; }
Run Code Online (Sandbox Code Playgroud)
IE 兼容版本如下所示:
.grid {
display: -ms-grid;
display: grid;
-ms-grid-columns: auto 1fr auto;
grid-template-columns: auto 1fr auto;
}
nav, aside {
width: 100%; /* Ensures that if the content exists, it takes up max-width */
max-width: 200px; /* Prevents the content exceeding 200px in width */
}
/* ensures that the content will always be placed in the correct column */
nav {
-ms-grid-column: 1;
grid-column: 1;
}
main {
-ms-grid-column: 2;
grid-column: 2;
}
aside {
-ms-grid-column: 3;
grid-column: 3;
}
Run Code Online (Sandbox Code Playgroud)