Как я могу иметь различное расположение столбцов и различные конструкции карт для моего индекса в bootstrap? - PullRequest
0 голосов
/ 15 января 2020

Я делаю грубый сайт, используя bootstrap и laravel. Мне нужна помощь в дизайне и верстке. Я показываю свои активы на странице индекса с использованием foreach, но я хотел бы показать его в виде 3 больших карточек с полной информацией о первом полном столбце и 5 маленьких карточек с меньшим количеством сведений во втором столбце.

Как мне поступить? Спасибо.

РЕДАКТИРОВАТЬ: Что-то вроде это . То, что у меня сейчас есть, похоже на первый столбец. Могу ли я сделать это только внутри одного foreach, чтобы он был динамическим c, и каждый добавленный новый актив отображался на 3 больших картах?

@foreach ($games as $game)
    <div class="col-4 mt-3 d-flex align-items-stretch">
        <div class="card landing-card">

            <img src='{{ asset("storage/$game->image_location") }}' class="img-fluid">

            <div class="card-body landing-card-body">
                <h4 class="card-title landing-card-title">{{ $game->title }}</h4>

                <p class="card-text landing-card-text">Summary: {{ $game->description }}</p>
                <p class="card-text landing-card-text">Genre: {{ $game->genre->name }}</p>
            </div>

            <div class="card-footer landing-card-footer btn-group btn-block">
                <form action='{{ url("/pending/$game->id/index" )}}'class="form-add-to-cart" data-id="{{ $game->id }}">
                    <div class="btn-group btn-block">
                        <button class="btn landing-card-button peach-gradient">Submit Request</button>
                    </div>
                </form>
            </div>

        </div>
    </div>
@endforeach

1 Ответ

0 голосов
/ 16 января 2020

Грид-система

Bootstrap Грид-система

Первое, что нужно знать: Bootstrap Грид-система использует 12 столбцов по умолчанию. Обычно мы стараемся соответствовать этому в наших проектах. Например:

  • 3 карты : каждая карта занимает 4 столбца
  • 2 карты : каждая карта получает 6 столбцов
  • 5 карт : каждая карта занимает 2,4 столбца ... Упс! Не точное число!

Вот почему на скриншоте, который вы разместили, вы можете увидеть небольшой разрыв с каждой стороны второго ряда. Ряд с 5 картами не соответствует верхнему ряду с 3 картами. Таким образом, у вас может быть тот же дизайн со второй строкой, подобной этой:

<div class='row'>
  <div class='col-1'><!-- This is just a space to help the math --></div>
  <div class='col-2'>Card 1</div>
  <div class='col-2'>Card 2</div>
  <div class='col-2'>Card 3</div>
  <div class='col-2'>Card 4</div>
  <div class='col-2'>Card 5</div>
  <div class='col-1'><!-- This is just a space to help the math --></div>
</div>

Посмотрите, как сумма столбцов равна 12?

Это до Flexbox .. .

Flexbox

Bootstrap 4 использует Flexbox, который является более гибким. Он по-прежнему имитирует сетку из 12 столбцов, поэтому вы не можете использовать Bootstrap классы по умолчанию (например: col-2) для достижения макета из 5 карт. Но вы можете создать свой собственный класс, используя flex-basis: 20% (100% / 5 = 20%).


Наконец, ваше решение

Используя один l oop

Чтобы использовать одну l oop, вы можете использовать $loop->index, чтобы проверить, делаете ли вы первые 3 карты или другие. Это может стать немного грязным, в зависимости от того, сколько «игр» у вас есть в ваших данных. И для этого вам нужно использовать Flexbox:

@foreach ($games as $game)
  @if($loop->index < 3) 
    <div class="col-4 mt-3 d-flex align-items-stretch">
        <div class="card landing-card">
            <img src='{{ asset("storage/$game->image_location") }}' class="img-fluid">
            <div class="card-body landing-card-body">
                <h4 class="card-title landing-card-title">{{ $game->title }}</h4>
                <p class="card-text landing-card-text">Summary: {{ $game->description }}</p>
                <p class="card-text landing-card-text">Genre: {{ $game->genre->name }}</p>
            </div>
            <div class="card-footer landing-card-footer btn-group btn-block">
                <form action='{{ url("/pending/$game->id/index" )}}'class="form-add-to-cart" data-id="{{ $game->id }}">
                    <div class="btn-group btn-block">
                        <button class="btn landing-card-button peach-gradient">Submit Request</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
  @else
    <div class="my-flex-class-with-20%">
      <img src='{{ asset("storage/$game->image_location") }}' class="img-fluid">
    </div>
  @endif
@endforeach

Использование нескольких циклов

Используя несколько циклов, вы можете получить либо тот же макет, который вы разместили, либо другие. Вам нужно разделить переменную $games на два массива. Один с первыми 3 «играми», а другой с остальными играми.

Ваш l oop в первом массиве будет аналогичен тому, который у вас уже есть, а ваш l oop в второй массив изменит классы CSS. В идеале, ваш второй массив должен быть массивом массивов, каждый из которых содержит количество игр, которое вы хотите. Это позволит вам каждый раз вставлять правильный row, что хорошо для вашего CSS.

Примерно так:

// Top row:
<div class='row'>
  @foreach ($first_3_games as $game)
    <div class="col-4">
      Your content here
    </div>
  @endforeach
</div>

// $other_games = [[game1, game2, game3, game4, game5], [game6, game7, game8, game9, game10]]

// This replicates the layout on your question:
@foreach ($other_games as $game_list)
  <div class='row'>
    <div class="col-1"></div>
    @foreach ($game_list as $game)
      <div class="col-2">
        Your content here
      </div>
    @endforeach
    <div class="col-1"></div>
  </div>
@endforeach

// This takes the whole space to match the top row with 3 games
@foreach ($other_games as $game_list)
  <div class='row'>
    @foreach ($game_list as $game)
      <div class="custom-flex-basis-20%-class">
        Your content here
      </div>
    @endforeach
  </div>
@endforeach

PS. Просто Небольшое уточнение по вашему вопросу: вы хотите 3 элемента в первой строке , а не колонка . Ряд горизонтальный, столбец вертикальный ?

...