【问题标题】:How to compile bootstrap scss to only contain the extended classes如何编译引导 scss 以仅包含扩展类
【发布时间】:2019-05-19 18:21:40
【问题描述】:

如何将我的自定义引导 SCSS 文件编译为仅包含我在自定义文件中创建的类的 CSS 文件?

例如。我正在尝试删除添加到我的 HTML 中的额外 CSS 类。

而不是编写以下 HTML:

<h4 class="border-bottom p-2 mb-4">
    Blah Blah
    <span class="badge badge-secondary badge-pill float-right">100</span>
</h4>

我正在尝试编写(删除所有类属性):

<h4>
    Blah Blah
    <span>100</span>
</h4>

为此,我创建了一个 custom.scss 文件,其内容如下:

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities/borders";
@import "bootstrap/scss/utilities/spacing";
@import "bootstrap/scss/utilities/float";
@import "bootstrap/scss/badge";

h4 {
    @extend .border-bottom;
    @extend .p-2;
    @extend .mb-4;
}

h4 span {
    @extend .float-right;
    @extend .badge;
    @extend .badge-pill;
    @extend .badge-secondary;
}

编译后的 CSS 文件包含 1000+ 行 CSS?为什么?

它包含诸如“badge-dark”之类的东西,所有的填充和边距等,我不想使用也不需要它们。如何摆脱它?我只需要一个包含我在 custom.scss 文件中编写的相关 CSS 指令的 CSS。

我想的结果应该是这样的:

h4 {
  border-bottom: 1px solid #dee2e6 !important;
  margin-bottom: 1.5rem !important;
  padding: 0.5rem !important;
}

h4 span {
  float: right !important;
  display: inline-block;
  padding: 0.25em 0.4em;
  font-size: 75%;
  font-weight: 700;
  line-height: 1;
  text-align: center;
  white-space: nowrap;
  vertical-align: baseline;
  border-radius: 0.25rem;
  h4 span:empty {
    display: none;
  }

  padding-right: 0.6em;
  padding-left: 0.6em;
  border-radius: 10rem;
  color: #fff;
  background-color: #6c757d;

  h4 span[href]:hover, h4 span[href]:focus {
    color: #fff;
    text-decoration: none;
    background-color: #545b62;
  }
}

但事实并非如此。

编辑:

如果我将 custom.scss 更改为如下内容:

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/mixins";

$theme-colors: (
    "secondary":  $secondary,
);

h4 {
    border-bottom: $border-width solid $border-color;
    padding: map_get($spacers, 2);
    margin-bottom: map_get($spacers, 4);
}

@import "bootstrap/scss/badge";

h4 span {
    @include float-right;
    @extend .badge;
    @extend .badge-pill;
    @extend .badge-secondary;
}

生成的 CSS 将主要包含所需的样式。但我认为可以依靠引导类而不是通过引导 SCSS 搜索并获取所需的东西并以某种方式将其合并到我的 custom.scss 中。我认为这会更容易吗?

【问题讨论】:

    标签: css sass bootstrap-4 mixins


    【解决方案1】:

    您的代码有效,但您扩展的是类而不是占位符。这是最大的不同,在这里。

    扩展类示例(您的情况)

    .border-bottom {
      border-bottom: 1px solid #dee2e6 !important;
    }
    
    h4{
      @extend .border-bottom;
    }
    

    结果是一组 CSS 规则,因为您的 CSS 中还存在 .border-bottom 类:

    .border-bottom, h4 {
      border-bottom: 1px solid #dee2e6 !important;
    }
    

    有了placeholder,情况就不同了:

    %border-bottom {
      border-bottom: 1px solid #dee2e6 !important;
    }
    
    h4{
      @extend %border-bottom;
    }
    

    结果如你所愿,我想:

    h4 {
      border-bottom: 1px solid #dee2e6 !important;
    }
    

    我在这里找到了一篇关于这种差异的非常好的文章:http://thesassway.com/intermediate/understanding-placeholder-selectors

    因此,当您导入所有这些 Boostrap4 文件时,Scss 会创建所有用于扩展的 .class 规则(为此,您有 1000 多条代码行)。

    然后,例如,当您编写以下代码时:

    h4 {
        @include float-right;
        @extend .badge;
        @extend .badge-pill;
        @extend .badge-secondary;
    }
    

    您的结果将是:

    h4 {
      float: right !important; /* your @include */
    }
    

    还有:

    .badge-secondary, h4 {...}
    
    .badge-pill, h4 {...}
    
    .btn .badge, .btn h4 {...}
    
    .badge:empty, h4:empty {...}
    
    .badge-secondary[href]:hover, h4[href]:hover, .badge-secondary[href]:focus, h4[href]:focus {...}
    
    .badge, h4 {...}
    

    【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多