Основы css. часть 1. базовые понятия

O

object-fit Указывает, как содержимое заменяемого элемента должно быть установлено в поле, установленное его используемой высотой и шириной
object-position Задает выравнивание заменяемого элемента внутри его поля
opacity Задает уровень непрозрачности для элемента
order Задает порядок гибкого элемента по отношению к остальным
orphans Задает минимальное число строк, которые должны быть оставлены в нижней части страницы при возникновении разрыва страницы внутри элемента
outline Задает все свойства структуры в одном объявлении
outline-color Задает цвет контура
outline-offset Смещение контура и его выводит за пределы края границы
outline-style Задает стиль контура
outline-width Задает ширину контура
overflow Указывает, что происходит, если содержимое переполнено полем элемента
overflow-wrap Указывает, может ли обозреватель разрывать строки в словах, чтобы предотвратить переполнение (если строка слишком длинная, чтобы вместить ее содержащее поле)
overflow-x Указывает, следует ли обрезать левый/правый край содержимого, если оно переполнено областью содержимого элемента
overflow-y Указывает, следует ли обрезать верхний/нижний край содержимого, если оно переполнено областью содержимого элемента

Псевдо-элементы

Псевдо-элементы, аналогично псевдо-классам вычисляются браузером автоматически, нам об этом заботиться не нужно. Чтобы не путать псевдо-элементы с псевдо-классами в спецификации CSS 3 было решено использовать двойное двоеточие, вместо одинарного, как было в CSS 2. Поэтому в Интернете вы можете встретить псевдо-элементы как с одинарным двоеточием так и с двойным – и тот и тот вариант верен. Однако для лучшей совместимости с IE рекомендуют использовать одинарное двоеточие.

:first-line – первая строка внутри блочного или табличного элемента.

:first-letter – первая буква внутри блочного элемента.

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

Каскадирование css стилей

Каскадирование css стилей означает преемственность применения того или иного стиля в зависимости от используемого метода подключения css. Рассмотрим на примере:
На примере видно, что приоритетным является использования стилей. Следующим по приоритету следует и только потом — (стиль в отдельном файле)

Важно: В случае, если пользовательская таблица стилей содержит , то это правило имеет приоритет над любым правилом, описанным в таблице стилей:

P { font-size 24pt!important; }

Пример: создать правило для дочернего класса , исходя из того, что тег данного класса вложен в родительский тек с классом


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

Присвоение класса элементу

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

Чтобы назначить несколько классов элементу разделите имена классов пробелами.

Классы могут использоваться для стилизации определенных элементов без изменения всех элементов данного типа. Например, эти два элемента могут иметь совершенно разные стили:

Множество элементов могут иметь одинаковые классы и все они получат стиль, связанный с этим классом. Это всегда будет верно, если внутри CSS вы не укажете элемент.
Например, у нас есть два элемента: оба с классом highlight:

Если ваш стиль такой, как показано ниже, то оба элемента будут содержать зеленый текст:

Однако, если мы хотим только чтобы класс работал только внутри div, мы можем добавить конкретики, как показано ниже:

Тем не менее, при стилизации с помощью CSS обычно рекомендуется использовать только классы (например, .highlight), а не элементы с классами (например, div.highlight).
Как и любой другой селектор, классы могут быть вложенными:

Вы также можете связать селектор классов только с элементами, имеющими определенную комбинацию из нескольких классов. Например, если это наш HTML:

И мы хотим покрасить текст этого элемента в розовый цвет, то можем написать в CSS следующее:

Атрибуты

Элементам DOM, с другой стороны, соответствуют HTML-теги, у которых есть текстовые атрибуты.

Конечно, здесь речь именно об узлах-элементах, не о текстовых узлах или комментариях.

Доступ к атрибутам осуществляется при помощи стандартных методов:

  • – проверяет наличие атрибута
  • – получает значение атрибута
  • – устанавливает атрибут
  • – удаляет атрибут

Эти методы работают со значением, которое находится в HTML.

Также все атрибуты элемента можно получить с помощью свойства , которое содержит псевдо-массив объектов типа .

В отличие от свойств, атрибуты:

  • Всегда являются строками.
  • Их имя нечувствительно к регистру (ведь это HTML)
  • Видны в (за исключением старых IE)

Рассмотрим отличия между DOM-свойствами и атрибутами на примере HTML-кода:

Пример ниже устанавливает атрибуты и демонстрирует их особенности.

