Factor and Block CSS — методология CSS
Hello, Developers!! Сегодня я расскажу о новой методологии для CSS, которая поможет вам сэкономить время на чтение и редактирование CSS-файлов. Методологию я придумал сам, если будут какие-то идеи, как улучшить её, буду рад обсудить это с вами в комментариях. Давайте же начнем.
Что такое FBCSS, и зачем он нужен ?
FBCSS (Factor and Block CSS) - методология, представляющая собой разделение css-свойств по факторам (каким-то отличительным признакам) и блокам (кускам кода).
Методология разрабатывалась для улучшения читабельности CSS кода. Думаю, ни для кого не секрет, что в CSS-файлах число строк может пробивать отметку в 1000. Представьте, что вам на работе доверили работать с этим CSS-файлом, вы заходите в файл и видите "месево" из символов... Жутко работать с таким, правда ? Некоторые могут сказать, что не всегда все так плохо и не всегда CSS-файл - "каша" символов. И они будут правы, не всегда, но даже если какая-то минимальная стилистика в написании кода и соблюдается, то поискнужных элементов или ни как не отсортированные свойства могут затруднить работу.
Цели, стоящии при создании FBCSS
Я считаю, что методологии в HTML и CSS должны быть понятны и ребенку с полуслова. Читабельный код - залог здоровых глаз senior-разработчика. Когда вы отпровляете на review нечитабельный код, где-то со стула падает один senior. Новичок - человек, который не особо думает о том, насколько его код чистый и читабельный, перед ним просто стоит другая цель - научиться программировать (и я не только о написании кода). Если вы опытный разработчик, то вспомните, что вас волновало больше, когда вы начинали программировать: написать читабельный и красивый код или разобраться в том, как работает то, что вы только что изучили ? Я отношусь ко вторым, думаю, и ты мой дорогой читатель тоже. Проста методологии, по мои предположениям, должна заставить новичков изучить её и применять на практике.
Также, я хотел, чтобы можно было одновременно использоватьи FBCSS и BEM. BEM - одна из крупных (если не самая крупная) методология, применяемая в HTML и CSS, и связка FBCSS и BEM могла бы стать основой, на которой зиждятся многие сайты мира. Так как стоит задача дать возможность интегрировать BEM, то нельзы трогать названия селекторов элементов. Врочем, в этом нет необходимости. FBCSS - о структуре CSS-файла, а не о корректных названиях для элементов.
Ну и последняя цель - сделать код многих новичков более читабельной. Я считаю, что это самая сложная цель, поставленная в рамках создания методологии.
Подведем итог, цели FBCSS:
Создание простой методологии для CSS
Дать возможность интеграции с BEM
Сделать код многих новичков чище
Основные понятия в FBCSS
Перед тем как погружать с головой в практические примеры и способы применения нужно разобраться с терминологией.
Как уже и было сказано ранее, код в FBCSS разделяется по принципу факторов и блоков.
Факторы (Factors) - типы свойств, характеризующих элементы. Звучит запутанно, но приведу пример:
Пусть у нас есть некий элемент с классом container, какие у него могут быть стили ? Назначим ему ширину, высоту, внутренние и внешние отступы, обводку и несколько flexbox-свойств.
Как можно написать код, не пользуясь FBCSS:
.container {
width: 300px;
height: 200px;
padding: 50px;
display: flex;
flex-direction: column;
border: 1px solid #cdcdccd;
row-gap: 30px;
margin: 30px;
}
Согласитесь, выглядит довольно громоздно.
Как можно написать этот же код, пользуясь FBCSS:
.container {
width: 300px;
height: 200px;
border: 1px solid #cdcdccd;
margin: 30px;
padding: 50px;
display: flex;
flex-direction: column;
row-gap: 30px;
}
Уже лучше, правда ?
Как вы видите, я разделил список всех стилей на несколько кусков, используя enter. Я разбил по принципу факторов. Возьмем, к примеру, первый кусок. Это форм-фактор - факторы, влияющие на внешний вид элемента. Сюда относяться все факторы, которые могут быть применены ко всем элементам (например, color не относиться к форм-факторм, потому что может быть применён только к текстовой информации, в отличии от width или height).
FBCSS включает в себя такие типы факторов как:
webkit-фактор - css-свойства, начинающиеся на -webkit. Они не подразделяются на отдельный факторы, в отличии от других свойств, так как их разделение уменьшит читабельность
shape-фактор - css-свойства, визуально изменяющие элемент (важно, сюда относяться все свойства, которые могут быть применены к любому элементу)
display-фактор - css-свойста,относящиеся к конкретным значениям одноименного свойства display (например, row-gap, grid-template-columns, flex-wrap)
position-фактор - css-свойства, которые изменяют положение элемента в пространстве по осям OX и OY (например, position, top, left)
specific-фактор - css-свойства, относящиеся к отжельным элементам или типам элементов (к примеру, color, font-size, text-stroke)
indent-фактор - отступы (padding, margin)
other-факторы - все другие свойства, которые сложно отнести к какой-либо из вышеупомянутых категорий или сложно сгруппировать в одну новую (например, z-index)
С типами факторов мы познакомились, то и это ещё не все, у них есть "приоритетность" - порядок, в котором их стоит писать. Очередность выглядит так (первый фактор нужно указывать в качестве первого куска кода, последний - последнего):
position-фактор
display-фактор
shape-фактор
specific-фактор
indent-фактор
other-фактр
webkit-фактор
Порядок обусловен несколькими вещами: привычкой большенства и линеного чтения информации. Писать слово positoin в начале стилей к элементу - традиция любого верстальщика, и, чтобы не нарушать обычай, я решил поставить этот фактор на первое место. Дальше распредеоение идет согласно линейному чтения. Сначало мы указываем display-факторы, тем самым размещая элементы в нужном порядке, затем придем им form-факоры, которые создают некий "шаблон", назначаем свойста, присущие только конкретным элементам, завершая визуальные изменения (это specific-фактор), проставляем отступы между элементами (приоритет при загрузке стилей отдается внешнему оформлению, а не отсутупам, и, если у пользователя плохое соединение, сначала он увидит то, как выглядит элемент, а не отступы, что, безусловно, гараздо более важно). На последок я оставил свойства, не относящиеся к остальным категориям, так как приоритет их загрузки (не всегда, иногда бывает наоборот) гараздо меньше, чем у факторов, чтоящих выше в списке. И в самом нижу табоицы-приоритетов располагается webkit-фактор. Это свойства, обеспечивающие кроссбраузерность сайта, но они располагаются в конце, так как большенство ствойств адаптивны даже под самые старый браузеры и очень редко используются webkit-факторы (на своей практике не встречал ещё).
С факторами закончим. Теперь очередь блоков.
Блок (Blocks) - кусок кода, отделенный от остальной части CSS-файла по принципу "модульности". Иными словами каждый блок отвечает за что-то свое.
Приведу пример, у нас есть верства, к которой сделали адаптив. Какие же блоки можно выделить ?
/* Верства начало */
.container {
position: absolute;
top: 100px;
left: 50px;
display: flex;
column-gap: 30px;
justify-content: center;
width: 100%;
}
/* Верства конец*/
/* Адаптив начало */
@media (max-width: 1440px) {
...
}
@media (max-width: 1280px) {
...
}
/* Адаптив конец */
В данном примере у нас всего 2 блока - Верстка и Адаптив. Не зря я назвал принцип разделения модульность. Каждый блок выполняет что-то своё и его лего можно перенести в отдельный файл без создания трудностей в прочтении/редактировании.
FBCSS предусматривает следующие типы блоков (располагать аналогично с факторами):
блок root - блок включает в себя псевдокласс :root
блок основных элементов - стили для тега html, body
блок переиспользуемых элементов - элементы, которые используются в разметке множество раз (тут и начинается интеграция с BEM)
блок анимций - сюда входят селектры, созданные для назначения анимации а также сами анимации
блок версти
блок адаптива
Практическое использование FBCSS
Давайте для закрепления материала сверстаем такой блок:
Для этого нам нужно написать html-разметку:
<div class="learn__plane-container">
<div class="learn__plane-item">
<p class="learn__item-num">01</p>
<p class="learn__item-description">Use HDFS Map Reduce for storing analyzing data at scale.</p>
</div>
<div class="learn__plane-item">
<p class="learn__item-num">02</p>
<p class="learn__item-description">Consume streaming data using Spark Streaming, Flink, and Storm.</p>
</div>
<div class="learn__plane-item">
<p class="learn__item-num">03</p>
<p class="learn__item-description">Choose an appropriate data storage technology for your application</p>
</div>
<div class="learn__plane-item">
<p class="learn__item-num">04</p>
<p class="learn__item-description">Analyze non-relational data using HBase, Cassandra, and MongoDB.</p>
</div>
</div>
Разметка базовая, у нас есть контейнер, а внутри 4 элемента с одинакой структурой.
Перейдем к самой интересной части, CSS
.learn__plane-container {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 30px;
width: 630px;
}
.learn__plane-item {
display: flex;
flex-direction: column;
row-gap: 30px;
width: 300px;
height: 270px;
background-color: #F4F8FF; /* есть у большинства элементов */
padding: 30px;
}
.learn__item-num {
display: flex;
align-items: center;
justify-content: center;
width: 50px;
height: 50px;
background-color: #FFCA42;
border-radius: 50%;
font-size: 24px; /* specific-фактор */
}
.learn__item-description {
font-size: 24px;
padding-right: 15px; /* indent-фактор */
}
CSS тоже довольно простой, все выравнивания происходят с помощью grid и flex. Можно было сверстать и по другому, но я хотел осветить как можно больше форм-факторов в практическом примере, так как в отличии от блоков (обсуждаются как модули или как блоки), тема не оглашается на массы.
Ссылка на CodePen с кодом из практического примера: https://codepen.io/SmrtVrst/pen/zYQPrOZ
Спасибо за внимаение, на этом все. Распространяйте статью и спасите глаза senior-разработчиков.