Вертикальные разделители между блоками в адаптивной верстке

    При создании газетного макета часто требуется визуально разделить анонсы или колонки вертикальными линиями. Главная сложность - избежать появления рамок по краям контейнера. В этой статье разберём, как реализовать вертикальные разделители между блоками с помощью CSS, чтобы они отображались только между элементами, а не слева или справа от них.

    Проблема лишних рамок

    При использовании flexbox или css grid легко добавить границу к каждому элементу, но это неизбежно создаст рамку и у крайних блоков. Например, если задать border-right всем элементам, то у последнего блока в строке тоже появится линия. Это не соответствует газетному стилю, где линии нужны только между колонками.

    Пример неправильного поведения:

    • | статья | статья | статья | - лишняя рамка слева и справа
    • статья | статья | - если блоков два, рамка справа у второго не нужна

    Решение на Flexbox с использованием псевдоэлементов

    Один из самых гибких способов - добавить вертикальные разделители через псевдоэлемент ::after или ::before и управлять их отображением с помощью медиа-запросов.

    Пример кода:

    .grid {
      display: flex;
      flex-wrap: wrap;
    }
    
    .item {
      position: relative;
      padding: 0 15px;
    }
    
    .item::after {
      content: '';
      position: absolute;
      right: 0;
      top: 10%;
      height: 80%;
      width: 1px;
      background: #333;
    }
    
    .item:last-child::after {
      display: none;
    }

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

    Решение на CSS Grid

    Для сетки на Grid можно использовать свойство column-gap в сочетании с фоновым изображением или псевдоэлементом контейнера. Однако проще всего - добавить разделители через border и сбросить его для первого элемента с помощью :first-child.

    Пример:

    .grid {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    }
    
    .item {
      border-left: 1px solid #ccc;
      padding: 10px;
    }
    
    .item:first-child {
      border-left: none;
    }

    Здесь вертикальная черта появляется слева от каждого блока, кроме первого. При адаптивной верстке на мобильных устройствах можно скрыть разделители полностью, изменив медиа-запрос.

    Адаптивность и медиа-запросы

    Чтобы разделители колонок корректно работали на разных экранах, важно учитывать перенос строк. При использовании flex-wrap псевдоэлементы будут работать корректно: линия исчезнет у последнего элемента в каждой строке, если использовать :last-child. Однако если строки переносятся, последний элемент в строке может не быть последним в списке. В таких случаях лучше использовать nth-child с учетом количества элементов в строке.

    Пример для 4 колонок:

    .item:nth-child(4n)::after {
      display: none;
    }

    Это скроет разделитель у каждого четвертого элемента, что идеально для сетки из 4 колонок.

    Почему не стоит использовать JS

    Хотя задачу можно решить и с помощью JavaScript, добавляя классы или стили динамически, это избыточно. CSS-решения более производительны и проще в поддержке. Адаптивная верстка с вертикальными линиями на чистом CSS - лучший выбор для газетных макетов.

    Заключение

    Используя псевдоэлементы или границы с условиями :first-child/:last-child, вы легко создадите правильные вертикальные разделители между блоками. Эти методы работают как с Flexbox, так и с Grid, и легко адаптируются под любые разрешения экрана.

    Часто задаваемые вопросы