При запуске кода выше обратите внимание:

  1. – первая буква имени атрибута написана в верхнем регистре, а в HTML – в нижнем, но это не имеет значения, так как имена нечувствительны к регистру.
  2. Мы можем записать в атрибут любое значение, но оно будет превращено в строку. Объекты также будут автоматически преобразованы.
  3. После добавления атрибута его можно увидеть в элемента.
  4. Коллекция содержит все атрибуты в виде объектов со свойствами и .

CSS 3 псевдо-классы

Вы уже ознакомились со всеми основными селекторами и вам на первых парах этого должно хватить с горкой. Однако в CSS 3 появилось множество новых псевдо-классов, теперь мы можем брать не только первого ребёнка, но и любого другого по счёту, можем идти от обратного, брать не первого, а последнего ребёнка и так далее и тому подобное. Всё это очень удобно и практично, разве что у вас могут возникнуть проблемы со старыми версиями IE. Давайте соберём все силы в кулак и пробежимся по всем оставшимся селекторам, чтобы потом уже вы могли иметь их ввиду при вёрстке собственного макета.

:last-child – аналог :first-child, только берёт не первого, а последнего ребёнка.

:only-child – сработает, если элемент (тег) является единственным ребёнком.

:only-of-type — сработает, если элемент (тег) является единственным ребёнком своего типа.

:nth-child() – обращается к потомкам по их порядковым номерам, можно обращаться ко всем чётным или нечётным (even или odd) числам. Например:

<style>
div p:nth-child(5) {background-color: green;} /* Обращаемся к 5 по счёту ребёнку, если он является тегом p. */
div p:nth-child(2n) {background-color: yellow;} /* Обращаемся к каждому второму ребёнку, если он является тегом p. */
div p:nth-child(2n+6) {background-color: red;} /* Обращаемся к каждому второму ребёнку начиная с шестого, если он является тегом p. */
</style>
<div>
<p>параграф</p>
<p>параграф</p>
<p>параграф</p>
<span>текст в спане</span>
<p>параграф</p>
<p>параграф</p>
<p>параграф</p>
<p>параграф</p>
<p>параграф</p>
<p>параграф</p>
</div>

Результат:

:nth-last-child – работает также как и предыдущий, но отчёт начинается с конца.

:first-of-type – первый ребёнок своего типа в рамках прямого родителя.

:last-of-type – последний ребёнок своего типа в рамках прямого родителя.

:empty – сработает для тех тегов, внутри которых нет ни одного символа (без текста).

:not() – делает исключение для заданных элементов. Пример:

<style>
p:not(.roll) {color: red;} /* для всех параграфов на странице делаем красный цвет текста, за исключением параграфов с классом roll */
</style>
<p class="roll">параграф с классом roll</p>
<p>параграф</p>
<p>параграф</p>
<p class="roll">параграф с классом roll</p>

Результат:

Псевдо-классы

В отличие от классов, псевдо-классы не нужно указывать в HTML разметке, они сами вычисляются браузером. У нас есть 4 статических псевдо-класса и 3 динамических псевдо-класса, без учёта CSS 3, о нём ближе к концу. К статическим относятся ( :first-child, :link, :visited, : lang() ):

<style>
p:first-child {color: green;} /* сработает, если p является первым ребёнком своего родителя */
</style>
<div>
  <p>Прямой наследник (первый уровень)</p>
  <span>
    <span>
      <p>Третий уровень</p>
    </span>
  </span>
  <p>Прямой наследник (первый уровень)</p>
  <span>
    <p>Второй уровень</p>
  </span>
  <p>Прямой наследник (первый уровень)</p>
</div>

Результат:

Естественно можно комбинировать селекторы как захотим, например:

div>span p:first-child {color: green;} /*сработает, если p является первым ребёнком своего родителя и находится внутри тега span, который является прямым потомком тега div */

Название представленного выше псевдо-класса говорит само за себя first-child — первый ребёнок.

Следующие два статических псевдо-класса применяются только к тегу гиперссылки (:link, :visited), они применяют CSS свойства в зависимости от того, посещалась данная ссылка конкретным пользователем или нет:

a:link {color: blue;} /* у не посещённых ссылок задаём синий цвет, и по умолчанию они подчёркнуты */
a:visited {color: green; text-decoration: none;} /* у посещённых ссылок текст будет зелёным, убираем подчёркивание */

