Какие проблемы решает / Методология / БЭМ
Методология БЭМ задает правила по именованию CSS-селекторов, соблюдение которых решает ряд проблем веб-разработки и отвечает на следующие вопросы:
Как упростить код и облегчить рефакторинг
Как получить самодокументируемый код
Как начать повторно использовать код и избежать взаимного влияния компонентов друг на друга
Как разместить несколько сущностей на одном DOM-узле и избежать «Copy-Paste»
Как упростить код и облегчить рефакторинг
Проблема
При верстке проекта компоненты интерфейса получают имена на основе контекста, с которым работает разработчик. Обычно контекстом служит страница или какая-то ее часть.
Когда страницу верстает один разработчик в короткие сроки, коллизии имен можно избежать. Но если над проектом работают несколько человек или правки нужно внести спустя какое-то время, то отследить зависимые имена компонентов становится сложно. В больших проектах результатом правки одного класса может стать десяток «разъехавшихся» страниц.
Например, для создания навигационного меню могут использоваться следующие имена классов:
<ul> <li><a>One</a></li> <li><a>Two</a></li> <li><a>Three</a></li> </ul>
К ним могут быть написаны CSS-правила:
.item { padding: 4px 10px; color: black; } .active { font-weight: bold; background: #ffc7c7; }
Если понадобится добавить на страницу другой компонент, содержащий пункты, то стили для нового item
повлияют на пункты из существующего навигационного меню.
Или предположим, что в навигационном меню нужно изменить правила класса .active
. По имени непонятно, какие компоненты его используют. Может оказаться, что на другой странице существует, например, кнопка <div>Нажми меня!</div>
. Тогда изменение правил для . active
повлияет на стили этой кнопки.
Чтобы разобраться, можно ли безболезненно изменить стили для класса .active
, разработчику придется просмотреть всю структуру страницы или проекта. Любое изменение потребует значительных временных затрат только на поиск зависимых компонентов.
Решение
Методология БЭМ решает проблему коллизии имен при помощи соглашения по именованию CSS-классов, предоставляя всем компонентам и их составляющим уникальные имена.
Применение правил по именованию позволяет:
задавать уникальные имена БЭМ-сущностям;
отслеживать иерархические связи в пределах блока;
упрощать восприятие кода;
получать самодокументируемый код.
Рассмотрим тот же пример навигационного меню:
<ul> <li><a>One</a></li> <li><a>Two</a></li> <li><a>Three</a></li> </ul>
Но применим к нему правила именования БЭМ: класс nav
будет обозначать имя блока, nav__item
и nav__link
— имена элементов, а nav__item_active
— имя модификатора элемента item
.
В таком случае запись будет следующей:
<ul> <li><a>One</a></li> <li><a>Two</a></li> <li><a>Three</a></li> </ul>
И, соответственно, CSS будет иметь такой вид:
.nav__item { padding: 4px 10px; color: black; } .nav__item_active { font-weight: bold; background: #ffc7c7; }
Новые имена CSS-классов содержат всю информацию о структуре блока. А это значит, что больше не нужно просматривать HTML-код страницы, чтобы определить все зависимости. Cелектор всегда содержит знания о том, на какой блок или элемент влияют его правила (в данном случае на элемент nav__item
). Разработчику не придется думать о возможном существовании кнопки <div>Нажми меня!</div>
, так как еe CSS-правила будут записаны как .button_active
и не будут зависеть от правил модификатора active
для пункта меню (nav__item_active
Использование длинных имен имеет следующие недостатки:
Результирующий код весит больше. Эта проблема решается
gzip
, который сжимает повторяющиеся последовательности в именах.Времени на написание классов тратится больше. Эту проблему помогают решить автозаполнение в редакторе, использование CSS-препроцессоров и шаблонизаторов, которые автоматически добавляют префиксы. Длинные имена классов предоставляют явные связи между составными частями компонентов, что экономит время на изучение архитектуры проекта.
Как получить самодокументируемый код
Проблема
При переходе на новый проект разработчик тратит много усилий на то, чтобы понять, как все устроено, где что лежит и как работает код. Порой именно на такое изучение уходит большая часть времени, а вовсе не на реализацию функциональности или исправление ошибки.
Одна из целей БЭМ — дать понять, что делает тот или иной код, только по названиям классов. Идея самодокументируемого кода заключается в том, чтобы при просмотре CSS-классов, переменных и функций было понятно, как работает код, и как взаимодействуют компоненты интерфейса.
Используя БЭМ, можно получить HTML с именами классов, показывающих взаимодействие следующих частей кода:
независимых блоков;
элементов (дочерних компонентов) этого блока;
модификаторов блока или элемента.
Рассмотрим пример с формой поиска на сайте. Не будем обращаться к HTML, попытаемся прочитать только CSS и понять, какую часть интерфейса он описывает.
Вариант реализации формы в классической верстке:
form {} input { background: red; } input[type=submit] { background: buttonface }
Такой способ записи не отражает связи между:
компонентами и их составными частями;
селекторами и конкретными компонентами интерфейса, к которым они относятся.
Использование глобальных селекторов делает код проекта нерасширяемым, так как внесение минимальных изменений повлечет за собой правки во всех зависимых правилах.
Напишем CSS на классы:
.form {} .field {} .submit {}
Код стал информативнее: теперь понятно, что есть форма, поле и какой-то компонент submit
. Но такие имена все еще не дают понять, относится ли поле (field
) к форме (form
), или что произойдет, если полей или форм на странице будет несколько. Снова возникает необходимость обращаться к HTML.
Перепишем пример, используя соглашение по именованию БЭМ:
.form {} .form_search {} .form__field {} .form__submit-button {}
Такая запись дает понять, как работает данный код. Имена CSS-классов показывают, что:
Существует форма, реализованная блоком
form
.Модификатор
form_search
указывает на то, что речь идет о форме поиска.У формы есть составляющие — вложенные элементы: поле
form__field
и кнопкаform__submit-button
.
Следование соглашению по именованию БЭМ позволяет понять структуру блока без подробного изучения HTML. Даже при появлении на странице еще одного поля (кроме form__field
), его правила никак не будут влиять на элементы поисковой формы. Новое поле будет реализовано как элемент другого блока и будет иметь свое уникальное имя. Например, attach__field
.
Правила именования БЭМ позволяют сделать код проекта однозначным и, как следствие, информативным. Это снижает порог входа для других разработчиков.
Как начать повторно использовать код и избежать взаимного влияния компонентов друг на друга
Проблема
Разработчик использует схожий набор компонентов при разработке страниц одного проекта. Например, на странице может быть несколько типов блока menu
.
Рассмотрим проблему на примере навигационного меню:
<ul> <li><a>One</a></li> <li><a>Two</a></li> <li><a>Three</a></li> </ul>
CSS-стили к пункту item
могут быть записаны как:
. item { padding: 4px 10px; color: black; }
Если на страницу понадобится добавить дополнительные компоненты, содержащие пункты, то появится еще один блок кода с классом item
, например:
<div> <div> <h3></h3> <img> </div> </div>
В этом случае CSS может быть оформлен с помощью каскадов. Для этого достаточно доопределить правила, уже написанные для .item
:
.item { padding: 4px 10px; color: black; } .snippets .item { color: red; font-size: 14px; }
Подобный код может работать до тех пор, пока не возникнет необходимость изменить страницу. Например, переместить пункты меню, использовать написанный код в другом месте отдельно от родительского компонента или вложить навигационное меню в блок snippets
.
Использование каскадов связывает независимые компоненты интерфейса: нет возможности исправить один компонент, не затронув стили другого.
Решение
Правила по именованию CSS-селекторов дают возможность вносить изменения точечно, не затрагивая зависимые компоненты. В БЭМ каждый блок имеет уникальное имя и является самодостаточным.
Запишем тот же код в соответствии с правилами именования БЭМ:
<ul> <li><a>One</a></li> <li><a>Two</a></li> <li><a>Three</a></li> </ul>
.nav__item { padding: 4px 10px; color: black; }
В таком случае добавление нового пункта item
на страницу будет выглядеть так:
<div> <div> <h3></h3> <img> </div> </div>
Пункт snippets__item
будет иметь соответствующие только ему уникальные CSS-правила:
.snippets__item { padding: 4px 10px; color: red; font-size: 14px; }
Изменения в nav__item
не влияют на snippets__item
, так как пункты получают уникальные имена благодаря пространству имен, заданному именем блока.
Такой подход дает возможность защитить элементы от взаимного влияния друг на друга — элементы всегда являются частью блока. Такой же принцип работы использует и Shadow DOM в Web Components. Но, в отличие от Shadow DOM, применение соглашения по именованию БЭМ не зависит от совместимости с работой браузеров.
Блоки snippets
и nav
можно повторно использовать и перемещать по странице или проекту. Уникальность имен классов, основанная на правилах именования БЭМ, позволяет блокам не зависеть друг от друга.
Использование каскадов в БЭМ
Методология БЭМ допускает использование каскадов.
Например, каскад уместен, чтобы менять элементы в зависимости от состояния блока или заданной ему темы:
.nav_hovered .nav__link { text-decoration: underline; }
.nav_theme_islands .nav__item { line-height: 1.5; }
Важно! Применение каскада увеличивает связанность кода и делает его повторное использование невозможным.
Как разместить несколько сущностей на одном DOM-узле и избежать «Copy-Paste»
Проблема
При работе с проектами может потребоваться повторно использовать реализованную функциональность.
Во многих случаях такую проблему решают копированием нужной части кода в новый компонент. Такой подход имеет следующие недостатки:
увеличивается кодовая база проекта;
затрудняется отладка кода при выявлении ошибки.
Как следствие, разработчик вынужден поддерживать большее количество строк кода, а исправления необходимо вносить отдельно в каждую реализацию. Это увеличивает временные затраты на отладку и поддержку проекта.
Решение
Воспользуемся примером, который реализует универсальный блок навигационного меню и написан по всем правилам именования БЭМ.
<ul> <li><a>One</a></li> <li><a>Two</a></li> <li><a>Three</a></li> </ul>
Такой блок можно использовать, например, для навигации по статьям в блоке новостей.
Допустим, в разделе новостей уже есть блок articles
, которому написаны все необходимые CSS-правила.
Смешать реализации двух разных блоков без копирования кода можно при помощи микса. То есть разместить на одном DOM-узле блок nav
и элемент articles__nav
.
В коде это будет выглядеть так:
<ul> <li><a>One</a></li> <li><a>Two</a></li> <li><a>Three</a></li> </ul>
Такая реализация позволит объединить функциональность блока nav
и особенности реализации элемента articles__nav
(внешний вид новостных статей в меню). При этом нет необходимости копировать уже имеющиеся CSS-правила. При обнаружении ошибки, правки необходимо будет внести только в одну часть кода.
Миксовать можно не только блоки с элементами, но и другие БЭМ-сущности. Подробнее о вариантах использования миксов в БЭМ читайте в разделе Основные понятия БЭМ.
Панель навигации CSS
Следующая глава >>
Демонстрация: панели навигации
Вертикальный
- Домашний
- Новости
- Контакт
- О
Горизонтальный
- Домашний
- Новости
- Контакт
- О
- Дом
- Новости
- Контакт
- О
Панели навигации
Удобная навигация важна для любого веб-сайта.
С помощью CSS вы можете превратить скучные HTML-меню в красивые панели навигации.
Панель навигации = Список ссылок
В качестве основы для панели навигации требуется стандартный HTML.
В наших примерах мы создадим панель навигации из стандартного HTML-списка.
В наших примерах мы создадим панель навигации из стандартного HTML-списка.
Пример
Попробуйте сами
Теперь давайте удалим маркеры, поля и отступы из списка:
Пример
ul
{
тип-стиль-списка
: никто;
маржа
: 0;
заполнение
: 0;
}
Попробуйте сами
Объяснение примера:
-
list-style-type: none;
— Удаляет пули. Для панели навигации не нужны маркеры списка - Установить
поле: 0;
изаполнение: 0;
для удаления настроек браузера по умолчанию
Вертикальная панель навигации
Чтобы создать вертикальную панель навигации, вы можете стилизовать элементы внутри списка в дополнение к приведенному выше коду:
Пример
li a
{
дисплей
: блокировать;
ширина: 60 пикселей;
}
Попробуйте сами
Объяснение примера:
-
display: block;
— Отображение ссылок в виде блочных элементов делает кликабельной всю область ссылок (а не только текст) и позволяет указать ширину (и отступы, поля, высота и т. д., если хотите) -
ширина: 60 пикселей;
— Блочные элементы занимают всю доступную по умолчанию ширину. Мы хотим указать ширину 60 пикселей
Вы также можете установить ширину
- и удалить ширину ,
так как они будут занимать всю доступную ширину при отображении в виде блочных элементов.
Это даст тот же результат, что и в предыдущем примере:
- Дом
- Новости
- Контакт
- О
- Домашняя страница
- Новости
- Контакт
- О
- или для центрирования ссылок.
Добавьте свойство
border
в- добавить границу вокруг панели навигации. Если вы также хотите
границы внутри панели навигации, добавьте
- , кроме
последний:
- Дом
- Новости
- Контакт
- О
Пример
ул {
граница : 1 пиксель сплошной # 555;
}li {
выравнивание по тексту : центр;
нижняя граница : 1 пиксель сплошной # 555;
}li:last-child {
нижняя граница : никто;
}Попробуйте сами
Полноразмерная фиксированная вертикальная панель навигации
Создание полноразмерной «липкой» боковой панели навигации:
Пример
ul {
list-style-type : никто;
поле : 0;
заполнение : 0;
ширина : 25%;
цвет фона : #f1f1f1;
высота : 100%; /* Полная высота */
позиция : исправлено; /* Закрепить даже при прокрутке */
переполнение: авто; /* Включить прокрутку, если в боковой панели слишком много контента */
}Попробуйте сами
Примечание: Этот пример может работать некорректно на мобильных устройствах.
Горизонтальная панель навигации
Существует два способа создания горизонтальной панели навигации. Использование встроенных или плавающих элементов списка .
Элементы встроенного списка
Один из способов построить горизонтальную панель навигации — указать элементы
- как встроенный, в дополнение к «стандартному» коду выше:
Пример
li {
дисплей : в очереди;
}Попробуйте сами
Объяснение примера:
-
display: inline;
— По умолчанию элементы - являются блочными элементами. Мы тут удалить разрывы строк до и после каждого элемента списка, чтобы отображать их на одной строке
- элементов и укажите макет для навигационных ссылок:
Пример
ли {
плавающий : левый;
}а {
дисплей : блокировать;
отступ: 8 пикселей;
цвет фона : #дддддд;
}Попробуйте сами
Объяснение примера:
-
float: left;
— используйте float, чтобы элементы блока скользили рядом друг с другом -
дисплей: блок;
— Отображение ссылок в виде блочных элементов делает всю область ссылок кликабельно (не только текст), и это позволяет нам указать отступы (а также высоту, ширину, поля и т. д., если хотите) -
отступы: 8px;
— Поскольку блочные элементы занимают всю доступную ширину, они не могут плавать рядом друг с другом. Поэтому укажите некоторые отступы, чтобы они хорошо выглядели -
background-color: #dddddd;
— Добавить серый цвет фона для каждого элемента
Совет: Добавьте фоновый цвет к
- вместо каждого элемента , если хотите
цвет фона во всю ширину:
- Дом
- Новости
- Контакт
- О
- Домашняя страница
- Новости
- Контакт
- О
- Home
- Новости
- Контакт
- О
- для создания разделителей ссылок:
- Home
- Новости
- Контакт
- О
Пример
/* Добавляем серую правую границу ко всем элементам списка, кроме последнего элемента (last-child) */
ли {
border-right: 1px сплошной #bbb;
}li:last-child {
правая граница : никто;
}Попробуйте сами
Фиксированная панель навигации
Сделать так, чтобы панель навигации оставалась вверху или внизу страницы, даже когда пользователь прокручивает страницу:
Fixed Top
ul {
position : исправлено;
верх : 0;
ширина : 100%;
}Попробуйте сами
Фиксированный Нижний
ul {
положение: фиксированное;
низ : 0;
ширина : 100%;
}Попробуйте сами
Примечание: Эти примеры могут некорректно работать на мобильных устройствах.
Серая горизонтальная панель навигации
Пример серой горизонтальной панели навигации с тонкой серой рамкой:
- Home
- Новости
- Контакт
- Около
Пример
ул {
граница : 1 пиксель сплошной #e7e7e7;
цвет фона : #f3f3f3;
}цвет {
цвет : #666;
}Попробуйте сами
Дополнительные примеры
Как использовать мультимедийные запросы CSS3 для создания адаптивной верхней навигации.
Попробуйте сами
Адаптивная боковая панель
Как использовать мультимедийные запросы CSS3 для создания адаптивной боковой навигации.
Попробуйте сами
Выпадающая панель навигации
Как добавить выпадающее меню в панель навигации.
Попробуйте сами
Следующая глава >>
Статьи по теме
- Написать интервью Опыт
- CSS | свойство nav-right
- Как создать ссылки меню, выровненные по правому краю, используя HTML и CSS?
- Система Grid Bootstrap
- Кнопки начальной загрузки, глификоны, таблицы
- Вертикальные формы начальной загрузки, горизонтальные формы, встроенные формы
- раскрывающиеся в начале
- . Значки Bootstrap, этикетки, заголовки страниц
- Bootstrap | Панель навигации
- Как изменить цвет панели навигации в Bootstrap?
- Как изменить цвет переключателя гамбургеров в Bootstrap?
- Как выровнять элементы панели навигации вправо в Bootstrap 4?
- Как выровнять элементы панели навигации по центру с помощью Bootstrap 4?
- Как выровнять логотип панели навигации по левому краю экрана с помощью Bootstrap?
- Как создать Nested Accordion с помощью Google AMP amp-accordion?
- HTML |
- Как создать эффект вращающегося диска с помощью CSS?
- Чтение содержимого выбранной веб-страницы с помощью Python Web Scraping
- Ожидаемое количество попыток до успешного завершения
- Линейность ожидания
- Ожидание или ожидаемое значение массива
- Случайное блуждание (реализация на Python)
- Алгоритм ранжирования страниц и его реализация
- Алгоритм поиска темы по гиперссылке (HITS) с использованием модуля Networxx | Python
- 10 лучших проектов для начинающих для практики HTML и CSS навыков
- Как вставлять пробелы/табуляции в текст с помощью HTML/CSS?
- Скрыть элементы в HTML с помощью свойства отображения
- CSS для размещения значка внутри элемента ввода в форме
- Как создать нижний колонтитул, чтобы он оставался внизу веб-страницы?
Написать статью
Улучшить статью
Сохранить статью
- Последнее обновление: 30 ноя, 2022
- Читать
- Обсудить
- auto: Это значение по умолчанию, которое браузеры определяют, по какому элементу перемещаться.
-
: Он определяет идентификатор для навигации. - <имя-цели>: Определяет цель для навигации.
- начальный: Это значение по умолчанию.
- наследование: Наследуется от своего родительского элемента.
Пример
ул. {
цвет фона : #дддддд;
}Попробуйте сами
Примеры горизонтальной панели навигации
Создать базовую горизонтальную панель навигации с темным фоном и изменить цвет фона ссылок, когда пользователь наводит курсор мыши им:
Пример
ul {
тип-стиля-списка : никто;
поле : 0;
заполнение : 0;
переполнение : скрытый;
цвет фона : #333;
}li {
с плавающей запятой : левый;
}li a {
дисплей : блокировать;
цвет : белый;
выравнивание текста : центр;
padding: 14px 16px;
text-decoration: нет;
}/* Изменяем цвет ссылки на #111 (черный) при наведении */
li a:hover {
цвет фона : #111;
}Попробуйте сами
Активная/текущая навигационная ссылка
Добавить к текущей ссылке «активный» класс, чтобы пользователь знал, на какой странице он находится:
Пример
. active {
background-color : #4CAF50;
}Попробуйте сами
Ссылки, выровненные по правому краю
Выровнять ссылки по правому краю, перемещая элементы списка вправо (
float:right;
):Пример
Попробуйте сами
Разделители границ
Добавьте свойство
border-right
вУлучшить статью
Сохранить статью
Свойство CSS nav-right используется для навигации по навигационной клавише с клавиатуры. Это свойство определяет, на чем следует сосредоточиться, когда пользователь перемещается с помощью клавиши навигации. nav-right можно использовать со свойствами nav-left , nav-up и nav-down . Синтаксис:
nav-right: auto | идентификатор | имя-цели | начальная | наследовать;
Атрибут:
Примечание: Это свойство поддерживается только Opera 12.0. Below example illustrate the property: Example 1:
html
<
html
>
<
head
>
<
title
>CSS nav-right Property
title
>
<
link
rel="stylesheet" href=
"https://cdnjs. cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
> <
стиль9
кнопка {
позиция: абсолютная;
}
H2 {
Цвет: зеленый;
}
Кнопка {
ФОН-КОЛОДОВ: #80FF80;
nav-right: auto;
nav-left: auto;
nav-down: auto;
навигация: авто;
радиус границы: 25 пикселей;
размер шрифта: 20 пикселей;
}
#Geeks1 {
топ: 35%;
осталось: 43%;
навигационный индекс: 1;
}
#Heeks2 {
Топ: 50%;
осталось: 65%;
навигационный индекс: 2;
}
#Geeks3 {
Топ: 65%;
осталось: 43%;
навигационный индекс: 3;
}
#Geeks4 {
топ: 50%;
осталось: 20%;
навигационный индекс: 4;
}
. 0006
<
body
>
<
center
>
<
h2
>GeeksforGeeks
h2
>
<
h5
>CSS nav-right Property
h5
>
<
p
>
Нажмите <
SAMP
> Shift
SAMP
>
Ключ, пока перемещались с Arrow Keys.
p
>
center
>
<
button
id="Geeks1">Button
<
i
class="fa fa-arrow-circle-up">
i
>
button
>
<
button
id="Geeks2">Button
<
i
class="fa fa-arrow-circle-right">
i
>
button
>
<
button
id="Geeks3">Button
<
i
class="fa fa-arrow-circle-down">
i
>
кнопка
9> 9 0 89
0089
<
button
id="Geeks4">Button
<
i
class="fa fa-arrow-circle-left">
i
>
button
>
<
div
>
div
>
body
>
html
>
Output: Supported Browsers: The major browsers are not поддерживается Свойство CSS nav-right Расширение, специфичное для браузера: Свойство css nav-right имеет расширение, специфичное для браузера.
-
border-bottom
ко всем элементамЭлементы плавающего списка
Еще один способ создания горизонтальной панели навигации — сделать плавающим
- , кроме
последний:
Пример
ул
{
тип-стиль-списка
: никто;
маржа
: 0;
заполнение
: 0;
ширина: 60 пикселей;
}
ля
{
отображение: блок;
}
Попробуйте сами
Примеры вертикальной панели навигации
Создать базовую вертикальную панель навигации с серым цветом фона и изменить цвет фона ссылок, когда пользователь наводит указатель мыши им:
Пример
ul {
тип-стиля-списка
: никто;
поле
: 0;
заполнение
: 0;
ширина
: 200 пикселей;
цвет фона
: #f1f1f1;
}
li a {
дисплей
: блокировать;
цвет: #000;
заполнение
: 8 пикселей 16 пикселей;
text-decoration: нет;
}
/* Изменение цвета ссылки при наведении */
li a:hover {
background-color: #555;
цвет
: белый;
}
Попробуйте сами
Активная/текущая навигационная ссылка
Добавить к текущей ссылке «активный» класс, чтобы пользователь знал, на какой странице он находится:
Пример
. active {
background-color
: #4CAF50;
цвет
: белый;
}
Попробуйте сами
Центрируйте ссылки и добавьте границы
Добавьте text-align:center
в