【问题标题】:CSS grid with top bar, sidebar, and repeating content带有顶栏、侧边栏和重复内容的 CSS 网格
【发布时间】:2020-03-12 19:30:03
【问题描述】:

我很难使用 CSS 网格功能创建以下布局,我不确定是否可行:

我可以将顶部和右侧的栏放在表格中的网格之外,但是由于网格的重复部分中的列是固定宽度,我还没有找到不在它们之间留空间的方法,并且侧边栏不让它们伸展。

我尝试了很多不同的方法,但都没有奏效。我认为解决方案看起来像这样:

.my_grid {
    display: grid;
    justify-content: center;
    grid-template-columns: repeat(auto-fit, 300px);
}

.grid_top_bar {
    grid-row-start: 1;
    grid-row-end: 1;
    grid-column-start: 1;
    grid-column-end: -1;
}

.grid_right_side_bar {
    grid-row-start: 2;
    grid-row-end: -1;
    grid-column-start: -1;
    grid-column-end: -1;
}

.grid_item {
}
<div class="my_grid">
    <div class="grid_top_bar">...</div>
    <div class="grid_right_side_bar">...</div>
    
    <!-- repeating items -->
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    ...
</div>

...但是这当然行不通。知道是否/如何做到这一点吗?

【问题讨论】:

  • 是 4col x Xrows 还是 Xcol x Xrows 网格?
  • 您不需要将顶部和侧边栏放到您的网格中。您可以将重复部分设置为网格。使用 Html/Css 作为你的优势,而不是相反。
  • Merlon,正如我所提到的,我无法将侧边栏放在网格之外而不在它们之间留出空间。也许我理解错了,但如果你使用重复,并且列的宽度是固定的,它会使用尽可能多的空间,而其余部分则为空。我可以在右边证明内容,但我无法将整个内容完美地放在页面上......

标签: html css css-grid


【解决方案1】:

对于可变数量的列,为了避免空白和响应行为,您可以使用

  • width:max-content,
  • 使用特定标签时的子网格
  • 一个连贯的标记 (header,aside,main) 而不是中性的 div。

除了父级上的width:max-content 之外,您必须通过calc()min-width 设置为main 以避免空白并允许根据窗口宽度而不是单列换行:

.grid {
  display: grid;
  grid-gap: 0.5em;
}

#myGrid {
  grid-template-columns: 1fr 300px;
  grid-template-rows: auto 1fr;
  grid-auto-flow: dense;
  width: max-content;
  margin: auto;
}

main {
  grid-template-columns: repeat(auto-fit, 300px);
  min-width: calc( (100vw - 400px) / 1.35);  /* make it smaller than window's removing average 400px fom aside and gaps to start width then divide (1.x) or multiplicate (0.x) to adjust */
}

header {
  grid-column: 1/3;
}

aside {
  grid-column: 2;
}

.grid> :not(.grid) {
  border: solid rgb(0, 112, 202);
  padding: 0.5em;
  background: linear-gradient(40deg, rgb(9, 164, 233), transparent, rgb(9, 164, 233), rgb(9, 164, 233), transparent), linear-gradient(-40deg, rgb(9, 164, 233), transparent, rgb(9, 164, 233), rgb(9, 164, 233), transparent) rgb(144, 215, 245);
  background-size: 8px 15px, 6px 12px
}
<div class="grid" id="myGrid">
  <header>Play me in full page mode and resize window's width to check on my behavior</header>
  <aside>...</aside>
  <main class="grid">
    <!-- repeating items -->
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
    <div class="grid_item">...</div>
  </main>

</div>

codepen to play with

【讨论】:

  • 印象深刻,谢谢!对我有用的另一件事是将顶栏、侧栏和网格放在一个表格中,并使用 JS 将网格的宽度设置为页面减去侧栏所能容纳的列数。我希望你可以在 CSS 中使用模数或下限,否则我不需要 JS 来做。
猜你喜欢
  • 2016-10-28
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多