Псевдо-класс :lang() используется для задания разного стиля оформления в зависимости от языка. В скобочках указывается язык, к которому нужно применить оформление. Это можно использовать, например, для задания разных стилей кавычек в цитатах:

q:lang(de) {quotes: "\201E" "\201C";} /* кавычки для немецкого языка */
q:lang(en) {quotes: "\201C" "\201D";} /* кавычки для английского языка */
q:lang(ru) {quotes: "\00AB" "\00BB";} /* кавычки для русского языка */

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

Допустимые значения

Для HTML5 ограничениями на значение id являются:

  1. он должен быть уникальным в документе
  2. он не должен содержать пробелов
  3. он должен содержать хотя бы один символ

Таким образом, значением могут быть все цифры, только одна цифра, только знаки пунктуации, включая специальные символы, все что угодно. Просто не должно быть пробелов.
Таким образом, нижеследующие объявления являются допустимыми:

Недопустимо:

Также неверен нижеследующий код, если включен в один документ:

Для HTML 4.01 и ниже для значения всегда должно начинаться с буквы, а остальными символами могут быть:

  • латинские буквы (A-Z/a-z)
  • цифры (0-9)
  • тире («-«)
  • подчеркивания («_»)
  • двоеточия («:»)
  • точки («.»)

В этом случае в вышеприведённом примере для HTML5, допустим только один вариант:

Другие примеры, допустимые в HTML 4.01 и ниже:

Правила для названий классов по существу те же, что и для идентификаторов. Разница в том, что значения класса не обязательно должны быть уникальными в документе.
В вышеприведенном примере недопустимо в одном документе:

А это совершенно нормально:

Имейте в виду, что приведенные выше правила и примеры применяются в контексте HTML.
Использование чисел, знаков препинания или специальных символов в значении i и может вызвать проблемы в других контекстах, таких как CSS, JavaScript и регулярных выражениях.
Например, хотя в HTML5 допустим следующий идентификатор:

Он не допустим в CSS.

В CSS различные идентификаторы (включая имена элементов, классы и идентификаторы в селекторах)
могут содержать только символы и символы из ISO 10646 U + 0080 и выше, а также дефис ()
и подчеркивание ();
они не могут начинаться с цифры, двух дефисов или дефисов, за которыми следует цифра.
( )

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

Классы не уникальны

  • Вы можете использовать одинаковые классы для разных элементов.
  • Вы можете использовать разные классы для одинаковых элементов.

Любая информация, необходимая для наложения стилей на разные объекты, может быть описана в class. Для примера – страница с множественными “widget”:

Вы можете использовать имя класса “widget” как крючок, чтобы, например, сделать больше, чем другие, но при этом сохраняя все атрибуты. Вы можете накладывать на один объект более, чем один класс:

Нет необходимости использовать новый класс, просто добавьте новый необходимый класс справа или слева. Эти классы, разделенные через пробел, нормально воспринимаются всеми браузерами в любом количестве (но не стоит доходить до фанатизма и создавать тысячу и более классов для одного элемента).

Контекстуальные цвета (цвета для выделения текста)

В Twitter Bootstrap 3 имеются вспомогательные акцентные классы, с помощью которых вы можете установить цвет некоторому фрагменту тексту. Кроме текста эти классы также можно применять к ссылкам, которые не только изменяют цвет данной ссылки, но и делают её темнее при поднесении к ней курсора.

Например:

<p class="text-muted">...</p>
<p class="text-primary">...</p>
<p class="text-success">...</p>
<p class="text-info">...</p>
<p class="text-warning">...</p>
<p class="text-danger">...</p>
<a class="text-muted" href="#">Пример ссылки</a> 
<a class="text-primary" href="#">Пример ссылки</a> 
<a class="text-success" href="#">Пример ссылки</a> 
<a class="text-info" href="#">Пример ссылки</a> 
<a class="text-warning" href="#">Пример ссылки</a> 
<a class="text-danger" href="#">Пример ссылки</a> 

Текст:

Lorem ipsum dolor sit amet. Officiis debitis aut reiciendis voluptatibus maiores alias consequatur aut fugit.

Sint et dolorum fuga sit voluptatem accusantium. Cum soluta nobis est et dolorum fuga obcaecati cupiditate.

Delectus, ut aut perferendis doloribus asperiores repellat.. Excepturi sint, obcaecati cupiditate non provident, similique sunt.

Optio, cumque nihil impedit, quo minus. Similique sunt in culpa. Nam libero tempore, cum soluta.

