html - 如何使用 BEM 方法为自适应网页构建 css?

标签 html css less bem adaptive-layout

将 BEM 用于固定布局很容易。具有媒体查询的自适应网页的 css 样式结构是什么?

html 示例:

<div class="t-news">
    <div class="t-news__post b-post">
        <div class="b-post__title"></div>
        <div class="b-post__text--green"></div>
    </div>
    <div class="t-news__post b-post--small">
        <div class="b-post__title"></div>
        <div class="b-post__text--red"></div>
    </div>
</div>

少样本:

.t-news {
     &__post {
         //some styles
     }
}
.b-post {
     &__title {
         //some styles
     }
     &__text {
         //some styles

         &--red {
              //some styles
         }
         &--green {
              //some styles
         }
     }

     &--small {
         //some styles
     }
}
  • .t-news - 页面模板。它是一个 block ,用于定义内部 block 的位置。
  • .b-post - BEM block
  • .b-post__title - b-post 的 BEM 元素
  • .b-post__text--red - b-post 的 b-post__text 的 BEM 修饰符

我应该将媒体查询放在 block 内还是 block 外?

最佳答案

根据我的经验,我意识到为了灵 active 和模块化, block 不应该对其宽度或边距负责。在元素中使用“flex ” block 可以使它们成为 moved around在不破坏功能或布局的情况下占据页面的不同区域(具有不同大小)。至于边距,如果在更高级别上定义它们,则更容易在 block 之间保持一致的空间:模板 block ,我假设,t-news 是(考虑到“t”是为了模板)。

BEM 完全是关于模块化的,与特定 block 相关的每一段代码都保留在 block 的文件夹中 file system ,所以它不应该与媒体查询不同,媒体查询只是 CSS 的一部分。重要的是要知道 CSS 在做什么,例如:如果一组规则在模板中定义区域和边距,无论是否需要媒体查询,这些规则都应该是 block 的一部分负责这些定义。

这种方法可能会生成大量媒体查询,并且可能会影响渲染性能,但是,根据 this article ,只有当它们彼此不同时,多个媒体查询才可能影响性能。相同规则的重复,如 @media (max-width: 850px),将被序列化并解释为一个。

这样,与区域和边距相关的媒体查询进入模板 block ,而与组件本身相关的其他媒体查询进入组件 block 。由于模板负责大小,因此我会将您示例中的“小”修饰符更改为模板 block 。

此外,我会重新考虑使用 greenred 作为修饰符,因为颜色可能会在元素的生命周期中发生变化。我建议尝试一些不描述元素外观的东西,比如 correctalert

最后,请记住修饰符应该跟在 HTML 中的元素类之后,例如 b-post__text b-post__text--alert

这是您更新后的代码:

HTML:

<div class="t-news">
    <div class="t-news__post b-post">
        <div class="b-post__title">Title 1</div>
        <div class="b-post__text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam eget ligula eu lectus lobortis condimentum. Aliquam nonummy auctor massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla at risus. Quisque purus magna, auctor et, sagittis ac, posuere eu, lectus. Nam mattis, felis ut adipiscing.</div>
    </div>
    <div class="t-news__post b-post">
        <div class="b-post__title">Title 2</div>
        <div class="b-post__text b-post__text--correct">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam eget ligula eu lectus lobortis condimentum. Aliquam nonummy auctor massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla at risus. Quisque purus magna, auctor et, sagittis ac, posuere eu, lectus. Nam mattis, felis ut adipiscing.</div>
    </div>
    <div class="t-news__post t-news__post--small b-post">
        <div class="b-post__title">Title 3</div>
        <div class="b-post__text">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
    </div>
    <div class="t-news__post t-news__post--small b-post">
        <div class="b-post__title">Title 4</div>
        <div class="b-post__text b-post__text--alert">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
    </div>
</div>

Scss:

.t-news {
    display: flex;
    flex-flow: row wrap;
    justify-content: flex-start;
    margin: -0.5rem;

    &__post {
        margin: 0.5rem;
        width: calc(50% - 1rem);
        @media (max-width: 800px) { width: calc(100% - 1rem); }

        &--small {
            width: calc(25% - 1rem);
            @media (max-width: 800px) { width: calc(50% - 1rem); }
        }
    }
}

.b-post {
    box-sizing: border-box;
    border: 1px solid #eeb;
    background: #ffc;
    padding: 0.5rem;

    &__title {
        font-size: 1.5rem;
        @media (max-width: 800px) { font-size: 1.25rem; }
    }

    &__text {
        font-size: 1rem;

        &--correct {
            color: green;
        }

        &--alert {
            color: red;
        }
    }

    &--small {
        border: none;
        font-style: italic;
    }
}

希望这对您有所帮助。

关于html - 如何使用 BEM 方法为自适应网页构建 css?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968973/

相关文章:

html - css 宽度、最大宽度、高度不起作用

jquery - 当屏幕尺寸改变时如何停止这个 jQuery 运行?

html - 使用正则表达式查找嵌套的 XML 标记

html - 通过点击更改 <li> 样式

css - :targeting sibling? sibling 的过渡高度

javascript - 有没有办法在长时间运行的 JavaScript 操作之前强制回流?

css - LESS:从变量中减去

twitter-bootstrap - 如何开始使用 LESS 自定义 Bootstrap 3?

html - 使用框阴影和边框自定义 JQuery Mobile ListView

javascript - 我可以用 LESS 做到这一点吗?