【问题标题】:CSS Grid Layout for Posts instead of stacking (Hugo)用于帖子而不是堆叠的 CSS 网格布局 (Hugo)
【发布时间】:2021-04-08 20:40:25
【问题描述】:

我试图在我的 Hugo 主页上获得一个网格布局,而不是当前的堆叠版本。这些帖子应该出现在 3 列网格中,而不是一个在另一个之上。首先,我将<article> 标签包裹在list.html 中<div class = "container">:

<div class="container">

<article class="{{ $class }}">
  {{- $isHidden := (.Site.Params.cover.hidden | default .Site.Params.cover.hiddenInList)}}
  {{- partial "cover.html" (dict "cxt" . "IsHome" true "isHidden" $isHidden) }}
  <header class="entry-header">
    <h2>
      {{ .Title }}
      {{- if .Draft }}<div class="entry-isdraft"><sup>&nbsp;&nbsp;[draft]</sup></div>{{- end }}
    </h2>
  </header>
  {{- if (ne .Site.Params.hideSummary true)}}
  <section class="entry-content">
    <p>{{ .Summary | plainify | htmlUnescape }}...</p>
  </section>
  {{- end }}
  <footer class="entry-footer">
    {{- partial "post_meta.html" . -}}
  </footer>
  <a class="entry-link" aria-label="post link to {{ .Title | plainify }}" href="{{ .Permalink }}"></a>
</article>
{{- end }}
</div>

我查看了主题的 CSS 文件,可以看到帖子的卡片样式为 post-entry。结合起来,我已将此 CSS 添加到 post-entry.css:

.container {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}

.post-entry {
    margin-bottom: var(--gap);
    padding: var(--gap);
    background: var(--entry);
    border-radius: var(--radius);
    transition: transform .1s
    width: 32%;
    padding-bottom: 32%; /* Same as width, sets height */
    margin-bottom: 2%; /* (100-32*3)/2 */
    position: relative;
}

我认为这是应该的。但这显然行不通。出于某种原因,第一个帖子的宽度减小了,而第二个帖子条目是全宽的。它们并没有像预期的那样并排,但仍然堆叠:See the image here

我的 repo 托管在这里:https://github.com/thedivtagguy/archives,如果这更有帮助的话。

现场部署在这里:https://jolly-panini-82258b.netlify.app/

【问题讨论】:

    标签: html css flexbox hugo


    【解决方案1】:

    我会这样处理它:

    .container {
      display: flex;
      flex-wrap: wrap;
    }
    
    .post-entry-content-wrapper {
      padding: 5px;
    }
    
    .post-entry {
      width: 33.33%;
      /* etc */
    }
    

    然后你就可以玩弄间距了。

    但是,我看到您将第二个 .post-entry 元素包装在另一个 .container 元素中。取出第二个 post-entry 元素,这样第二个 .container 元素就不会干扰了。

    编辑

    要包装行,您可以像之前在代码中一样添加flex-wrap: wrap;。

    要添加一些间距,我只需将 post-entry 包装在另一个元素中并添加一些填充。这是受到 BulmaCSS 的启发。

    但是,由于您确实在尝试制作网格,您不妨使用 display: grid,因为它是为此类用例量身定制的。

    【讨论】:

    • 感谢您的回答!我已经尝试过您所说的(see here,虽然它们现在并排在一起,但它们在没有任何填充的情况下聚集在一起(我也尝试过添加)。此外,这应该是一个 3 列网格,就像你可以看到here,第四项没有被添加到下面的行中,而是创建了一个新列。
    • 我已经调整了答案以更好地满足您的需求。但是,您确实可以使用 display: grid.
    【解决方案2】:

    通过查看您的实时部署网站,我发现了两个问题:

    1. .container 类用于包装所有帖子和第二篇博文“Hello R Markdown”。这将导致正确添加 CSS 时发生冲突。
    2. 您在 .container 上设置了 display: flex,而您确实希望根据您的问题实现 grid 布局。

    问题2很容易解决(如果你有一个独特的类作为包装器,它将解决问题1),你可以使用display: grid和grid-template-columns来利用可用空间并将所有项目放在一个网格。 Read more about grid-template-columns on MDN.

    .container {
        display: grid;
        grid-template-columns: 1fr 2fr;
        grid-gap: 10px;
        margin-left: 80px;
        padding: 1px 16px;
    }
    
    • grid-template-columns: 1fr 2fr;:每行的item是如何划分的,fr代表fragment。
    • grid-gap:每一项之间的间距。

    以这个小sn-p为起点。

    .container {
      display: grid;
      grid-template-columns: 1fr 2fr;
      grid-gap: 10px;
    }
    
    /* Only for demonstration purposes */
    .post {
      background-color: #eee;
    }
    
    body {
      margin: 0;
      padding: 0;
    }
    <div class="container">
      <div class="post">
        <h2>This is Lorem</h2>
      </div>
      <div class="post">
        <h2>Hello R Markdown</h2>
      </div>
      <div class="post">
        <h2>This is Lorem</h2>
      </div>
    </div>

    【讨论】:

    • 感谢您的详细解答!我不知道网格模板,这似乎是更简单的方法。根据您所说的和 MDN 页面,我创建了一个 three fragment template,但如果您看到 site,它似乎是在添加列而不是在第三项之后添加新行。它们似乎也被压扁了,而且宽度不合适。 CSS here我该如何解决这个问题?
    • 另一个用户也提到我错误地包装了container。这发生在哪里?我在&lt;article class="{{ $class }}"&gt; 之前添加了 div,并在结束标记之后结束了它。我看不出第二个帖子是如何受到影响的,但它似乎正在发生。
    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多