Статьи

Представляем sGrid: систему Flexbox Grid на основе стилуса

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

По сути, существует множество сеток, и многие из них также являются сетками флексбоксов. Так почему я построил еще один похожий инструмент? Краткий и лучший ответ заключается в том, что этот инструмент выполняет одно и только одно — он отвечает за построение сетки flexbox семантическим подходом только с препроцессором Stylus .

Это именно то, что мне было нужно. Это чистый и легкий инструмент без каких-либо зависимостей, поэтому вы можете использовать его со многими другими инструментами и средами JavaScript. Также важно то, что это стандартный пакет npm, который важен для меня, потому что я обычно работаю в стеке JavaScript. Я уверен, что вы найдете это полезным в вашем рабочем процессе Stylus.

Что такое sGrid?

sGrid — это сеточная система flexbox для Stylus. Он основан только на 3 файлах .styl Все это упаковано в одну простую и маленькую упаковку npm .

Это стандартный пакет npm, так что вы можете использовать его с чем угодно — с командной строкой, со стеком сборки Grunt или Gulp или даже с платформой Meteor JavaScript . Это зависит от вас, все зависит от вашего рабочего процесса выбора.

Запуск примера проекта с sGrid

Чтобы представить sGrid, давайте начнем с простого и простого примера. Нам понадобятся файл .html.styl Я предполагаю, что у вас установлен стилус. Если нет, вам следует установить его глобально с npm install -g stylus

Сначала давайте создадим папку и назовем ее s-grid Внутри мы создадим файл index.html и файл main.styl. Наш файл index.html начнется с базового HTML-шаблона со ссылкой на main.css, наш CSS-файл. Чтобы скомпилировать файл main.css, нам нужно создать файл main.styl. Давайте создадим его в той же папке. На данный момент он может быть пустым.

Далее нам нужно установить саму sGrid, а также установить плагин autoprefixer-stylus. Это связано с тем, что в нашем файле main.css нам нужны некоторые префиксы поставщиков на основе flexbox.

Для этого мы введем в наш терминал следующее:

 npm install -g s-grid autoprefixer-stylus

После того, как все установлено, мы можем импортировать файлы sGrid в файл main.styl. Просто откройте main.styl и вставьте следующий код:

 @import 's-grid-settings'
@import 's-grid-functions'
@import 's-grid-classes'

Мы сохраним файл и из каталога s-grid После этого должен быть создан файл main.css. Внутри папки s-grid

 stylus -u s-grid -u autoprefixer-stylus --with "{ browsers: ['last 2 versions'] }" -w main.styl

При этом мы сказали Stylus, что он должен смотреть файл main.styl, перекомпилировать файл main.css, и он должен использовать Autoprefixer только для последних 2 версий браузеров. Конечно, он также должен использовать s-grid.

Эта последняя команда довольно длинная, но это только для демонстрационных целей. Обычно для такого рода вещей вы используете рабочий процесс приложения Node или систему сборки. Вы можете проверить параметры в документации sGrid .

Как видите, файл main.css подготовлен и заполнен небольшим количеством CSS. Это потому, что мы импортировали s-grid-классы , которые представляют собой готовый набор адаптивных классов. Этот импорт не является обязательным. Когда вы закомментируете это или удалите его из файла main.styl, вы увидите, что main.css пуст. Это хорошо, потому что мы не сможем использовать вспомогательные классы, но мы все равно можем подготовить свои собственные классы, используя функции sGrid. Так зачем нам эти классы? Они полезны для быстрого создания прототипов, аналогичны тем, что используются в Bootstrap и Foundation, поэтому разработчики, знакомые с этими библиотеками, привыкнут к ним с самого начала. Конечно, вам не нужно их использовать; на самом деле это даже лучше не делать.

Создание макета с помощью sGrid

Чтобы создать несколько примеров, использующих sGrid, мы напишем тот же код, используя только функции sGrid (семантический подход), а также используя вспомогательные классы. Поэтому мы не будем комментировать или удалять импорт s-grid-classes

