Контейнер

Для выравнивания содержимого на странице

Часто в макетах необходимо чтобы один из столбцов выходил за границы контейнера (до края страницы).

<div class="container-grid">
    <p>Этот контейнер займет обычную максимальную ширину</p>
</div>

<div class="container-grid">
    <p class="container-grid__fw">
        Этот контейнер займет всю ширину экрана
    </p>
</div>

<div class="container-grid">
    <div class="container-grid__fw-right">
      <p>Не выйдет за контейнер</p>
      <p>Этот контейнер займет всю ширину экрана только справа</p>  
    </div>
</div>

<div class="container-grid">
    <div class="container-grid__fw-left">
      <p>Этот контейнер займет всю ширину экрана только слева</p>  
      <p>Не выйдет за контейнер</p>
    </div>
</div>

При создании контейнера c блоками, которые должны выходить за ширину обязательно необходимо создавать два потомка

Параметры

--maxWidth - максимальная ширина контейнера

--padding-inline - определяет минимальную ширину отступа от экрана (px или em)

--fw-column-size - задается размер столбца, который растягивается на весь экран (в единицах, напр. 50 - что означает, что блок займет 50% контейнера + растянится за контейнер на выбранную сторону (задается классом))

--wrap-column-size - определяет размер колонки при котором будет перемещение потомков из плоскости "строка" в плоскость "столбец". Это необходимо для мобильный версий.

.container-grid {
   // justify-items: center - не дает содержимому расстягиваться на всю допустимую ширину
  --padding-inline: 16px;
  --fw-column-size: 60;
  --wrap-column-size: 300px; // Этот размер подобран таким образом, чтобы при брейкпоинте 576 и соотнешении колонок 50-50 был переход с двух колонок в ряд в две колонки в столбец

  display: grid;
  grid-template-columns:
   [full-start]
   0px
   
   [left-start]
   minmax(var(--padding-inline), 1fr)

   [right-start]
   0px
   
   [content-start] 
   min(100% - (var(--padding-inline) * 2), var(--maxWidth))
   [content-end]

   0px
   [left-end]
    
   minmax(var(--padding-inline), 1fr) 
   [right-end]

   0px
   [full-end] ;

   & > * {
      grid-column: content;
   }

   & > &__fw {
      grid-column: full;
   }

   & > &__fw-left, 
   & > &__fw-right {
      display: flex;
      flex-wrap: wrap;

   }

   & > &__fw-left {
      grid-column-start: 1;
   }

   & > &__fw-right {
      grid-column-end: none;
   }
   
   & > &__fw-left > *:last-child,
   & > &__fw-right > *:first-child {
      min-width: var(--wrap-column-size);
      flex-grow: 1;
      flex-shrink: 1;
   }

   & > &__fw-left > *:last-child,
   & > &__fw-right > *:first-child {
      flex-basis: calc(min((100% - var(--padding-inline)), var(--maxWidth)) * (1 - var(--fw-column-size)/100));
   } 

   & > &__fw-left > *:first-child, 
   & > &__fw-right > *:last-child {
      flex-grow: 1000000;
      min-width: calc((var(--wrap-column-size) / (1 - var(--fw-column-size)/100)) - var(--wrap-column-size) + var(--padding-inline));
   }
}

Last updated