如何在不修改实际源代码的情况下覆盖Bootstrap mixin?

时间:2016-09-26 15:57:15

标签: twitter-bootstrap sass mixins

我正在使用Bootstrap 4,我想更改按钮悬停和活动状态的默认样式。那些不能用变量改变,因为它们在Sass mixins中是硬编码的。例如:

@mixin button-variant($color, $background, $border) {
  $active-background: darken($background, 10%);
  $active-border: darken($border, 12%);
  ...

为了获得我想要的风格,我需要变暗以减轻然后改变百分比。

我可以修改源代码,但听起来不是一个很好的维护解决方案。我也可以使用Bootstrap后包含的自定义css文件覆盖这些值,但是我基本上需要从Bootstrap复制粘贴整个按钮源并对其进行修改。因为有很多按钮变体,所以如果我可以包含对Bootstrap css的更改,将会有很多重写。

最佳解决方案是在编译之前覆盖Bootstrap中的整个按钮变量mixin,以便在编译的Bootstrap文件中只有我想要的CSS。最好的方法是什么?

4 个答案:

答案 0 :(得分:4)

通过在编译之前包含您自己的版本来覆盖mixin。

/scss/site.scss

// libraries
@import 'libraries/bootstrap/bootstrap';

// your custom sass files
@import 'overrides/bootstrap/mixins';

/scss/overrides/bootstrap/mixins.scss

@mixin button-variant($color, $background, $border) {
  $active-background: darken($background, 10%);
  $active-border: darken($border, 12%);
  ...

答案 1 :(得分:3)

使用它们后覆盖bootstrap mixins似乎不起作用 - 就像这个问题描述的那样: https://github.com/sass/sass/issues/240

所以我最终修改了bootstrap主源文件。这不是一个美丽的解决方案,但需要,因为订单很重要。就我而言,它看起来像这样(' bootstrap-sass / assets / stylesheets / bootstrap'):

/*!
 * Bootstrap v3.3.7
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT
 */

// Core variables and mixins
@import "own_variables";
@import "bootstrap-sass/assets/stylesheets/bootstrap/variables";
@import "bootstrap-sass/assets/stylesheets/bootstrap/mixins";
@import "own_mixins";

// ... rest of bootstrap includes which use the mixins to create classes

答案 2 :(得分:1)

要覆盖混合,最简单,最干净的方法是:

  1. 将文件bootstrap.scss复制到您自己的自定义文件夹中:

    @import "functions";
    @import "variables";
    @import "mixins";
    @import "root";
    etc...
    
  2. 调整文件路径并在列表中添加您自己的文件

    @import "../../bootstrap-4.4.1-dist/scss/functions";
    @import "../../bootstrap-4.4.1-dist/scss/variables";
    @import "../../bootstrap-4.4.1-dist/scss/mixins";
    @import "bs-mixins";  <--- put your customized mixins file after the bootstrap mixins
    @import "../../bootstrap-4.4.1-dist/scss/root";
    etc...
    

这里列出所有必需的引导程序功能很有意义。如果您不需要所有功能,也可以进行清理,以减少CSS占用空间。

答案 3 :(得分:0)

无需修改现有的引导程序文件。

最适合我的解决方案是将所有基本引导程序导入都包含在我自己的 bootstrap-custom.scss 文件中,并用我自己的文件交换原始 _mixins.scss 文件,除了我自定义的 _buttons.scss 之外,再次包括所有原始混合。