CSS-макет сетки для сообщений вместо укладки (Hugo)

#html #css #flexbox #hugo

#HTML #css #flexbox #hugo

Вопрос:

Я пытаюсь получить макет сетки на главной странице my Hugo вместо текущей версии stacked. Сообщения должны отображаться в сетке из 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>amp;nbsp;amp;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;
}

 

Я думаю, что это то, что должно быть. Но это явно не работает. По какой-то причине ширина первого сообщения уменьшается, в то время как вторая запись-запись во всю ширину. Они не расположены рядом, как ожидалось, но все еще сложены: смотрите Изображение здесь

Мой репозиторий размещен здесь: https://github.com/thedivtagguy/archives если это будет более полезно.

Здесь находится живое развертывание: https://jolly-panini-82258b.netlify.app /

Ответ №1:

Глядя на ваш веб-сайт live deploy, я вижу две проблемы:

  1. .container Класс используется для обертки вокруг всех сообщений и для второго сообщения в блоге «Привет, R Markdown». Это вызовет конфликты при правильном добавлении CSS.
  2. Вы устанавливаете display: flex on .container , в то время как вы действительно хотите получить макет сетки в соответствии с вашим вопросом.

Проблему 2 легко решить (если у вас есть уникальный класс в качестве оболочки, это решит проблему 1), вы можете просто использовать display: grid вместе с grid-template-columns , чтобы использовать доступное пространство и разместить все элементы в сетке. Подробнее о grid-template-columns читайте в MDN.

 .container {
    display: grid;
    grid-template-columns: 1fr 2fr;
    grid-gap: 10px;
    margin-left: 80px;
    padding: 1px 16px;
}
 
  • grid-template-columns: 1fr 2fr; : как элементы разделены на строку, fr означает фрагмент.
  • grid-gap : пространство между каждым элементом.

Посмотрите на этот небольшой фрагмент в качестве отправной точки.

 .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> 

Комментарии:

1. Спасибо за подробный ответ! Я не знал о шаблонах сетки, и это определенно кажется более простым способом сделать это. Основываясь на том, что вы сказали, и на странице MDN, я создал шаблон из трех фрагментов , но если вы видите сайт , кажется, что он добавляет столбцы вместо добавления новой строки после третьего элемента. Они также кажутся сжатыми и неправильной ширины. CSS здесь , как я могу это исправить?

2. Другой пользователь также упомянул, что я container неправильно переношу. Где это происходит? Я добавил div раньше <article class="{{ $class }}"> и закончил его после закрывающего тега. Я не вижу, как влияет второй пост, и все же, похоже, это происходит.

3. @namtar Вероятно, вы добавляете это .container для каждого сообщения (например, в цикле for), так что это может быть в вашем шаблоне Hugo.

Ответ №2:

Я бы подошел к этому примерно так:

 .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; , как это было в вашем коде раньше.

Чтобы добавить некоторый интервал, я бы просто заключил запись в другой элемент и просто добавил немного отступов. Это вдохновлено BulmaCSS.

Однако, поскольку вы действительно пытаетесь создать сетку, вы можете также использовать display: grid , поскольку она предназначена для подобных случаев использования.

Комментарии:

1. Спасибо за ваш ответ! Я попробовал то, что вы сказали ( см. Здесь , И хотя они теперь находятся рядом, они собираются вместе без каких-либо дополнений (я тоже пытался добавить это).). Кроме того, это должна быть сетка из 3 столбцов, и, как вы можете видеть здесь , четвертый элемент не добавляется в строку ниже, а вместо этого создает новый столбец.

2. Я немного скорректировал ответ, чтобы он лучше соответствовал вашим потребностям. Тем не менее, вы действительно можете использовать display: grid .