重新认识 CSS--BEM核心概念

概要

从狭义上来讲,BEM就是一套CSS的命名规则,将CSS的命名分解为 Block, Element, Modifier 三个部分,即 块(block)、元素(element)、修饰符(modifier)。它是由Yandex团队提出的一种前端命名方法论。这种巧妙的命名方法让你的CSS类对其他开发者来说更加透明且更有实际的意义。block 代表了更高级别的抽象或组件。block__element 代表.block的后代,用于形成一个完整的.block的整体。block--modifier代表.block的不同状态或不同版本。BEM命名约定更加严格,而且包含更多的信息,它们主要用于团队开发一个耗时的大项目。

块Block

页面上逻辑与功能独立的组件等同于 Wwb 组件。一个块中,封装了行为(JavaScript),模板,样式(CSS)和其它一些实现技术。一个独立的块可以被重用,以及推进项目的开发与维护。
一个块可以嵌套在另一个块中。比如,一个head块可以包含一个标识(logo),一个导航菜单(nav)和一个用户信息块(profile)。

元素Element

不能用于块之外的组成成分。例如一个菜单项(menu item)不能在一个菜单块(menu block)外面使用,所以他是一个元素。

修饰语Modifier

一个 BEM 实体定义了一个块或者元素的外观与行为。
修饰语的使用并不是必须的。
修饰语本质与与 HTML 的属性(attribute)相似。同样的块因为使用了修饰语而变得不一样了。
比如,菜单块(menu)外观的改变依赖于他使用的修饰语。

BEM树

一个页面在结构方面表现为许多的块,元素与修饰语。这是 DOM 树的一种抽象表示,用来描述 BEM 实体的名称,状态,顺序,嵌套与辅助数据。在实际项目中,BEM 树可以用任意的格式描述,但推荐使用树型结构。假设有一个这样的 DOM 树:

<header class="header">
    <img class="logo">
    <form class="search-form">
        <input type="input">
        <button type="button"></button>
    </form>
    <ul class="lang-switcher">
        <li class="lang-switcher__item">
            <a class="lang-switcher__link" href="url">en</a>
        </li>
        <li class="lang-switcher__item">
            <a class="lang-switcher__link" href="url">ru</a>
        </li>
    </ul>
</header>

类似的 BEM 树看起来可能是这样:

header
    ├──logo
    └──search-form
        ├──input
        └──button
    └──lang-switcher
        └──lang-switcher__item
            └──lang-switcher__link
        └──lang-switcher__item
            └──lang-switcher__link

BEMJSON:

{
    block: 'header',
    content : [
        { block : 'logo' },
        {
            block : 'search-form',
            content : [
                { block : 'input' },
                { block : 'button' }
            ]
        },
        {
            block : 'lang-switcher',
            content : [
                {
                    elem : 'item',
                    content : [
                        { elem : 'link' }  
                    ]
                },
                {
                    elem : 'item',
                    content : [
                        { elem : 'link' }
                    ]
                }
            ]
        }
    ]
}
posted @ 2021-07-28 21:32  Elwin0204  阅读(99)  评论(0编辑  收藏  举报