html - 使用多个类 vs @extend

标签 html css sass bem

编辑:

问这个问题后,我不仅意识到每个修饰符类只能有一个修饰符,而且我还发现 the BEM website itself recommends using extra classes for modifiers ,所以我正式采用了这种方法。


我已经将 SASS 与 BEM 一起使用了一段时间,我想知道使用多个类作为修饰符与 @extend 各自的 block 的优缺点是什么/元素类。有没有一种比另一种更受青睐? (考虑到我不会在 @media 查询中包含类 [它甚至应该重要吗?])

多个类的例子:

<div class="btn btn--admin btn--primary">

对比

@extend-ing 示例:

.btn {
    // ...
}

.btn--admin {
    @extend .btn

    // ...
}

.btn--primary {
    @extend .btn

    // ...
}

最佳答案

编辑 一开始我没明白问题的重点。解释完后,这是我的答案。

结果是一样的,但是使用多个类作为修饰符可以在非 css 编译或编辑方式中提供更精细的控制(您可以更改元素属性,而无需重新编译 sass 代码或编辑您的 css)。它还将提供更详细的 html 代码阅读。通过阅读 btn btn-primary disabled,您将知道,无需使用检查器或转到 css 代码,您有一个具有 btn-primary 样式的按钮并且该按钮被禁用。与扩展其余类的单个类 button 相比,您可以获得更多信息。例如,如果其他人要使用您的代码或在您的元素/网站上工作或构建易于使用的框架,这是一种更合适的方法。

如果它只是用于维护/更新较少的小型元素/网站,使用扩展也是一个不错的选择。有时不需要为每个元素用很多类来填充 html。

第一种方法会产生更小的 css 和更冗长的 html。第二个选项会增加你的 css 大小,同时创建更“抽象”的代码阅读。


使用多个类比扩展基类甚至非填充扩展(定义为 %myextend { ... })更依赖于范围。

考虑以下场景:您有多个类,它们在不同的嵌套级别(或范围)和事件通过不同的断点共享一些属性。使用多个类定义将需要大量代码和异常才能将所有类组合在一起,并且需要您复制代码(以防跨多个媒体查询共享相同代码)。

.base,
.parent .another,
.more-clases {
    // shared properties
}
@media (your-query) {
    .specific-query-class {
        //shared properties (repeated)
    }
}

在那种情况下,您将无法像使用 @extend 那样将所有类定义分组到一个定义范围内:

%my-extend {
    // shared properties
}

.base,
.parent .another,
.more-clases {
    @extend %my-extend;
}
@media (your-query) {
    .specific-query-class {
        @extend %my-extend;
    }
}

这将允许在不同的嵌套级别和媒体查询定义之间共享/分组属性 block ,而无需重复您的代码块。

使用 % 而不是 . 定义扩展将允许在不同的嵌套级别和媒体查询定义之间共享属性 block 。扩展的主要定义不会被编译为 css:定义 block 将被复制到所有扩展规则。使用 . 定义会将邮件属性 block 输出到 css 并将所有扩展类组合在一起,但使用这种类型的扩展,您可以通过不同的媒体查询进行扩展。

希望对您有所帮助。

关于html - 使用多个类 vs @extend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50557603/

相关文章:

html - 防止突出显示 CSS::before Content

javascript - Php/Javascript 未捕获语法错误 : Unexpected identifier

CSS如何让一个div在右边,一个div恰好在中间?

html - 如何在 Bootstrap 的小屏幕上将中间的 div 推到顶部

php - 即使在 Head 标签之间链接之后,CSS 也不会反射(reflect)到 php 页面

javascript - 如何使用 css 为具有 JS 生成的类名的元素设置样式?

javascript - webpack - 将每个 scss 编译成同名的 css 文件

php - 单击我的提交按钮时没有任何反应 没有 _POST 值

javascript - 依赖下拉列表

javascript - JQuery:基于行的表行显示/隐藏