$screen-xs: 0 !default; $screen-sm: 480px !default; $screen-md: 768px !default; $screen-lg: 992px !default; $screen-xl: 1200px !default; $screen-xxl: 1800px !default; $container-sm: 100% !default; $container-md: 100% !default; $container-lg: ($screen-lg - 30) !default; $container-xl: ($screen-xl - 30) !default; $container-xxl: ($screen-xxl - 30) !default; $grid-columns: 12 !default; $grid-gutter-width: 30px !default; //------------------------------------------------------------------------------ // Генератор правил для контейнера //------------------------------------------------------------------------------ @mixin container ( $xs-grid-gutter: $grid-gutter-width, $sm-grid-gutter: $grid-gutter-width, $md-grid-gutter: $grid-gutter-width, $lg-grid-gutter: $grid-gutter-width, $xl-grid-gutter: $grid-gutter-width, $xxl-grid-gutter: $grid-gutter-width ) { display: block; width: 100%; margin-left: auto; margin-right: auto; @if ($xs-grid-gutter != 0) { padding-left: ($xs-grid-gutter / 2); padding-right: ($xs-grid-gutter / 2); } @media (min-width: $screen-sm) { width: $container-sm; @if ($sm-grid-gutter != $xs-grid-gutter) { padding-left: ($sm-grid-gutter / 2); padding-right: ($sm-grid-gutter / 2); } } @media (min-width: $screen-md) { width: $container-md; @if ($md-grid-gutter != $sm-grid-gutter) { padding-left: ($md-grid-gutter / 2); padding-right: ($md-grid-gutter / 2); } } @media (min-width: $screen-lg) { width: $container-lg; @if ($lg-grid-gutter != $md-grid-gutter) { padding-left: ($lg-grid-gutter / 2); padding-right: ($lg-grid-gutter / 2); } } @media (min-width: $screen-xl) { width: $container-xl; @if ($xl-grid-gutter != $lg-grid-gutter) { padding-left: ($xl-grid-gutter / 2); padding-right: ($xl-grid-gutter / 2); } } @media (min-width: $screen-xxl) { width: $container-xxl; @if ($xxl-grid-gutter != $xl-grid-gutter) { padding-left: ($xxl-grid-gutter / 2); padding-right: ($xxl-grid-gutter / 2); } } } //------------------------------------------------------------------------------ // Генератор правил для прямого родителя модульной сетки //------------------------------------------------------------------------------ // Принимает: По умолчанию: Пояснение: // $xs-grid-gutter: $grid-gutter-width промежуток между ячейками XS-сетки // $sm-grid-gutter: $grid-gutter-width промежуток между ячейками SM-сетки // $md-grid-gutter: $grid-gutter-width промежуток между ячейками MD-сетки // $lg-grid-gutter: $grid-gutter-width промежуток между ячейками LG-сетки // $xl-grid-gutter: $grid-gutter-width промежуток между ячейками XL-сетки // $xxl-grid-gutter: $grid-gutter-width промежуток между ячейками XXL-сетки //------------------------------------------------------------------------------ // Пример вызова: // .some-class { // @include row ( // $xs-grid-gutter: $grid-gutter-width, // отступ по умолчанию // $sm-grid-gutter: 0, // нет отступа // $md-grid-gutter: $grid-gutter-width // отступ по умолчанию // ); // } // // Идентичный вызов: // .some-class { // @include row ( $grid-gutter-width, 0, $grid-gutter-width ); // } //------------------------------------------------------------------------------ @mixin row ( $xs-grid-gutter: $grid-gutter-width, $sm-grid-gutter: $grid-gutter-width, $md-grid-gutter: $grid-gutter-width, $lg-grid-gutter: $grid-gutter-width, $xl-grid-gutter: $grid-gutter-width, $xxl-grid-gutter: $grid-gutter-width ) { display: flex; flex-wrap: wrap; & > * { // stylelint-disable-line selector-combinator-blacklist, plugin/selector-bem-pattern flex-basis: 100%; } @if ($xs-grid-gutter != 0) { margin-left: ($xs-grid-gutter / -2); margin-right: ($xs-grid-gutter / -2); } @if ($sm-grid-gutter != $xs-grid-gutter) { @media (min-width: $screen-sm) { margin-left: ($sm-grid-gutter / -2); margin-right: ($sm-grid-gutter / -2); } } @if ($md-grid-gutter != $sm-grid-gutter) { @media (min-width: $screen-md) { margin-left: ($md-grid-gutter / -2); margin-right: ($md-grid-gutter / -2); } } @if ($lg-grid-gutter != $md-grid-gutter) { @media (min-width: $screen-lg) { margin-left: ($lg-grid-gutter / -2); margin-right: ($lg-grid-gutter / -2); } } @if ($xl-grid-gutter != $lg-grid-gutter) { @media (min-width: $screen-xl) { margin-left: ($xl-grid-gutter / -2); margin-right: ($xl-grid-gutter / -2); } } @if ($xxl-grid-gutter != $xl-grid-gutter) { @media (min-width: $screen-xxl) { margin-left: ($xxl-grid-gutter / -2); margin-right: ($xxl-grid-gutter / -2); } } } //------------------------------------------------------------------------------ // Генератор ширины ячейки //------------------------------------------------------------------------------ // Принимает: По умолчанию: Пояснение: // $column: 1 ширина (кол-во колонок в этой ячейке) // $columns: $grid-columns; количество ячеек в ряду // // Возвращает width. //------------------------------------------------------------------------------ @mixin get-width ($column: 1, $columns: $grid-columns) { $width: (100% / $columns) * $column; flex: 0 0 $width; max-width: $width; } //------------------------------------------------------------------------------ // Генератор правил для одной ячейки //------------------------------------------------------------------------------ // Принимает: По умолчанию: Пояснение: // $column: 1 ширина (кол-во колонок для этой ячейки) // $columns: $grid-columns; общее количество ячеек на 1 ряд // $gutter: $grid-gutter-width промежуток между ячейками //------------------------------------------------------------------------------ @mixin make-col ( $column: 1, $columns: $grid-columns, $gutter: $grid-gutter-width ) { @include get-width($column, $columns); // ВНИМАНИЕ! // если $gutter == false, в CSS не попадут правила padding-left и padding-right @if ($gutter != false) { padding-left: ($gutter / 2); padding-right: ($gutter / 2); } } //------------------------------------------------------------------------------ // Генератор правил для одной ячейки с возможностью указать @media //------------------------------------------------------------------------------ // Принимает: По умолчанию: Пояснение: // $screen: xs тип сетки [xs|sm|md|lg|xl|xxl] // $column: $grid-columns ширина (кол-во колонок для этой ячейки) // $columns: $grid-columns; общее количество ячеек на 1 ряд // $gutter: $grid-gutter-width промежуток между ячейками //------------------------------------------------------------------------------ @mixin col ( $screen: xs, $column: $grid-columns, $columns: $grid-columns, $gutter: $grid-gutter-width ) { @if ($screen == xs) { @include make-col($column, $columns, $gutter); } @if ($screen == sm) { @media (min-width: $screen-sm) { @include make-col($column, $columns, $gutter); } } @if ($screen == md) { @media (min-width: $screen-md) { @include make-col($column, $columns, $gutter); } } @if ($screen == lg) { @media (min-width: $screen-lg) { @include make-col($column, $columns, $gutter); } } @if ($screen == xl) { @media (min-width: $screen-xl) { @include make-col($column, $columns, $gutter); } } @if ($screen == xxl) { @media (min-width: $screen-xxl) { @include make-col($column, $columns, $gutter); } } } //------------------------------------------------------------------------------ // Генератор правил для отступа одной ячейки с возможностью указать @media //------------------------------------------------------------------------------ // Принимает: По умолчанию: Пояснение: // $screen: xs тип сетки [xs|sm|md|lg|xl|xxl] // $column: 1 ширина отступа (кол-во колонок) // $columns: $grid-columns; общее количество ячеек на 1 ряд //------------------------------------------------------------------------------ @mixin col-offset ( $screen: xs, $column: 1, $columns: $grid-columns ) { @if ($screen == xs) { margin-left: ($column * 100% / $columns); } @if ($screen == sm) { @media (min-width: $screen-sm) { margin-left: ($column * 100% / $columns); } } @if ($screen == md) { @media (min-width: $screen-md) { margin-left: ($column * 100% / $columns); } } @if ($screen == lg) { @media (min-width: $screen-lg) { margin-left: ($column * 100% / $columns); } } @if ($screen == xl) { @media (min-width: $screen-xl) { margin-left: ($column * 100% / $columns); } } @if ($screen == xxl) { @media (min-width: $screen-xxl) { margin-left: ($column * 100% / $columns); } } }