Именование — сложная задача как для начинающих, так и для опытных разработчиков. Выбор правильного названия элемента — залог читабельной вёрстки, при которой она понятна при одном взгляде на классы. Неважно, что вы используете в работе: БЭМ, OOCSS, SMACSS, или не используете методологий вообще — выбирайте имя с умом.
Что же отличает хорошее именование от плохого? Идеально, если класс раскрывает суть блока. Если это компонент, то он должен быть назван так, чтобы по нему можно было понять, какую структуру он представляет. Если это класс с одним единственным стилем, который не привязан к компоненту, как это делается в Atomic CSS, такой класс должен полностью описывать свойство, которое используется.
Смысл
Это одна из самых частых ошибок в именовании. Встретив в HTML класс section-top , можно запутаться:
Это первая секция?
Это область заголовка внутри секции?
Это фиксированная секция?
Без изучения вёрстки и CSS узнать это невозможно.
Другая проблема: указание порядка нахождения секции в классе. Взгляните на пример:
class="section-one">class="section-two">
Сейчас всё расположено логично, проблем не будет. Но вот приходит заказчик и просит поменять секции местами. Теперь вёрстка выглядит так:
class="section-two">class="section-one">
Такое изменение изменило представление о том, как структурирована вёрстка. Если изменение месторасположения блока ломает логический порядок из-за названий классов, то стоит пересмотреть подход к именованию.
Опишите то, о чём секция, если в этом есть необходимость. Если секция содержит список цен, то класс pricing , pricing_section будет хорошим вариантом. Если стили этих классов совпадают, то имеет смысл создать отдельный класс, например container или section-wrapper .
Нотация
Разные подходы к написанию CSS породили разные варианты написания классов. Это могут быть:
button-blue
button_blue
button—blue
В CSS нет строгих правил именования, поэтому вы можете использовать любой вариант, который нравится. При этом некоторые разработчики используют разные типы именования в пределах одного проекта. По такому CSS гораздо труднее ориентироваться. Использование такого подхода по непонятным причинам распространено.
class="pricing">class="pricing-header-wrapper">class="pricing--header">Цены на наши услугиclass="pricing__element">class="pricing--items">
Найти логику такого построения невозможно. Она понятна только тому, кто эти классы создавал. Возможно, какие-то классы уже заняты в проекте, возможно, некоторые классы писал другой разработчик.
Проблема именования распространена при использовании фреймворков, например, Bootstrap. Используя привычное именование, верстальщик применяет стандартные компоненты фреймворка и не думает о том, чтобы привести именование к единому знаменателю.
class="container pricing">class="pricing__header">Цены на продукциюclass="row">class="col col-md-3 pricing-items--blue">
Такой подход создаёт проблемы для разработчиков, которые будут поддерживать проект в будущем.
Вспомним, что регистр учитывается при создании классов. Использование единого подхода важно и здесь. Стараясь полностью описать класс, разработчик хочет указать как можно больше слов. В результате встречаются такие классы: .btnInOrderForm . Сам по себе такой подход возможен, хоть и не распространён в вёрстке. При этом важно соблюдать последовательность. Если вы используете верхний регистр, то и другие классы из нескольких слов должны следовать этому подходу.
Действие/вид/родитель
Большинство хороших именований описывают один из этих критериев. Вне зависимости от методологии, вы описываете что-то из этого списка:
Действие. Часто классы, указывающие на действие применяются к элементам, с которыми можно взаимодействовать. Для кнопки в форме это может быть класс .btn-send , или класс slider-next для области переключения слайда.
action="/">class="btn-send">Отправить
Вид. Такие классы иногда называют «класс-модификатор». Их цель состоит в точечном изменении элемента. Это может быть визуальный вид, состояние или поведение. Такие классы не одиноки, они всегда являются надстройками над классами. Если основной класс .btn , то классами-модификаторами могут быть .btn-green , btn-disable , btn-big .
action="/">class="btn btn-blue">Отправить
Родитель. Элементы с такими классами явно описывают то, чьими потомками они являются. Если кнопка лежит в форме с классом order-form , то кнопка может иметь класс order-form__button
Изучайте вёрстку на Хекслете В рамках профессии «Верстальщик» мы познакомим вас с базовыми знаниями и принципами работы с HTML и CSS, расскажем о современных подходах и инструментах вёрстки, включая Flex, Grid, Sass, Bootstrap. Первые курсы в профессии можно пройти бесплатно. Регистрируйтесь и начинайте учиться!
Количество
Этот пункт интуитивно ясный, но редко выполняемый. Если обёртка подразумевает множество одинаковых элементов внутри, то стоит указать это в имени класса с помощью множественного числа.
Чем плоха эта вёрстка? Представьте, что вы смотрите в редакторе, при этом схлопнув вложенности. В этом случае вёрстка внутри редактора будет выглядеть следующим образом:
class="catalog-item">.
О чём можно подумать, увидев класс .catalog-item ? Скорее этот элемент отвечает за конкретную карточку товара, а не за группу товаров. Добавление множественного числа сразу решит эту проблему:
class="catalog-items">.
Теперь нет неоднозначности — класс чётко говорит о том, что внутри не один элемент, а группа элементов.
Вывод
Определяйте название класса исходя из того, что за элемент перед вами.
Не используйте абстрактные имена блоков, такие как .block , .block-1 , .block-top и так далее.
Используйте один подход к именованию внутри одного проекта.
БЭМ нейминг для HTML верстки сайтов
Если давать имена CSS классам не задумываясь, то вскоре можно обнаружить в проекте такие имена как text-1, text-2 и text-3. Или например button-1, button-2 и так далее. Чем больше растет проект и чем чаще в проекте встречаются похожие, но с небольшими различиями элементы, тем сложнее придумать им название так чтобы в названиях CSS классов можно было легко ориентироваться. БЭМ нейминг решает эту задачу.
Сразу отмечу что методология это рекомендации к тому как придумывать CSS имена. Нарушение методологии не приведет к технической ошибке, однако ухудшит читаемость вашего кода другими специалистами верстальщиками.
Идея БЭМ нейминга состоит в том чтобы с помощью имен CSS классов определить независимые блоки, обозначить их элементы и определить возможные модификации. Рассмотрим подробнее.
Примечание
В данной статье описывается альтернативный синтаксис БЭМ нейминга, который называется Two Dashes. Этот стиль визуально более выразителен и легче воспринимается для чтения. Описание стиля Two Dashes в официальной документации.
Правила формирования имен классов в БЭМ нейминге
Имена записываются латиницей в нижнем регистре.
В имени классов используются полные слова, без сокращений.
Для разделения слов в именах БЭМ-сущностей используется дефис (-).
Имя элемента отделяется от имени блока двумя подчеркиваниями (__).
Модификаторы отделяются от имения блока или элемента двумя дефисами (—).
Пример именования по БЭМ неймингу:
.block /* Блок */ .block__element /* Элемент */ .block--modifier /* Модификатор для Блока*/ .block__element--modifier /* Модификатор для Элемента */
Основные понятия БЭМ нейминга
Блоки
Блок — это независимый самодостаточный элемент страницы. Простой тест на то можно ли определить элемент как блок. Блок можно вырвать с его места расположения на странице и разместить на абсолютно чистую страницу, при этом он не потеряет своей актуальности, будет понятно о чем он и какой контент в нем представлен, он не утратит своего смысла.
Классическим вариантом блока является карточка товара, карточка со статьей, отдельно секция с товаром или со статьей, шапка, подвал, и другие секции или целостные элементы страницы.
Имя для блока описывается одним или несколькими словами. Несколько слов в имени блока разделяются дефисом -.
Имя блока пишется строчными буквами, не имеет заглавных. В имени используются полные слова, без сокращений.
Элемент — это составная часть блока. Элемент является частью блока и находится внутри него.
Если мы рассмотрим блок карточки с товаром, то его внутренние составные части это и есть элементы данного блока. Например элементами карточки с товаром будут: заголовок карточки, цена, изображение товара, описание товара, кнопка покупки.
Элементы всегда принадлежать какому-либо блоку. Не бывает независимых элементов. Принадлежность элемента к блоку описывается двойным подчеркиванием __ . В имени элемента всегда вначале указывается имя блока к которому он принадлежит, далее после двойного подчеркивания идет имя элемента. block__element
Модификатор — это дополнительный класс который добавляется к html тегу с блоком или элементом. Модификатор — модифицирует (изменяет) отображение блока на странице. Модификатор не может использоваться на теге отдельно от блока или элемента.
Имя класса модификатора содержит в себе имя блока или элемента для которого он создается, далее идет разделитель в виде двух дефисов —, и в конце имя модификатора.
Например у нас есть блок карточки товара card, и нужно сделать модификатор для карточки товара по распродаже, который будет менять ее фон. Имя такого модификатора будет следующее: card—sale
Давайте придумаем модификатор для элемента. Например в карточке товара есть его цена. Цена это элемент блока card и имеет класс card__price . Модификатором для такого элемента будет класс card__price—sale, в котором мы сначала повторяем имя элемента, далее после двойного дефиса указываем имя модификатора.
Неправильные имена модификаторов:
card_sale card-sale cardSale sale
Правильные имена модификаторов:
card--sale cart__price--sale
Использование модификаторов
Модификатор всегда применяется к блоку или элементу. Нельзя использовать на теге только модификатор, без класса блока или элемента.
Неправильное использование модификаторов:
12000 РУБ
Правильное использование модификаторов:
12000 РУБ
Выводы и пример разметки с БЭМ неймингом
Пример карточки с товаром. Блок — это карточка, её элементы это изображение, название, цена и ссылка «подробнее».
Apple Watch 12000 РУБ Подробнее
Пример карточки с товаром с модификатором. Модификатор sale установлен для блока карточки и для элемента с ценой.
Apple Watch 12000 РУБ Подробнее
Пример карточки с вложенными элементами. Зачастую вам могу потребоваться дополнительные обертки внутри блока. Они также будут являться его элементами. Важно помнить все элементы внутри блока принадлежат непосредственном этому блоку. Даже если они вложены друг в друга. Не бывает элементов от элементов. Элементы бывают только от блока.
Вложенность в БЭМ нейминге
Блоки. Блоки могут быть вложены друг в друга.
Элементы. Элемент который принадлежит к блоку может находится только в нем. Элемент не может находится за пределами блока к которому он принадлежит.
Элементы одного блока могут находится друг в друге. Элементы можно вкладывать друг в друга, потому как всегда могут понадобиться дополнительные обертки и структурные элементы.
Важно помнить, все элементы внутри блока принадлежат непосредственном этому блоку. Даже если они вложены друг в друга. Не бывает элементов от элементов! Элементы бывают только от блока.
Несмотря на то что price и read-more вложены в details, они все равно являются элементами от блока card.
Исключения
Зачастую кнопки определяют отдельными блоками. Идея в том что кнопка может присутствовать на разных страницах и в разных блоках страницы, поэтому для поддержания ее единых стилей, и избежания дублирования кода, чтобы не описывать одну и ту же кнопку как несколько элементов в разных блоках.
Когда в проекте есть дизайн система, то в блоки могут быть вынесены заголовки и другие элементы дизайн системы которые одинаковы на всех страницах. На первых порах изучения бем нейминга рекомендуем ограничиться вынесением в блоки только кнопок и одинаковых заголовков.
Пример кода с вынесением в блоки кнопок и заголовков.
Пример блока карточки товара. Кнопка — отдельный блок.
Apple Watch
12000 РУБ
Подробнее
Пример блока секции. Заголовок header — отдельный блок. Карточки card и пагинация pagination — также отдельные блоки.
Ссылки
Вы можете поделиться этой статьей в любой из соцсетей, представленных ниже:
Как правильно называть блоки div?
Может вопрос и глупый но все же. Допустим я открыл макет в psd начинаю разделять его на блоки так как не знаю англ языка начинается бред типа block 1 и.т.д. Но я знаю что это не правильно будет говнокод. Поэтому хотел бы узнать как вы называете блоки
Вопрос задан более трёх лет назад
7067 просмотров
1 комментарий
Простой 1 комментарий
Алекс Глебов @SkiperX Куратор тега CSS
да да суровые имена программистов) у блока есть смысл все равно преимущества, клиенты, отзывы и тд берешь гугл переводчик и переводишь у элементов item link group cart и тд
слов которыми обзывают элементы не так много бем помогает не повторяться, добавляя имя блока если мало названия блока, можно привязать к названию страницы еще, main или inner тогда точно хватит
Подскажите как правильно называть блоки при верстке, есть ли какие то стандарты?
1) Какие существуют компоненты (почва, платформы, API, SDK и т.п.)?! 2. Как правильно называть это ПО?! Сразу 2 вoпpoca: 1) Какие существуют в наше время ещё компоненты, кроме указанных: • Microsoft .
Как правильно называть интерфейсы в Java Здравствуйте! Как правильно именуются интерфейсы в Java. Допустим у меня есть класс Fish.
Как правильно называть некоторые термины? Читаю статьи на разных сайтах по HTML 5 и не много запуталась. Например на Хабре font — называют.