Всем шалом!
На днях читал, как ни странно, советы от гугл по оптимизации, там увидел БЭМ (чтобы не допускать каскадность), и дабы не терять время, я решил освоить его, я тут. И у меня вопрос:
Существуют повторяющиеся html5 теги, например header-ы, footer-ы, nav-ы, и вообще, я всё правильно разметил? :))
Пример:
<header class="header-main">
<nav class="nav-main">
<li class="nav-main__item">
<a class"nav-main__link" href="/">Я обычная ссылка</a>
</li>
<li class="nav-main__item">
<a class"nav-main__link nav-main__link_active" href="/">А я активная ссылка</a>
</li>
</nav>
<form class="form-header">
<input class="form-header__login" type="text">
<input class="form-header__email" type="email">
<button class="form-header__button form-header__button_red" type="reset"></button>
<button class="form-header__button form-header__button_blue" type="submit"></button>
</form>
</header>
<article class="any-class ">
<header class="header-post"> это же блок, не элемент?
<h3 class="header-post__title"></h3>
<a class="header-post__link"></a>
</header>
<footer class="footer-post">
<div class="footer-post__any-element "></div>
<a class"footer-post__link " href="/">сайт</a>
</footer>
<article>
<nav class="navigation-pages">
<ul class="navigation-pages__ul">
<li class="navigation-pages__item">
<a class="navigation-pages__link"></a>
<a class="navigation-pages__link_current">Текущая</a>
</li>
</ul>
</nav>
<footer class="footer" class="footer-bottom" или class"cellar">
<a class="footer-bottom__link">Ссылка подвала</a>
</footer>
Я могу разделять главный <header>
и для поста <header>
вот так:
<header class="header header_main"> с модификатором
<a class="header__link"></a>
</header>
<article>
<header class="header header_article"> другой модификатор
<a class="header__link "></a> могу я тут писать "header_article__link", чтобы различать с ссылкой в главной header (<header class="header header_main">) нельзя писать header c модификатором, а потом элемент - "header_article__link"?
</header>
</article>
Сей (2-й) подход с разными модификаторами ещё потребует каскад в CSS, в таком случае нужно в одинаковых html5 тегах и в тегах типо <form>
, писать разные классы, а не разные модификаторы?
Пытался с исходниках яндекс-проектов смотреть код, смотрел на DNS-yandex, punto-switcher, там только на дивах, меня интересовали html5 теги и nav > ul > li > a
, понимаю, что можно опустить html5 теги, которые повторяются, навигацию просто через <div> <a>
, опуская nav, ul и li, и т.д. но интересует c многими вложенностями и повторяющиеся.
И ещё на счёт каскадности, смотрел исходник DNS-yandex, там в классах "static-text" есть h2, h3, h4, без классов, соответственно - есть каскад, так каскад простителен? Его можно не всегда избегать? На гугл в советах по оптимизации написано, используйте методологию БЭМ, дабы избежать каскадности, чтобы увеличить скорость, говорилось, что каскадность - плохо для оптимизации. В связи с тем, что БЭМ на независимостях строится, чтобы не было конфликтов, а на яндекс-днс опустили классы в h2, h3, h4, ибо уверены, что конфликтов не будет, и опустили классы, сверстали на каскады - static-text h2. Но в чём тогда профит, в независимости, в оптимизации (не допускать каскады, где это можно), от чего плясать?
И есть тут, кто может дать ссылки на свои работы, дабы посмотреть примеры вёрстки по БЭМ.
Пардон за много букв. Заранее благодарю.
Привет, @APrinciple! На форуме действует markdown-разметка, я пару раз пытался поправить форматирование, но ты продолжаешь менять текст, так что у меня ничего не получилось.
Либо добавь форматирование (код нужно класть в три бектика (`) и название языка — в данном случае HTML), либо остановись, я сам расставлю.
Пардон, не знал, просто вносил заметку, чтобы отображает при выводе по-другому, когда два нижних подчёркивания.
Форматирование поправил.
Теперь по сути вопроса:
li
лежат вnav
, хотя должны быть вul
. Впрочем, добиваться валидности ради валидности не обязательно ;)header
мало что даст браузеру, поисковику или самому разработчику, а правильно подобранные БЭМ-сущности делают код надежным и читабельным сами по себе.По поводу
header-main
иheader-article
VSheader header_main
иheader header_article
следует руководствоваться такими размышлениями: если у разныхheader
есть что-то общее, то это общее можно записать в.header
, а отличия в соответствующие модификаторы — это позволит избавиться от копипаста. Если же они совершенно не похожи друг на друга, их действительно стоит сделать разными блоками. Но тут тогда возникает вопрос, точно ли в их названиях должно присутствовать словоheader
(тегheader
можно сохранить независимо от имени класса)?Отдельно про исходники на сервисах Яндекса. БЭМ — это как полезные советы про то, что нужно заниматься спортом, правильно питаться и поменьше смотреть телевизор. А в реальной жизни люди зачастую ведут себя наоборот, хотя знают, что сигареты — вредно, а овсянка и бег — полезно. Вот и с сервисами Яндекса примерно такая же история ;)
<a class="header__link "> в двух разных (по модификатору) header header_main и header header_article.
Как мне присваивать уникальность, могу указывать(писать) элемент, после модификатора —header_main__link и header_article__link
? Или в таком случае просто каскад header_main a?И большой ли вес в "минимум каскадности", в связи с тем, что браузеры постоянно улучшают свою производительность, как и девайсы?
Последнее порадовало, добавило ясности в мой неокрепший ум, который искал каноны)
Какскад плох не только тем что он медленней обрабатывается, но и тем, что его сложно поддерживать. Когда мы пишем код каскадом, мы завязываемся на вложенность элементов. и когда через пару месяцев ее придется поменять, все может рухнуть
Нет, так нельзя. @tadatuta это тоже надо в FAQ добавить.
И как тогда быть в таких случаях, например form-ы, которые в примере указываются. Их может быть 2-3. 1.
В CSS могу каскад:
form_ANY .form__input {style;}
Или как мне уникальность добавлять в таких случаях? Как мне правильно присвоить уникальность инпутам кform_ANY
, чтобы без каскада. Я могу инпутам во 2-й форме добавить модификаторы, чтобы отличать от инпутов в 1-й форме, но как их правильно указать, чтобы понимать, что они относятся (логически связаны) именно кform_ANY
? (Если не использовать каскад).Создавать во 2-й форме 2 блока, а не блок + модификатор?
Да, это правильный вариант. См. https://ru.bem.info/method/key-concepts/#Микс
@APrinciple не совсем правильный.
form-ANY__input
лучше все же заменить наform__input
. Верно, @tadatuta ?@zxqfox да, конечно
@zxqfox Приветствую! А как тогда присваивать инпутам, которые в форме form form-ANY, другие стили, которые отличаются от инпутов в другой форме? Писать каскад
``, если не использовать каскад, которые я написал в самом начале?form-ANY .form__input? или писать инпутам во 2-й форме модификатор — form__input form__input_any?
Как мне логически связывать инпуты во 2-й форме с формой, у которой класс `Есть ли у вас работы с разметкой БЭМ? Хочу поглазеть на примеры) Спасибо за замечание.
Правильно использовать миксы:
forminput form-ANYmy-shiny-input
Верно? Такой подход даёт возможность избегать повторения стилей для каждой формы, общие стили задаются классу
.form
, а потом миксом - добавляю нужные мне различия (изменения) добавляя класс.form-ANY__input
Плюс запись короче, а по мере надобности - удлиняю, добавляя классы с дополнительными (другими) стилями. Верно понимаю, именно поэтому нельзя сразуform-ANY__input
использовать?Да. В случае использования bem-components будет не form__input, а просто input:
input form-ANY__input
form-ANY__input можно использовать и отдельно, если так надо.