Перейти к содержимому

Как называть блоки в html

  • автор:

Ошибки именования в вёрстке

Ошибки именования в вёрстке главное изображение

Именование — сложная задача как для начинающих, так и для опытных разработчиков. Выбор правильного названия элемента — залог читабельной вёрстки, при которой она понятна при одном взгляде на классы. Неважно, что вы используете в работе: БЭМ, 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">
class="col col-md-3 pricing-items--red pricing-discount">
class="col col-md-3 pricing-items--blue">
class="col col-md-3 pricing-items--blue">
class="col col-md-3 pricing-items--red pricing-discount"> class="col col-md-3 pricing-items--blue">

Такой подход создаёт проблемы для разработчиков, которые будут поддерживать проект в будущем.

Вспомним, что регистр учитывается при создании классов. Использование единого подхода важно и здесь. Стараясь полностью описать класс, разработчик хочет указать как можно больше слов. В результате встречаются такие классы: .btnInOrderForm . Сам по себе такой подход возможен, хоть и не распространён в вёрстке. При этом важно соблюдать последовательность. Если вы используете верхний регистр, то и другие классы из нескольких слов должны следовать этому подходу.

Действие/вид/родитель

Большинство хороших именований описывают один из этих критериев. Вне зависимости от методологии, вы описываете что-то из этого списка:

 action="/">  class="btn-send">Отправить  
 action="/">  class="btn btn-blue">Отправить  
 action="/" class="order-form">  class="order-form__button">Отправить  

Изучайте вёрстку на Хекслете В рамках профессии «Верстальщик» мы познакомим вас с базовыми знаниями и принципами работы с HTML и CSS, расскажем о современных подходах и инструментах вёрстки, включая Flex, Grid, Sass, Bootstrap. Первые курсы в профессии можно пройти бесплатно. Регистрируйтесь и начинайте учиться!

Количество

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

 class="catalog-item">  class="item">  class="item">  class="item">  class="item">  class="item">  

Чем плоха эта вёрстка? Представьте, что вы смотрите в редакторе, при этом схлопнув вложенности. В этом случае вёрстка внутри редактора будет выглядеть следующим образом:

 class="catalog-item">. 

О чём можно подумать, увидев класс .catalog-item ? Скорее этот элемент отвечает за конкретную карточку товара, а не за группу товаров. Добавление множественного числа сразу решит эту проблему:

 class="catalog-items">. 

Теперь нет неоднозначности — класс чётко говорит о том, что внутри не один элемент, а группа элементов.

Вывод

БЭМ нейминг для 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 /* Модификатор для Элемента */

Основные понятия БЭМ нейминга

Блоки

Блок — это независимый самодостаточный элемент страницы. Простой тест на то можно ли определить элемент как блок. Блок можно вырвать с его места расположения на странице и разместить на абсолютно чистую страницу, при этом он не потеряет своей актуальности, будет понятно о чем он и какой контент в нем представлен, он не утратит своего смысла.

Классическим вариантом блока является карточка товара, карточка со статьей, отдельно секция с товаром или со статьей, шапка, подвал, и другие секции или целостные элементы страницы.

Имя для блока описывается одним или несколькими словами. Несколько слов в имени блока разделяются дефисом -.

Имя блока пишется строчными буквами, не имеет заглавных. В имени используются полные слова, без сокращений.

product_card productCard ProductCaRD s-products btnPrimary Card
product-card section-products header footer button card

Элементы

Элемент — это составная часть блока. Элемент является частью блока и находится внутри него.

Если мы рассмотрим блок карточки с товаром, то его внутренние составные части это и есть элементы данного блока. Например элементами карточки с товаром будут: заголовок карточки, цена, изображение товара, описание товара, кнопка покупки.

Элементы всегда принадлежать какому-либо блоку. Не бывает независимых элементов. Принадлежность элемента к блоку описывается двойным подчеркиванием __ . В имени элемента всегда вначале указывается имя блока к которому он принадлежит, далее после двойного подчеркивания идет имя элемента. block__element

Рассмотрим пример с элементами внутри карточки.

card-title cardPrice card_description card--button
card__title card__price card__description card__button

Модификаторы

Модификатор — это дополнительный класс который добавляется к 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 и.т.д. Но я знаю что это не правильно будет говнокод. Поэтому хотел бы узнать как вы называете блоки

1 комментарий

Простой 1 комментарий

SkiperX

Алекс Глебов @SkiperX Куратор тега CSS

да да
суровые имена программистов)
у блока есть смысл все равно
преимущества, клиенты, отзывы и тд
берешь гугл переводчик и переводишь
у элементов item link group cart и тд

слов которыми обзывают элементы не так много
бем помогает не повторяться, добавляя имя блока
если мало названия блока, можно привязать к названию страницы еще, main или inner
тогда точно хватит

Подскажите как правильно называть блоки при верстке, есть ли какие то стандарты?

1) Какие существуют компоненты (почва, платформы, API, SDK и т.п.)?! 2. Как правильно называть это ПО?!
Сразу 2 вoпpoca: 1) Какие существуют в наше время ещё компоненты, кроме указанных: • Microsoft .

Как правильно называть интерфейсы в Java
Здравствуйте! Как правильно именуются интерфейсы в Java. Допустим у меня есть класс Fish.

Как правильно называть некоторые термины?
Читаю статьи на разных сайтах по HTML 5 и не много запуталась. Например на Хабре font — называют.