Давайте сосредоточимся на некоторой базовой структуре. Для этого примера мы хотим иметь простой центрированный контейнер с максимальной шириной 500 пикселей. Внутри мы хотим две равные, но отзывчивые колонки. В файле index.html в теге body

 <div class="my-grid">
  <div class="my-cell">First cell</div>
  <div class="my-cell">Second cell</div>
</div>

Давайте также добавим немного стиля. В файле main.style

 .my-grid
  background-color #E9E9EA
  margin-top rem-calc(100)
  center(500)
  grid()
  .my-cell
    stack()
    padding rem-calc(10)
    background-color #D5D5D7
    @media screen and (min-width: rem-calc(breakpoints[md]))
      cell(1, 2)

Если вы все еще смотрите файл main.styl, ваш файл main.css должен обновиться, и вы сможете открыть файл index.html в своем браузере. Вы должны увидеть нечто похожее на демонстрацию CodePen ниже:

Функции sGrid

Как вы можете видеть в демонстрации, я использовал некоторые функции Stylus, которые объявлены в файле s-grid-functions . Давайте посмотрим на эти функции:

центр()
Эта функция отвечает за центрирование основного контейнера. Вы можете передать ширину как атрибут. Вы можете передать его в px (с суффиксом или без).

бэр ()
Эта функция будет вычислять единицы измерения rem из пикселей, которые вы передаете. Она основана на переменной base-font-sizes-grid-settings.styl . Конечно, вы можете перезаписать его в файле main.styl; просто поместите его после импорта s-grid-settingss-grid-functions

сетка (direction = ‘row’, cell-align = ‘top’, justify = »)
Это основная функция sGrid. Это должно быть применено к основной обертке сетки. Вы можете передать ему много атрибутов, таких как:

  • направление:
    • ‘row’ (по умолчанию) — направление ячейки слева направо
    • ‘row-reverse’ — направление ячейки справа налево
    • ‘column’ — направление ячейки сверху вниз
    • ‘column-reverse’ — направление ячейки снизу вверх
  • Выравнивание ячеек (работает только с ‘row’ и ‘row-reverse’)
    • ‘верх’
    • ‘дно’
    • ‘центр’
    • ‘протяжение’
  • обосновывать
    • ‘start’ — выравнивание всего содержимого слева или сверху
    • ‘end’ — выравнивать все содержимое справа или снизу
    • ‘center’ — оправдать весь контент-центр

ячейка (i = 1, столбцы = столбцы, выравнивание = », g = желоб)
Это основная функция sGrid, применяемая ко всем ячейкам сетки. Вы можете передать ему такие атрибуты, как:

  • i / cols — дробь, поэтому cell(1, 2)
  • Выровнять — вы можете выровнять отдельные ячейки по вертикали, используя значения «top», «bottom» или «center»
  • ж — желоб

Стек ()
Это функция укладки. Это оболочка для cell(1, 1)

Как уже упоминалось, вы можете найти более подробную информацию и примеры использования в документации sGrid .

Отзывчивые особенности sGrid

Когда вы просматриваете скомпилированный CSS-код в демоверсии CodePen, вы заметите использование медиа-запросов. Это мобильный первый подход. Когда область просмотра больше, чем переменная breakpoints[md] В противном случае это два ряда, один за другим.

Так что же такое breakpoints[md] Это глобальная переменная из файла s-grid-settings , внутри которой определены точки останова по умолчанию и которую вы можете перезаписать.

Использование вспомогательных классов sGrid

Давайте посмотрим, как мы можем построить тот же пример, используя вспомогательные классы sGrid. Если нам нужно использовать вспомогательные классы, мы можем заменить код тела в файле index.html чем-то вроде следующего:

 <div class="my-grid s-grid-top">
  <div class="my-cell s-grid-cell s-grid-cell-sm-12 s-grid-cell-md-6">
    First cell
  </div>
  <div class="my-cell s-grid-cell s-grid-cell-sm-12 s-grid-cell-md-6">
    Second cell
  </div>
</div>

А в файле main.styl мы можем использовать только функцию center() Все остальные вещи, которые мы добавили, могут быть удалены. Итоговый код будет таким:

 .my-grid
  background-color #E9E9EA
  margin-top rem-calc(100)
  center(500)
  .my-cell
    padding rem-calc(10)
    background-color #D5D5D7

Как вы можете видеть с этим подходом, у нас есть намного более сложная структура HTML, но нам не нужно использовать функции в файле Stylus. Эффект одинаков в обоих случаях, что можно подтвердить, открыв файл index.html в браузере.

Мы могли бы также написать это по-другому. Мы можем использовать стиль сетки блока здесь. Вместо использования вспомогательных классов для отдельных ячеек мы можем сделать это глобально, как показано ниже:

 <div class="my-grid s-grid-top s-grid-sm-12 s-grid-md-6">
  <div class="s-grid-cell my-cell">First cell</div>
  <div class="s-grid-cell my-cell">Second cell</div>
</div>

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

Изменение вертикального выравнивания ячеек

Следующий пример покажет, как легко мы можем изменить вертикальное выравнивание ячеек. Давайте подготовим наш файл index.html и main.styl. body

 <div class="my-grid">
  <div class="label">
    <strong>Vertical Top</strong>
  </div>
  <div class="my-cell-1">
    First cell
  </div>
  <div class="my-cell-2 top">
    Second cell
  </div>
</div>
<div class="my-grid">
  <div class="label">
    <strong>Vertical Center</strong>
  </div>
  <div class="my-cell-1">
    First cell
  </div>
  <div class="my-cell-2 middle">
    Second cell
  </div>
</div>
<div class="my-grid">
  <div class="label">
    <strong>Vertical Bottom</strong>
  </div>
  <div class="my-cell-1">
    First cell
  </div>
  <div class="my-cell-2 bottom">
    Second cell
  </div>
</div>

И наш файл main.styl будет иметь следующий код:

 @import 's-grid-settings'
@import 's-grid-functions'
@import 's-grid-classes'

.my-grid
  background-color #E9E9EA
  margin-top rem-calc(100)
  center(500)
  grid()
  .label
    stack()
    text-align center
  .my-cell-1, .my-cell-2
    stack()
    padding rem-calc(10)
    background-color #D5D5D7
  @media screen and (min-width: rem-calc(breakpoints[md]))
    .my-cell-1
      height rem-calc(300)
      cell(2, 3)
    .my-cell-2
      &.top
        cell(1, 3, align: 'top')
      &.middle
        cell(1, 3, align: 'center')
      &.bottom
        cell(1, 3, align: 'bottom')

Теперь, когда мы перекомпилируем наш файл main.css и запустим index.html в браузере, мы увидим, как выравнивается вторая ячейка во всех трех случаях. В основном вы используете атрибут align Вы заметите, что первая ячейка также шире. Это потому, что мы установили его на 2/3, а второй на 1/3. Первый имеет статическую высоту, объявленную только для демонстрационных целей.

Вы можете поиграть с этим примером на CodePen в демоверсии ниже:

И просто для примера, вот еще один пример макета с использованием sGrid: это одностраничный макет с полноэкранным покрытием . Посмотрите на отзывчивость тоже.

Когда не использовать sGrid

sGrid подходит не для каждого случая использования, а иногда быстрее и лучше использовать стандартную встроенную реализацию flexbox. sGrid — это инструмент, который обеспечивает быстрый способ создания адаптивных сеток, но многие пользовательские сценарии могут быть реализованы в несколько строк без sGrid и только с flexbox. Конечно, sGrid полезен, если вы еще не знакомы с flexbox, поскольку он предоставляет удобную абстракцию поверх flexbox.

Вы также должны помнить о поддержке браузера. Flexbox поддерживается новейшими браузерами, поэтому если вы хотите поддерживать более старые версии IE, вам не следует использовать sGrid. Также есть проблемы с flexbox на IE11, которые можно исправить. Репозиторий Flexbox от Филиппа Уолтона полезен для понимания его проблем.

Заключительные слова

Я надеюсь, вы найдете sGrid полезным. Это, конечно, только введение. Вы можете найти sGrid в некоторых классных инструментах, таких как шаблон React, шаблон Grunt с Assemble и другие задачи. Также есть пакет Meteor .

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