Это правильная реализация соглашения о присвоении имен BEM для навигации?

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

<ul class="nav__list">
    <li class="nav__item">
        <a class="nav__link" href="#">Main item</a>
        <div class="nav__submenu">
            <div class="nav__group">
                <h3>Nav group</h3>
                <ul class="nav__group__list">
                    <li class="nav__group__item">
                        <a class="nav__group__link" href="#">Nav item</a>
                    </li>
                </ul>
            </div>
        </div>
    </li>
</ul>

2 ответа

Решение

Это всегда, хотя гнездиться глубоко. Вы не можете иметь Элемент Элемента в методологии БЭМ. Так это nav__group__list не правильно, может быть nav__group-list например.

Правильная разметка БЭМ может выглядеть примерно так.

<ul class="nav">
    <li class="nav__item">
        <a class="nav__link" href="#">Main item</a>
        <div class="nav__submenu">
            <div class="nav__group">
                <h3>Nav group</h3>
                <ul class="nav__group-list">
                    <li class="nav__group-item">
                        <a class="nav__group-link" href="#">Nav item</a>
                    </li>
                </ul>
            </div>
        </div>
    </li>
</ul>

Однако вы можете разделить "Список групп", особенно если он может быть использован в другом месте вашего проекта. Ваше меню с разделенными links-group Блок будет выглядеть примерно так:

<ul class="nav">
    <li class="nav__item">
        <a class="nav__link" href="#">Main item</a>
        <div class="nav__submenu">
            <div class="links-group">
                <h3 class="links-group__heading">Nav group</h3>
                <ul class="links-group__list">
                    <li class="links-group__item">
                        <a class="links-group__link" href="#">Nav item</a>
                    </li>
                </ul>
            </div>
        </div>
    </li>
</ul>

Я был там, и я знаю, что вы пытаетесь сделать - избегайте стилизации, вкладывая деньги за каждую цену. Поверьте мне, это не так. Старайтесь быть простыми, не бойтесь создавать элементы, предназначенные для вложения друг в друга, но не используйте вложенность второго уровня в своих именах, чтобы избежать "реально __long__class__names" и переименовывать все в случае, если вы хотите изменить структуру HTML, Думайте о БЭМ как о методе выделения компонентов, разбивая сложный пользовательский интерфейс на простые куски, которые легко понять и поддерживать. В вашем конкретном случае я бы, вероятно, пошел что-то вроде этого:

<nav class="nav">
    <ul class="nav__list">
        <li class="nav__item">
            <a class="nav__link" href="#">Main item</a>

            <div class="nav--submenu">
                <div class="nav__group">
                    <h3 class="nav__header">Nav group</h3>

                    <ul class="nav__list">
                        <li class="nav__item">
                            <a class="nav__link" href="#">Nav item</a>
                        </li>
                    </ul>
                </div>
            </div>
        </li>
    </ul>
</nav>

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

Другие вопросы по тегам