Регистрация: 24.03.2016
Сообщений: 14
Denis Landar,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
Основные .wrapper - /*обвертка сайта*/ .hedader - /*верхняя часть сайта*/ .sidebar - /*сайдбар (левая или правая часть сайта)*/ .content - /*тело сайта (центральная часть)*/ .footer - /*нижнаяя часть сайта*/ Название блока (обвертка) .bl .block .box .wrap .inner .container .main Секции блока .head, .header - /*верхняя часть блока например заголовок*/ .cnt, .content, .body - /*тело блока например текс с картинкой*/ .footer - /*нижняя часть блока к примеру дата добавления, категория и т.д.*/ Колонки .column, .col - /*колонка*/ Списки .list .item Позиционные классы .top /* элемент сверху**/ .left /* элемент слева*float:left */ .right /* элемент справа*float:right */ .bottom /* элемент внизу**/ .center /* элемент отцвентрирован* margin:0 auto; */ .fixed - /*фиксированный элемент postion:fixed */ Переходы .next - /*следующий*/ .prev - /*предыдущий*/ .last - /*последний*/ .first - /*первый*/ .back - /*назад*/ .ahead - /*вперед*/ Чисельные .one .thwo .three .four .five Размеры .xs, .tiny - /*очень маленький*/ .s, .small - /*маленький*/ .md, .medium - /*средний */ .lg, .large, .big - /*большой */ .xl, .extra-large - /*очень большой*/ Цвета .danger - /*цвет опасности*/ .default - /*стандартный цвет*/ .warning, .error - /*цве ошибки*/ .success - /*цвет успеха (к примеру верно введн код подтвержления)*/ .primary - /*основной цвет */ Кнопки .button, .btn - /*кнопка*/ .loading - /*загрузка*/ .close - /*закрыть*/ .open - /*открыть*/ .touch - /*клик*/ .edit - /*редактировать*/ .more - /*больше*/ .remove - /*удалить*/ .logout - /*выход*/ .select - /*выбрать*/ .divider - /*выпадающийся список меню*/ .caret, .arrow - /*стрелочка*/ .up - /* Вверх**/ .down - /* Вниз**/ .delete - /* удалить**/ .reply - /*ответить*/ Персона .profile - /*профиль*/ .person - /*человек*/ .ava, .avatar - /*аватарка, картинка*/ .name - /*имя*/ .description - /*описание*/ .address - /*адресс*/ .nickname - /*ник*/ .birthday - /*дата рождения*/ .sex - /*пол*/ .author - /* автор**/ Заголовки .title - /*заголовок*/ .short-title - /*скороченный заголовок*/ .full-title - /*полный заголовок*/ Ссылки .link - /*ссылка*/ Текст .text, .txt, .paragraph - /*текст*/ .info, .information - /*информация*/ Картинки .image, .img - /*картинка*/ .icon, .ic - /*иконка*/ .bg - /*фоновая картинки или цвет*/ Формы .search, .form-search - /*поиск по сайту*/ .input - /*текстовый элемент*/ .form - /*форма*/ .form-group - /*группа элементов формы*/ .help-block - /*текст подсказки*/ .label - /*название элемента формы*/ Катагории .type - /*тип*/ .cat, .category - /*катигория*/ .subcat, .subcategory - /*подкатегория*/ .section - /*раздел*/ .subsection - /*подраздел*/ Видео .video .play - /*пуск*/ .stop - /*стоп*/ .pause - /*пауза*/ Социальные сети .social - /* социальные сети**/ .vk - /*вконтакте*/ .fb - /*фейсбук*/ .twit - /*твиттер*/ .inst - /*инстаграм */ Активные классы .none - /*скрытый элемент*/ .disabled - /*заблокированный*/ .active, .current - /*активный */ .selected - /*выбраный*/ .visible - /*видный элемент*/ .focus - /*нажатый*/ Временные классы .time - /*время*/ .date - /*дата*/ .day - /*день*/ .month - /*месяц*/ .year - /*год*/ Очистка .clear, .clearfix, .clr - /*очистка*/ Разделители .separator, .divide - /*разделитель вертикальный для слов */ .br, .line - /*разделитель горизонтальный для блоков*/ Остоньлые названия .logo - /*лого сайта*/ .new - /*новинка*/ .sale - /*распродажа*/ .feedback - /*обратная связь*/ .support - /*помощь */ .group - /*группа*/ .module - /*модуль*/ .posters - /*пост*/ .form - /*форма*/ .tabs - /*вкладки*/ .slider - /*слайдер*/ .news - /*новости*/ .table - /*таблица*/ .full - /*полный*/ .breadcrumbs - /*Хлебные крошки*/ .pagination, .pager - /*Нумерация страниц*/ .navbar, .nav, .menu, .navigation - /*Навигация (меню)*/ .dropdown - /*выпадающейся меню */ .comment - /*комментарий*/ .subscription - /* Подписка**/ .special - /* особенный элемент**/ .standard - /* стандартный элемент**/ .screens - /* Скрины**/ .rate - /* рейтинг**/ .online - /* онлайн**/ .panel - /* панель**/ .popup - /* попап**/ .version - /* версия**/ .page - /* страница**/ .banners - /* баннер**/ .map - /* Карта**/ .more - /*еще, подробнее*/ .tags - /* тег**/ .price - /* цена**/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *