.page.page_route_index
.page__header.header
.page__content
.page__heading
.page__section
.list.list_of_products
.list__item.product.product_view_preview
.product__title
.product__description
.product__image
.product__price
.page.page_route_product
.page__header.header
.page__content.product.product_view_detail
.page__heading.product__title
.product__section
.product__image
.product__description
.product__content
.product__price
.title { display: block }
.title_align_left { text-align: left }
.title_align_right { text-align: right }
.title_align_center { text-align: center }
.card
.card__title.title.title_align_left
.card
.card__title.title.title_align_right
.card
.card__title.title.title_align_center
.card__title { text-align: right }
@media (min-width: 720px) {
.card__title { text-align: left }
}
.card
.card__title.title
Выглядит так, словно это два независимых элемента того же блока. Значит ли это, что "menu__icon" должен быть способен существовать вне "menu__item"?
<nav class="menu menu_outside-icon">
<i class="menu__icon"></i>
<a class="menu__item" href="#!">
Main
</a>
</nav>
.menu_outside-icon .menu__icon {
margin-right: 0;
}
<nav class="menu">
<i class="menu__icon menu__icon_outside"></i>
<a class="menu__item" href="#!">
Main
</a>
</nav>
.menu__icon_outside {
margin-right: 0;
}
<nav class="menu">
<a class="link link_no-decoration menu__item" href="#!">
<i class="icon icon_size_m menu__icon"></i>
Main
</a>
</nav>
.menu__item {
padding: 1rem 2rem;
}
.menu__icon {
margin-right: 0.5rem;
}
.link {
color: blue;
}
.link_no-decoration,
.link_no-decoration:hover,
.link_no-decoration:focus {
color: inherit;
text-decoration: none;
outline: none;
}
.icon {
color: inherit;
line-height: 1;
}
.icon_size_m {
width: 1.5rem;
height 1.5rem;
}
<form class="form form_size_m form_color_red form_theme_forest"></form>
.form_theme_forest {
background-color: #fff;
color: #000;
}
&.label_notification_error {
margin: 4px 0px 0px 20px;
}
.form-input {
&__label {
margin-bottom: 4px;
}
}
.label {
&_notification_error {
margin: 4px 0px 0px 20px;
}
}
.form-input_view_super-form-with-notification-margin .form-input__label_notification_error {
margin: 4px 0px 0px 20px
}
) text
отлично подходит. Но если семантически (и в дизайне) этот текст соответсвует заголовку (жирность, бо́льший размер шрифта, можно использовать тег <h1-h6>
), то я завожу отдельный блок heading. Если используется шаблонизатор (React, Pug, Handlebars, etc.), то задание тега удобно ещё положить в …/heading/heading.<jsx | tsx | pug | html | yet-another-templater>
. Тогда микс будет более «семантичным» тоже:/* …/heading/heading.css */
.heading {
font-weight: bold;
}
/* …/heading_size/heading_size.css */
.heading_size_s {
font-size: 18px;
}
.heading_size_m {
font-size: 24px;
}
.heading_size_x {
font-size: 28px;
}
/* …/header/header.css */
.header {
padding: 4px;
text-size: 20px;
}
/* …/header/__text/header__text.css */
.header__text {
margin-bottom: 20px;
}
<div class="header">
<h3 class="header__text heading heading_size_x">
Lorem, ipsum dolor sit amet consectetur, adipisicing elit. Illo sunt iure aperiam sint dolor suscipit aut, delectus nesciunt officiis assumenda iusto quisquam libero similique, ex culpa porro vitae? Enim, qui.
</h3>
</div>
/* …/presentation/presentation.css */
.presentation {
padding: 6px;
background-color: #000;
color: #ffff;
}
/* …/presentation/__text/presentation__text.css */
.presentation__text {
margin-bottom: 20px;
color: #123;
}
<div class="presentation">
<h4 class="presentation__text heading heading_size_m">
Lorem, ipsum dolor sit amet consectetur, adipisicing elit. Illo sunt iure aperiam sint dolor suscipit aut, delectus nesciunt officiis assumenda iusto quisquam libero similique, ex culpa porro vitae? Enim, qui.
</h4>
</div>
/* …/description/description.css */
.presentation {
padding: 11px;
border: 1px solid #000;
border-radius: 4px;
}
/* …/description/__text/description__text.css */
.presentation__text {
margin-bottom: 16px;
text-transform: uppercase;
}
<h1-h6>
), но вполне может быть и<h1 class="heading heading_size_s">Самый главный заголовок, но мелким шрифтом</h1>
<h6 class="heading heading_size_xl">Заголовок под-под-подраздела, но крупным шрифтом</h6>
/* …/text/text.css */
.text {
padding: 11px;
border: 1px solid #000;
border-radius: 4px;
}
/* …/text/_weight/text_weight.css */
.text_weight_bold {
font-weight: bold;
}
/* …/text/_style/text_style.css */
.text_style_italic {
font-style: italic;
}
/* …/text/_decoration/text_decoration.css */
.text_ transform_uppercase {
text-transform: uppercase;
}
<div class="header">
<div class="header__text text text_weight_bold">
Lorem, ipsum dolor sit amet consectetur, adipisicing elit. Illo sunt iure aperiam sint dolor suscipit aut, delectus nesciunt officiis assumenda iusto quisquam libero similique, ex culpa porro vitae? Enim, qui.
</div>
</div>
<div class="presentation">
<div class="presentation__text text text_style_italic">
Lorem, ipsum dolor sit amet consectetur, adipisicing elit. Illo sunt iure aperiam sint dolor suscipit aut, delectus nesciunt officiis assumenda iusto quisquam libero similique, ex culpa porro vitae? Enim, qui.
</div>
</div>
<div class=" description">
<div class=" description__text text text_weight_bold text_ transform_uppercase">
Lorem, ipsum dolor sit amet consectetur, adipisicing elit. Illo sunt iure aperiam sint dolor suscipit aut, delectus nesciunt officiis assumenda iusto quisquam libero similique, ex culpa porro vitae? Enim, qui.
</div>
</div>
<button type="button" class="btn btn_size_large btn_state_success">
Подробнее
</button>
<a href="/article" class="btn btn_size_large btn_state_success">
Подробнее
</a>
<button type="button" class="btn btn_size_large btn_type_like">
<span class="icon icon_size_large icon_type_thumb-up icon_state_success"></span>
</button>
<button type="button" class="btn btn_size_large btn_type_dislike btn_with-count">
<span class="icon icon_size_large icon_type_thumb-down icon_state_error"></span>
<span class="btn__count">12</span>
</button>
.header__menu.menu .menu__item {
/* … */
}
.menu_view_header .menu__item {
/* … */
}
{
logo: {
img: 'путь до картинки',
text: '…',
},
contacts: [
'телефон',
'email',
'график работы',
'адрес',
'соц. сети',
'кнопка обратной связи',
],
navigation: [
'пункт меню…',
'пункт меню…',
'пункт меню…',
]
}
// Блок логотипа
{
logo: [
{ img: '…' },
{ text: '…' },
]
}
// Блок контактов
{
contacts: [
{ tel: '…' },
{ email: '…' },
{ schedule: '…' },
{ address: '…' },
{ socials: [
{ vk: '…' },
{ telegram: '…' },
{ instagram: '…' },
] },
{ map: '…' },
{ feedback: '…' },
]
}
// Блок навигации
{
navigation: [
{ item: '', link: '…' },
{ item: '', link: '…' },
{ item: '', link: '…' },
]
}
// Блок «Шапки»
{
header: [
{
logo: [] // Тут всё без изменений
},
{
contacts: [
'tel',
'email',
'schedule',
'address',
'socials',
'feedback',
]
},
{
navigation: [] // Тут тоже без изменений
}
]
}
// Блок «Подвала»
{
footer: [
{
logo: [] // Тут всё без изменений
},
{
navigation: [ // Тут почти без изменений
// …
'Марки автомобилей' // Без выпадающего списка
// …
]
},
{
contacts: [
'tel',
'email',
'address',
'socials',
'schedule', // Без иконки
]
},
]
}
// Блок логотипа
{
block: 'logo'
content: [
{ elem: 'img', src: '…' },
{ text: '…' },
]
}
// Блок контактов
{
block: 'contacts'
content: [
{ elem: 'tel', content: '…' },
{ elem: 'email', content: '…' },
{ elem: 'schedule', content: '…' },
{ elem: 'address', content: '…' },
{ elem: 'socials', content: [
{ elem: 'vk', content: '…' },
{ elem: 'telegram', content: '…' },
{ elem: 'instagram', content: '…' },
] },
{ elem: 'map', content: '…' },
{ elem: 'feedback', content: '…' },
]
}
// Блок навигации
{
navigation: [
{ item: '', link: '…' },
{ item: '', link: '…' },
{ item: '', link: '…' },
]
}
// Блок «Шапки»
{
header: [
{
block: 'logo'
},
{
block: 'contacts',
// У этого блока определённо свой контент,
// будем отличать его от других вариантов
// этого блока с помощью модификатора
mods: { view: 'header' },
content: [
{ elem: 'tel' },
{ elem: 'email' },
{ elem: 'schedule' },
{ elem: 'address' },
{ elem: 'socials' },
{ elem: 'feedback' },
]
},
{
block: 'navigation',
// Этот блок по внешнему виду отличается от блока в «Подвале»,
// поэтому обозначим его модификатором
mods: { view: 'header' },
content: [
// …
// У одного пункта выпадающий список
{
elem: 'item',
item: 'Марки автомобилей',
elemMods: { dropdown: true },
content: [
// …
{ elem: 'subitem', item: 'Infinity', href: '…' }
]
},
// …
]
}
]
}
// Блок «Подвала»
{
footer: [
{
block: 'logo'
},
{
block: 'navigation',
mods: { view: 'footer' },
content: [ // Тут почти без изменений
// …
{ elem: 'Марки автомобилей', link: '…' }, // Без выпадающего списка
// …
]
},
{
contacts: [
'tel',
'email',
'address',
'socials',
{ elem: 'schedule', elemMods: { noIcon: true } }, // Без иконки
]
},
]
}
.page__section.page__section_view_feedback
.page__layout
.form.form_view_feedback.page__column_width_half (миксуем блок формы обратной связи и лэйаут 1/2 колонки)
…
.contacts_view_feedback.page__column_width_half
.contacts__info
.contacts__address
.contacts__email
.contacts__tel
.contacts__schedule
.contacts__map
<div class="card">
<div class="card__header">
<h2 class="card__header-title">Заголовок</h2>
</div>
<div class="card__footer">
<h2 class="card__footer-title">Заголовок</h2>
</div>
</div>
c-
, т. к. не вижу в нём никакого смысла.c-card-header
и c-card-footer
смысла особого не имеет, т. к. создаёт ложное впечатление, что эти блоки могут использовться за пределами блока c-card
.card__header
для описания их рзличий в зависимости от расположения:<div class="card">
<div class="card__header">
<h2 class="card__title card__title_position_header">Заголовок</h2>
</div>
<div class="card__footer">
<h2 class="card__title card__title_position_footer">Заголовок</h2>
</div>
</div>
card__title
в этом случае сгруппируют общие свойства, а в модификаторах опишутся различия.