【问题标题】:How to structure css using BEM methodology for adaptive web pages?如何使用 BEM 方法为自适应网页构建 css?
【发布时间】:2016-10-24 10:49:30
【问题描述】:

将 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 - 页面模板。它是一个定义块内部位置的块。
  • .b-post - BEM 块
  • .b-post__title - b-post 的 BEM 元素
  • .b-post__text--red - b-post__text of b-post 的 BEM 修饰符

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

【问题讨论】:

  • 你到底在问什么?如何在 CSS 中最好地使用媒体查询? BEM 适用于“自适应”(这与响应式相同吗?)网站和媒体查询...查看此处的“命名断点”部分:sitepoint.com/css-sass-styleguide
  • 是的,我想知道同时使用媒体查询和 BEM 的最佳方法是什么。

标签: html css less bem adaptive-layout


【解决方案1】:

根据我的经验,我意识到,为了灵活性和模块化,块不应该对它们的宽度或边距负责。在项目中拥有“弹性”块允许它们成为moved around 以占据页面的不同区域(具有不同大小),而不会破坏功能或布局。至于边距,如果在更高级别上定义块之间的空间,则更容易保持一致的空间:我假设像 t-news 这样的模板块是(考虑到“t”代表模板)。

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

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

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

另外,我会重新考虑使用 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;
    }
}

希望这会有所帮助。

【讨论】:

  • 非常感谢您的反馈。我有一些问题:
  • ) 为什么你使用“margin: -0.5rem;”对于 t 新闻。我认为为块添加位置是一种不好的做法。只有父块可以设置其子块的位置。子块必须具有准确的大小。
  • 2) 我与一些开发人员交谈,我们讨论的结论是我们可以只使用“b-block__element--modifier”而不是“b-block__element b-block__element--modifier”,因为在less 我们可以指定“b-block__element, b-block__element--modifier {/*commons styles here*/}”。
  • 3) 每个块、某些元素和修饰符中的媒体查询看起来并不好,因为每个媒体查询都适用于浏览器。我不确定,但我认为大量的媒体查询会降低网站性能。
  • margin: -0.5rem 并不是真正需要的,我用它是我的项目来中和孩子们的边缘,比如t-news__post { margin: 0.5rem }。我尝试过其他技术,例如使用 nth-child 删除特定的左边距或右边距,但我发现这种方式更容易维护。我有一个例子:codepen.io/leofavre/pen/rebzqX?editors=1100
猜你喜欢
  • 2019-02-07
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2018-12-03
  • 2016-10-07
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
相关资源
最近更新 更多