Magni dolores et voluptates repudiandae. Voluptatem sequi nesciunt, neque porro quisquam est, omnis dolor repellendus quibusdam.

Repudiandae sint et aut fugit. Odit aut fugit, sed quia dolor sit, aspernatur aut rerum. Consectetur, adipisci velit, sed ut enim ipsam voluptatem, quia consequuntur magni.

Ссылки:

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

HTML Tutorial

HTML HOMEHTML IntroductionHTML EditorsHTML BasicHTML ElementsHTML AttributesHTML HeadingsHTML ParagraphsHTML StylesHTML FormattingHTML QuotationsHTML CommentsHTML Colors
Colors
RGB
HEX
HSL

HTML CSSHTML Links
Links
Link Colors
Link Bookmarks

HTML Images
Images
Image Map
Background Images
The Picture Element

HTML TablesHTML Lists
Lists
Unordered Lists
Ordered Lists
Other Lists

HTML Block & InlineHTML ClassesHTML IdHTML IframesHTML JavaScriptHTML File PathsHTML HeadHTML LayoutHTML ResponsiveHTML ComputercodeHTML SemanticsHTML Style GuideHTML EntitiesHTML SymbolsHTML EmojisHTML CharsetHTML URL EncodeHTML vs. XHTML

Одно из нескольких значений атрибута

Некоторые значения атрибутов могут перечисляться через пробел, например имена классов. Чтобы задать стиль при наличии в списке требуемого значения применяется следующий синтаксис.

{ Описание правил стиля }
Селектор { Описание правил стиля }

Стиль применяется в том случае, если у атрибута имеется указанное значение или оно входит в список значений, разделяемых пробелом (пример 13.6).

Пример 13.6. Стиль в зависимости от имени класса

HTML5CSS 2.1IECrOpSa 5Fx

В данном примере зелёный цвет текста применяется к селектору H3, если имя класса у слоя задано как block. Отметим, что аналогичный результат можно получить, если использовать конструкцию *= вместо ~=.

Значение атрибута начинается с определённого текста

Устанавливает стиль для элемента в том случае, если значение атрибута тега начинается с указанного
текста. Синтаксис применения следующий.

{ Описание правил стиля }
Селектор { Описание правил стиля }

В первом случае стиль применяется ко всем элементам, у которых значение атрибута начинаются с указанного текста. А во втором — только к определённым селекторам. Использование кавычек не обязательно, но только если значение содержит латинские буквы и без пробелов.

Предположим, что на сайте требуется разделить стиль обычных и внешних ссылок —
ссылки, которые ведут на другие сайты. Чтобы не вводить в тег <a> новый класс, воспользуемся селекторами атрибутов. Внешние ссылки характеризуются
добавлением к адресу протокола, например, для доступа к гипертекстовым документам
используется протокол HTTP. Поэтому внешние ссылки начинаются с ключевого слова http://, его и добавляем к селектору A,
как показано в примере 13.3.

Пример 13.3. Изменение стиля внешней ссылки

HTML5CSS 2.1IECrOpSaFx

Результат примера показан ниже (рис. 13.3).

Рис. 13.3. Изменение стиля для внешних ссылок

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

Все псевдо-классы CSS

