18

我正在使用 BEM 方法来编写 html + css。使用这种语法:

  • 块:block_name
    • 元素:block_name__element_name
    • 修饰符:block_name__element_name--修饰符

当我在另一个街区中有一个街区时,我会感到困惑。例如,在标题中,我希望标题是我可以引用的块,而导航和徽标是块。我想将那些导航和徽标块引用为 site_header 中的。但是,我该怎么写呢?像 block_name__sub_block_name 这样的链接块似乎很长。

有没有人有一个典型的方式来写这个例子?

<div class="site_header__logo">
    <a class="site_header__logo__link">
        <img class="site_header__logo__image">
    </a>
</div>

<nav class="site_header__main_nav">
    <ul>
        <li class="site_header__main_nav__item">
            <a class="site_header__main_nav__link">Home</a>
        </li>
        <li class="site_header__main_nav__item">
            <a class="site_header__main_nav__link">About Us</a>
        </li>
        <li class="site_header__main_nav__item">
            <a class="site_header__main_nav__link">Contact Us</a>
        </li>
    </ul>
</nav>

<div class="site_header__phone">
    <p class="site_header__phone__number">
        555.555.5555
    </p>
</div>

4

3 回答 3

16

我认为徽标、主标题和电话符合blockBEM 网站中给出的定义:

块是一个独立的实体,是应用程序的“构建块”。块可以是简单的也可以是复合的(包含其他块)。

您所拥有的是复合块 (site_header) 中的三个简单块(徽标、main_nav 和电话)。它实际上与BEM 方法定义页面上作为示例给出的 HEAD 复合块非常相似。

所以我会这样写:

<div class="logo">
    <a class="logo__link">
        <img class="logo__image">
    </a>
</div>

<nav class="main_nav">
    <ul>
        <li class="main_nav__item">
            <a class="main_nav__link">Home</a>
        </li>
        <li class="main_nav__item">
            <a class="main_nav__link">About Us</a>
        </li>
        <li class="main_nav__item">
            <a class="main_nav__link">Contact Us</a>
        </li>
    </ul>
</nav>

<div class="phone">
    <p class="phone__number">
        555.555.5555
    </p>
</div>

如果您认为“logo”作为一个名称过于笼统,并且不能代表项目中的其他类型的徽标,请随意给它一个不同的名称,例如“company_logo”。

在样式方面,BEM 建议使用块修饰符和元素修饰符来表示它们的不同样式。例如,如果你想让你的电话号码以粗体显示,那么你可以在 CSS 中为它创建一个类修饰符并将其应用到你的 HTML 中,如下所示:

.phone__number--bold {
    font-weight: bold;
}

<div class="phone">
    <p class="phone__number phone__number--bold">
        555.555.5555
    </p>
</div>

修饰符是其他块中样式块的首选方式。所以要这样做:

.site_header .phone__number {
    font-weight: bold;
}

我认为有一个例外,那就是当你想给里面的块提供“位置相关的样式”时。假设您想为“logo”块留出左边距。而不是创建如下修饰符:

.logo--push_20 {
    margin-left: 20px;
}

最好遵循OOCSS 第二个原则——分离容器和内容——把工作交给容器:

.site_header .logo {
    margin-left: 20px;
}
于 2014-03-30T20:33:57.087 回答
16

您还可以查看BEM 的常见问题解答

另一个元素中的元素的类名是什么?.block__elem1__elem2?

如果我的块具有复杂的结构并且它的元素是嵌套的,我该怎么办?CSS 类block__elem1__elem2__elem3看起来很吓人。根据边界元法,块结构应该是扁平的;您不需要反映块的嵌套 DOM 结构。因此,这种情况下的类名将是:

.block{}
.block__elem1{}
.block__elem2{}
.block__elem3{}

而块的 DOM 表示可能是嵌套的:

<div class='block'>
    <div class='block__elem1'>
        <div class='block__elem2'>
            <div class='block__elem3'></div>
        </div>
    </div>
</div>

除了类看起来更好之外,它使元素仅依赖于块。因此,在对界面进行更改时,您可以轻松地将它们移动到整个块中。块 DOM 结构的更改不需要对 CSS 代码进行相应的更改。

<div class='block'>
    <div class='block__elem1'>
        <div class='block__elem2'></div>
    </div>
    <div class='block__elem3'></div>
</div>
于 2015-08-25T18:47:35.847 回答
-3

是的,您可以在类名中删除很多内容。例如:

HTML:

`

<nav class="site_header">
    <ul>
        <li class="nav_item">
            <a class="nav_link">Home</a>
        </li>
        <li class="nav_item">
            <a class="nav_link">About Us</a>
        </li>
        <li class="nav_item">
            <a class="nav_link">Contact Us</a>
        </li>
    </ul>
</nav>

`

然后在你的 CSS 中放:

`

.site_header { 
    ... stuff ...
}

.site_header .nav_item {
    ... nav_item stuff ...
}

.site_header .nav_link {
    ... nav_link stuff ...
}

`

于 2014-03-28T21:16:13.557 回答