根据 BEM 方法重构 HTML 和 CSS

标签 html css bem

<分区>


想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它.

关闭 8 年前

我想重构现有代码并实现 BEM 命名约定。

但是我在将代码转换为符合 BEM 约定/要求的标记时遇到困难, 尤其是嵌套元素。

我正在寻找以下问题的答案:

  1. 在 BEM 方法中命名嵌套元素的正确方法是什么?
  2. 我应该如何命名元素以使其在修改/嵌套中扩展并保持其可重用性?

现有代码:(Fiddle:http://jsfiddle.net/karltynan/msavvhp9/)

<header class="lHeader">
  <div class="lHeaderInner clearfix">
    <h1 class="lHeaderLogo"><a class="link" href="/">Site Name</a></h1>

    <nav class="lNav">
      <div class="lNavInner clearfix">
        <h1 class="lNavTitle">Menu</h1>
        <div class="lNavContent">
          <ul class="list clearfix">
            <li class="level1 home"><a class="link" href="/">Home</a></li>
            <li class="level1"><a class="link" href="/about/">About</a></li>
            <li class="level1 login alt"><a class="link" href="/about/">Login</a></li>
          </ul>
        </div>
      </div>
    </nav>

    <nav class="lSocial account">
      <div class="lSocialInner clearfix">
        <ul class="list clearfix">
          <li class="level1 twitter"><a class="link" href="#">Twitter</a></li>
          <li class="level1 facebook"><a class="link" href="#">Facebook</a></li>
          <li class="level1 googlePlus"><a class="link" href="#">Google+</a></li>
        </ul>
      </div>
    </nav>

  </div>
</header>

尝试的代码:(Fiddle:http://jsfiddle.net/karltynan/hd7r0n3a/)

<header class="header">
  <div class="header__inner clearfix">
    <h1 class="logo"><a class="link" href="/">Site Name</a></h1>

    <nav class="nav">
      <div class="nav__inner clearfix">
        <h1 class="nav__title">Menu</h1>
        <div class="nav__content">
          <ul class="menu clearfix">
            <li class="menu__item menu__item--home"><a class="link" href="/">Home</a></li>
            <li class="menu__item"><a class="link" href="/about/">About</a></li>
            <li class="menu__item menu__item--login menu__item--alt"><a class="link" href="/about/">Login</a></li>
          </ul>
        </div>
      </div>
    </nav>

    <nav class="social account">
      <div class="social_inner clearfix">
        <ul class="menu clearfix">
          <li class="menu__item menu__item--twitter"><a class="link" href="#">Twitter</a></li>
          <li class="menu__item menu__item--facebook"><a class="link" href="#">Facebook</a></li>
          <li class="menu__item menu__item--googlePlus"><a class="link" href="#">Google+</a></li>
        </ul>
      </div>
    </nav>

  </div>
</header>

最佳答案

使用另一种 BEM 语法:

<header class="Header">
  <div class="Header-inner ob-clearfix">
    <h1 class="Header-logo"><a class="ob-link" href="/">Site Name</a></h1>

    <nav class="Header-nav Nav">
      <div class="Nav-inner ob-clearfix">
        <h1 class="Nav-title">Menu</h1>
        <div class="Nav-content">
          <ul class="Menu ob-clearfix">
            <li class="Menu-li level1 home"><a class="ob-link" href="/">Home</a></li>
            <li class="Menu-li level1"><a class="ob-link" href="/about/">About</a></li>
            <li class="Menu-li level1 login alt"><a class="ob-link" href="/about/">Login</a></li>
          </ul>
        </div>
      </div>
    </nav>

    <nav class="Header-social Social">
      <div class="Social-inner ob-clearfix">
        <ul class="Menu ob-clearfix">
          <li class="Menu-li level1 twitter"><a class="ob-link" href="#">Twitter</a></li>
          <li class="Menu-li level1 facebook"><a class="ob-link" href="#">Facebook</a></li>
          <li class="Menu-li level1 googlePlus"><a class="ob-link" href="#">Google+</a></li>
        </ul>
      </div>
    </nav>
  </div>
</header>

我在 an article in french 中描述了这种语法:

  • 组件名称
  • 组件名称.修饰符名称
  • ComponentName-descendantName
  • ComponentName-descendantName.modifierName

组件是 block ,后代是元素。

“Header-nav”和“Header-social”类应该用于在“Header”中定位“Nav”和“Social”。

关于“ob-clearfix”的注意事项:修饰符的样式不应与其组件无关,因为它不符合 BEM 方法。因此,对于像 OOCSS 对象这样的横向类,这是我使用的语法:

  • myPrefix-...

关于根据 BEM 方法重构 HTML 和 CSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25685141/

上一篇:html - 元素从父元素继承样式,即使以其他方式显式定义也是如此

下一篇:css - 如何更改 DataView 的行数和图像文本对齐方式

相关文章:

php - 使用文件下载将数据从数据库导出到csv

jquery - 使用 css 或 jquery 创建倾斜 45 度并与底部对齐的列表

javascript - 如何使用 javascript、jquery 或 css 为模态调整大小设置动画?

html - 在没有固定高度的 HTML/inlineSVG 中将文本旋转 270°?

html - Grunt dist 注释掉 css 文件

css - 首先使用 BEM。我做错了什么?

sass - 是否可以在扩展的 Sass 类中包含父属性?

jquery - jsTree默认箭头/三 Angular 形图标配置

javascript - 单击更改字形图标

sass - 带有父选择器的 BEM 嵌套 SCSS 会破坏 Sublime Text 语法突出显示吗?