Селектор Примере Пример описания
:active a:active Выбор активной ссылки
:checked input:checked Выбор каждого отмеченного <input> элемента
:disabled input:disabled Выбор всех отключенных элементов <input>
:empty p:empty Выбор каждого элемента <p>, не имеющего дочерних элементов
:enabled input:enabled Выбор всех включенных элементов <input>
:first-child p:first-child Выбирает каждый элемент <p>, являющийся первым дочерним элементом родительского элемента
:first-of-type p:first-of-type Выбор каждого элемента <p>, являющегося первым элементом <p> родительского элемента
:focus input:focus Выбор элемента <input>, имеющего фокус
:hover a:hover Выбор ссылок при наведении указателя мыши
:in-range input:in-range Выбор <input> элементов со значением в указанном диапазоне
:invalid input:invalid Выбор всех элементов <input> с недопустимым значением
:lang(language) p:lang(it) Выбирает каждый элемент <p> со значением атрибута lang, начинающимся с «IT»
:last-child p:last-child Выбирает каждый элемент <p>, являющийся последним дочерним элементом родительского элемента
:last-of-type p:last-of-type Выбирает каждый элемент <p>, являющийся последним <p> элементом его родительского элемента
:link a:link Выбор всех непосещаемых ссылок
:not(selector) :not(p) Выбор каждого элемента, не являющегося элементом <p>
:nth-child(n) p:nth-child(2) Выбирает каждый элемент <p>, являющийся вторым дочерним элементом родительского элемента
:nth-last-child(n) p:nth-last-child(2) Выбирает каждый элемент <p>, являющийся вторым дочерним элементом родительского объекта, считая от последнего дочернего элемента
:nth-last-of-type(n) p:nth-last-of-type(2) Выбирает каждый элемент <p>, являющийся вторым элементом <p> родительского элемента, считая от последнего дочернего элемента
:nth-of-type(n) p:nth-of-type(2) Выбор каждого элемента <p>, являющегося вторым элементом <p> родительского элемента
:only-of-type p:only-of-type Выбор каждого элемента <p>, являющегося единственным элементом <p> родительского элемента
:only-child p:only-child Выбирает каждый элемент <p>, являющийся единственным дочерним элементом родительского элемента
:optional input:optional Выбор <input> элементов без атрибута «обязательный»
:out-of-range input:out-of-range Выбор < input > элементов со значением за пределами заданного диапазона
:read-only input:read-only Выбор <input> элементов с указанным атрибутом «ReadOnly»
:read-write input:read-write Выбор <input> элементов без атрибута «ReadOnly»
:required input:required Выбор <input> элементов с указанным атрибутом «required»
:root root Выбор корневого элемента документа
:target #news:target Выбор текущего активного элемента #news (щелчок по URL-адресу, содержащему это имя привязки)
:valid input:valid Выбор всех элементов <input> с допустимым значением
:visited a:visited Выбор всех посещенных ссылок

1 способ. Подключение стилей с помощью атрибута «class»

«class»(класс) — может быть применен к неограниченному количеству тегов.
Вы задаете индивидуальный набор свойств и название этого класса в файле стилей. Затем на странице у тегов, для которых вы
хотите применить этот набор свойств просто пишите в атрибуте class имя класса(class=»имя класса») и стили, заданные в файле
применяются для данного элемента.

Это наиболее распространенный способ, потому что в большинстве случаев его удобнее использовать, чем описанный ниже с помощью «id».
Обычно атрибут «class» используется для оформления стилей таких элементов, которые могут повторяться на одной странице: заголовки, ссылки, текст,
таблицы, картинки и т. п. Но даже если тег используется всего 1 раз, к нему тоже можно применить стили с помощью атрибута «class».

Плюсы метода:

— Вы можете подключить один или несколько стилей с помощью атрибута класс(class) у неограниченного количества элементов.

— Для изменения нескольких тегов с одним классом на разных страницах достаточно изменить всего 1 строчку.

Минусы

— Если на странице несколько тегов с одним и тем же классом, то при их изменении с помощью скрипта javascript легко запутаться,
т. к. при обращении к тегу по имени класса нужно точно указать номер очередности каждого.

Как установить стиль с помощью атрибута class

В файле .css пишется название стиля и в фигурных скобках {} пишутся свойства. Перед названием стиля нужно поставить точку,
чтобы браузер понял, что он относится к class, а не к тегу.

Пример подключения атрибута class(код страницы .html)

<!DOCTYPE html>
<html lang=»ru»>
<head>
<meta charset=»utf-8″ />
<link rel=»stylesheet» href=»my_style.css»>
</head>
<body>
<p class=»my_style_p»>Текстовое содержание</p>
</body>
</html>

.my_style_p {color:red;}

В коде выше, мы задали классу «my_style_p» красный цвет с помощью свойства color.

Контекстуальные фоны (цвета для установления фона)

Кроме классов, предназначенных для выделения текста цветом, в Twitter Bootstrap 3 есть ещё несколько классов, которые предназначены для установления цветного фона блочным элементам HTML.

Например:

<p class="bg-primary">...</p>
<p class="bg-success">...</p>
<p class="bg-info">...</p>
<p class="bg-warning">...</p>
<p class="bg-danger">...</p>
<a class="bg-primary" href="#">Пример ссылки</a> 
<a class="bg-success" href="#">Пример ссылки</a> 
<a class="bg-info" href="#">Пример ссылки</a> 
<a class="bg-warning" href="#">Пример ссылки</a> 
<a class="bg-danger" href="#">Пример ссылки</a> 

Абзацы с различным фоном:

