CSS 面试题 目录

请描述 BEM 命名规范的核心思想,并举例说明如何使用 BEM 组织 CSS 类名。

推荐答案

BEM 命名规范的核心思想是将 UI 组件划分为三个相互关联的部分:块(Block)、元素(Element)和修饰符(Modifier)。

  • 块(Block): 独立的、可复用的组件,代表一个高级别的抽象概念。例如,buttonmenuform 等。
  • 元素(Element): 块的组成部分,依赖于块的存在才有意义。例如,button__textmenu__itemform__input 等。
  • 修饰符(Modifier): 块或元素的状态或变体。例如,button--primarymenu__item--activeform__input--error 等。

使用 BEM 组织 CSS 类名时,类名采用 block__element--modifier 的形式,通过 __ 连接块和元素,通过 -- 连接块/元素和修饰符。

示例:

-- -------------------- ---- -------
------- ------------- -----------------
  ----- -------------------------- ---------
---------

--- -------------
  --- ----------------- ---------------------- ----------------------
  --- --------------------- -----------------------
-----

----- -------------
  ------ ----------- ------------------ ------------------- ------------------ ---- ------
  ------- ------------------------------------
-------

本题详细解读

BEM 的意义

BEM (Block, Element, Modifier) 是一种流行的 CSS 命名约定,旨在提高 CSS 的可维护性、可复用性和可读性。 它的核心目标是解决 CSS 样式命名混乱、层级过深、样式冲突等问题。通过明确地定义组件的结构和状态,BEM 可以帮助开发者编写出更清晰、更易于理解和修改的 CSS 代码。

BEM 的核心概念

  • 块(Block):

    • 代表独立的、功能完整的 UI 组件。
    • 块名应该简洁明了,描述组件的用途。
    • 块名通常使用小写字母和连字符 - 来表示,例如 headerarticleproduct-card
    • 块是 BEM 命名规范的根基,所有元素和修饰符都依赖于块。
  • 元素(Element):

    • 是块的组成部分,例如,块(button)的元素可以是(button__text)或(button__icon)。
    • 元素名称需要清晰描述它在块中的作用。
    • 元素名称需要以两个下划线 __ 连接块名和元素名。例如 button__text
    • 元素不能独立于块而存在。
  • 修饰符(Modifier):

    • 用来描述块或元素的不同状态或变体,如大小、颜色、样式、激活状态等。
    • 修饰符名称需要描述它所修改的状态或样式。
    • 修饰符名称需要以两个连字符 -- 连接块/元素名和修饰符名。 例如, button--disabledbutton__text--bold
    • 修饰符可以附加到块或元素上。

BEM 的优点

  • 可维护性: BEM 明确了 CSS 样式的结构,使得代码更容易理解和维护。通过类名可以快速定位到对应的组件和状态,避免了样式冲突和层叠问题。
  • 可复用性: BEM 鼓励编写模块化和可复用的组件,提高了代码的复用率,减少了重复代码的编写。
  • 可读性: BEM 的类名结构清晰,易于理解和记忆。即使是大型项目,也可以通过 BEM 的类名快速理解 CSS 样式。
  • 避免样式冲突: 由于 BEM 使用明确的类名结构,避免了 CSS 样式选择器的层级过深,减少了样式冲突的风险。
  • 团队协作友好: BEM 的一致性命名约定使得团队成员更容易理解和维护彼此的代码。

总结示例

以下面的 html 结构为例,演示如何使用 BEM 命名:

在这个示例中:

  • card 是一个块,代表一个卡片组件。
  • card__imagecard__titlecard__descriptioncard__buttoncard 块的元素。
  • card__button--primarycard__button 元素的一个修饰符,表示主按钮样式。

遵循 BEM 命名规范可以使 CSS 代码更加有条理,易于维护和扩展。

纠错
反馈