Lorem ipsum dolor sit amet. Officiis debitis aut reiciendis voluptatibus maiores alias consequatur aut fugit.

Sint et dolorum fuga sit voluptatem accusantium. Cum soluta nobis est et dolorum fuga obcaecati cupiditate.

Delectus, ut aut perferendis doloribus asperiores repellat.. Excepturi sint, obcaecati cupiditate non provident, similique sunt.

Optio, cumque nihil impedit, quo minus. Similique sunt in culpa. Nam libero tempore, cum soluta.

Magni dolores et voluptates repudiandae. Voluptatem sequi nesciunt, neque porro quisquam est, omnis dolor repellendus quibusdam.

Ссылки:

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

Отображение и скрытие контента

Чтобы заставить элемент отобразиться или скрыться вы можете использовать классы () и (). Эти классы так же как классы и имеют правило , которое повышает приоритет стилей данных классов перед стилями других классов или селекторов, которые могут эти стили вытеснить. Данные классы можно применять только к блочным элементам HTML.

Кроме того, в Bootstrap есть ещё один класс , который предназначен для отключения видимости элемента, к которому он применён. Но, в отличие от вышеперечисленных классов, данный класс не изменяет свойство у элемента и, следовательно, он по-прежнему занимает место, хоть и становится не видимым.

<div class="show">...</div>
<div class="hidden">...</div>
<div class="invisible">...</div>

Как писать классы по БЭМ?

БЭМ расшифровывается как «Блок Элемент Модификатор». На самом деле, это целый стэк технологий, из которого мы воспользуемся только соглашением по именованию классов.

Почему БЭМ?

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

Подробнее можно почитать в разделах Быстрый старт и
Часто задаваемые вопросы на сайте bem.info.

Ниже показаны примеры кода.

  1. Простой пример: Блок + Элемент

    Допустим, у вас есть блок с заголовком, текстом и кнопкой внутри, например, это всплывающее окно — попап. Разметка:

    Добавляем класс содержащий назначение элемента: :

    Теперь попробуем добавить классы вложенным элементам:

    Классы удобные, но не уникальные. Если на странице будут ещё элементы с классами и , их стили могут затронуть элементы в попапе. Селектор типа может в будущем создать проблемы со специфичностью. Можно придумать другие классы, но чем больше похожих по смыслу элементов, тем сложнее придумывать новые классы.

    А теперь применим БЭМ-нотацию: каждому элементу внутри блока добавим префикс с классом родителя, например, для заголовка это будет :

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

  2. Пример посложнее: Блок + Элемент + Модификатор

    Для примера возьмём сервисное сообщение на сайте. Обычно такие сообщения бывают разных видов, например, сообщение об успешном завершении действия или об ошибке.

    Логично использовать одну и ту же разметку, но с разными цветовыми темами. Именно здесь очень пригодятся модификаторы.

    Обоим элементам можно добавить одинаковые стили используя общий класс и так же легко можно добавить отдельные стили для каждого из них, используя уникальный класс с модификатором:

    Оба сообщения будут иметь рамку толщиной один пиксель, но для сообщения об успешной операции она будет зелёной, а для сообщения об ошибке — красной.

  3. Ещё сложнее: что делать, если хочется сделать элемент элемента?

    Например, на странице есть блок новостей:

    Заголовок блока логично получает класс , список — , а отдельная новость — :

    Тут никаких проблем возникнуть не должно. Теперь добавим разметку отдельной новости:

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

    Без дополнительных комментариев будет совершенно невозможно понять какой из них является заголовком всего блока, а какой — отдельной новости. Не пойдёт.

    Следующий вариант — , но в БЭМ нельзя создавать элемент элемента, и это понятно, потому что получается каша. Ещё вариант: — тоже не годится, потому что может быть неочевидным как соотносится с . Как же быть?

    Решение простое: на уровне элемента можно объявить новый блок (например, ), и строить вложенные классы уже от него. Да, это не самостоятельный переиспользуемый блок, здесь объявление блока нужно только для того, чтобы разгрузить селекторы. Что получается:

    Проблема решена: нам больше не нужно использовать монструозные классы, при этом класс точно описывает элемент, и в CSS будет сразу понятно какой класс за что отвечает:

    Простой и удобный выход из неудобной ситуации.

Больше примеров разметки можно увидеть здесь.

Ещё одно хорошее руководство по использованию БЭМ есть здесь.

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

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

Adblock
detector