跳至主要内容 跳至文档导航

利用我们的源 Sass 文件,充分利用变量、映射、混合和函数,以帮助您更快地构建和自定义您的项目。

利用我们的源 Sass 文件,充分利用变量、映射、混合等。

文件结构

尽可能避免修改 Bootstrap 的核心文件。对于 Sass,这意味着创建您自己的样式表,导入 Bootstrap,以便您可以修改和扩展它。假设您使用的是 npm 等包管理器,那么您的文件结构将如下所示

your-project/
├── scss/
│   └── custom.scss
└── node_modules/
│   └── bootstrap/
│       ├── js/
│       └── scss/
└── index.html

如果您已下载我们的源文件,并且未使用包管理器,则需要手动创建类似于该结构的内容,将 Bootstrap 的源文件与您自己的文件分开。

your-project/
├── scss/
│   └── custom.scss
├── bootstrap/
│   ├── js/
│   └── scss/
└── index.html

导入

在您的 custom.scss 中,您将导入 Bootstrap 的源 Sass 文件。您有两个选择:包括所有 Bootstrap,或选择您需要的部分。我们鼓励后者,但请注意我们的组件之间存在一些要求和依赖关系。您还需要为我们的插件包含一些 JavaScript。

// Custom.scss
// Option A: Include all of Bootstrap

// Include any default variable overrides here (though functions won't be available)

@import "../node_modules/bootstrap/scss/bootstrap";

// Then add additional custom code here
// Custom.scss
// Option B: Include parts of Bootstrap

// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)
@import "../node_modules/bootstrap/scss/functions";

// 2. Include any default variable overrides here

// 3. Include remainder of required Bootstrap stylesheets (including any separate color mode stylesheets)
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/variables-dark";

// 4. Include any default map overrides here

// 5. Include remainder of required parts
@import "../node_modules/bootstrap/scss/maps";
@import "../node_modules/bootstrap/scss/mixins";
@import "../node_modules/bootstrap/scss/root";

// 6. Optionally include any other parts as needed
@import "../node_modules/bootstrap/scss/utilities";
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
@import "../node_modules/bootstrap/scss/images";
@import "../node_modules/bootstrap/scss/containers";
@import "../node_modules/bootstrap/scss/grid";
@import "../node_modules/bootstrap/scss/helpers";

// 7. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss`
@import "../node_modules/bootstrap/scss/utilities/api";

// 8. Add additional custom code here

设置好后,您就可以开始修改 custom.scss 中的任何 Sass 变量和映射。您还可以根据需要在 // Optional 部分下开始添加 Bootstrap 的部分。我们建议使用 bootstrap.scss 文件中的完整导入堆栈作为您的起点。

编译

为了在浏览器中将自定义 Sass 代码用作 CSS,您需要一个 Sass 编译器。Sass 作为 CLI 包提供,但您也可以使用其他构建工具(如 GulpWebpack)或 GUI 应用程序对其进行编译。一些 IDE 也有内置的 Sass 编译器或可下载的扩展。

我们喜欢使用 CLI 来编译我们的 Sass,但您可以使用您喜欢的任何方法。从命令行运行以下命令

# Install Sass globally
npm install -g sass

# Watch your custom Sass for changes and compile it to CSS
sass --watch ./scss/custom.scss ./css/custom.css

sass-lang.com/install 了解有关您的选项的更多信息,并使用 VS Code 编译

使用其他构建工具与 Bootstrap?不妨阅读我们的指南,了解如何使用 WebpackParcelVite 进行编译。我们还在 GitHub 上的示例存储库 中提供了可用于生产的演示。

包括

编译 CSS 后,您可以在 HTML 文件中包含它。在 index.html 中,您需要包含已编译的 CSS 文件。如果您已更改已编译 CSS 文件的路径,请务必更新该路径。

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Custom Bootstrap</title>
    <link href="/css/custom.css" rel="stylesheet">
  </head>
  <body>
    <h1>Hello, world!</h1>
  </body>
</html>

变量默认值

Bootstrap 中的每个 Sass 变量都包含 !default 标志,允许您在自己的 Sass 中覆盖变量的默认值,而无需修改 Bootstrap 的源代码。根据需要复制并粘贴变量,修改其值并删除 !default 标志。如果已分配变量,则 Bootstrap 中的默认值不会重新分配该变量。

您可以在 scss/_variables.scss 中找到 Bootstrap 变量的完整列表。某些变量设置为 null,这些变量仅在您的配置中覆盖它们时才输出属性。

变量覆盖必须在导入我们的函数之后,但在其他导入之前。

以下是一个示例,它通过 npm 导入和编译 Bootstrap 时更改 <body>background-colorcolor

// Required
@import "../node_modules/bootstrap/scss/functions";

// Default variable overrides
$body-bg: #000;
$body-color: #111;

// Required
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/variables-dark";
@import "../node_modules/bootstrap/scss/maps";
@import "../node_modules/bootstrap/scss/mixins";
@import "../node_modules/bootstrap/scss/root";

// Optional Bootstrap components here
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
// etc

对于 Bootstrap 中的任何变量(包括以下全局选项),根据需要重复此操作。

使用我们的启动项目通过 npm 开始使用 Bootstrap!前往 Sass & JS 示例 模板存储库,了解如何在自己的 npm 项目中构建和自定义 Bootstrap。包括 Sass 编译器、Autoprefixer、Stylelint、PurgeCSS 和 Bootstrap 图标。

映射和循环

Bootstrap 包含一些 Sass 映射,键值对使生成相关 CSS 系列变得更加容易。我们使用 Sass 映射来表示我们的颜色、网格断点等。与 Sass 变量一样,所有 Sass 映射都包含 !default 标志,并且可以被覆盖和扩展。

默认情况下,我们的某些 Sass 映射会合并到空映射中。这样做是为了允许轻松扩展给定的 Sass 映射,但代价是让从映射中删除项变得稍微困难一些。

修改映射

$theme-colors 映射中的所有变量都定义为独立变量。若要修改 $theme-colors 映射中的现有颜色,请将以下内容添加到自定义 Sass 文件中

$primary: #0074d9;
$danger: #ff4136;

稍后,这些变量将在 Bootstrap 的 $theme-colors 映射中设置

$theme-colors: (
  "primary": $primary,
  "danger": $danger
);

添加到映射

通过使用自定义值创建新的 Sass 映射并将其与原始映射合并,将新颜色添加到 $theme-colors 或任何其他映射中。在本例中,我们将创建一个新的 $custom-colors 映射并将其与 $theme-colors 合并。

// Create your own map
$custom-colors: (
  "custom-color": #900
);

// Merge the maps
$theme-colors: map-merge($theme-colors, $custom-colors);

从映射中移除

若要从 $theme-colors 或任何其他映射中移除颜色,请使用 map-remove。请注意,您必须在 variables 中定义 $theme-colors 之后和在 maps 中使用之前,在我们的要求之间插入 $theme-colors

// Required
@import "../node_modules/bootstrap/scss/functions";
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/variables-dark";

$theme-colors: map-remove($theme-colors, "info", "light", "dark");

@import "../node_modules/bootstrap/scss/maps";
@import "../node_modules/bootstrap/scss/mixins";
@import "../node_modules/bootstrap/scss/root";

// Optional
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
// etc

必需键

Bootstrap 假设 Sass 映射中存在一些特定键,因为我们自己使用并扩展了这些键。在自定义包含的映射时,您可能会遇到特定 Sass 映射的键正在使用的错误。

例如,我们使用 $theme-colors 中的 primarysuccessdanger 键来表示链接、按钮和表单状态。替换这些键的值应该不会出现问题,但移除它们可能会导致 Sass 编译问题。在这些情况下,您需要修改使用这些值的 Sass 代码。

函数

颜色

除了 Sass 映射 之外,主题颜色还可以用作独立变量,例如 $primary

.custom-element {
  color: $gray-100;
  background-color: $dark;
}

您可以使用 Bootstrap 的 tint-color()shade-color() 函数来使颜色变浅或变深。这些函数会将颜色与黑色或白色混合,这与 Sass 本机的 lighten()darken() 函数不同,后者会以固定量改变亮度,这通常不会产生所需的效果。

shift-color() 通过在权重为正时为颜色添加阴影,在权重为负时为颜色添加色调,将这两个函数结合起来。

// Tint a color: mix a color with white
@function tint-color($color, $weight) {
  @return mix(white, $color, $weight);
}

// Shade a color: mix a color with black
@function shade-color($color, $weight) {
  @return mix(black, $color, $weight);
}

// Shade the color if the weight is positive, else tint it
@function shift-color($color, $weight) {
  @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));
}

在实际操作中,您需要调用此函数并传入颜色和权重参数。

.custom-element {
  color: tint-color($primary, 10%);
}

.custom-element-2 {
  color: shade-color($danger, 30%);
}

.custom-element-3 {
  color: shift-color($success, 40%);
  background-color: shift-color($success, -60%);
}

颜色对比度

为了满足 网络内容无障碍指南 (WCAG) 的对比度要求,作者必须提供最低 4.5:1 的文本颜色对比度 和最低 3:1 的非文本颜色对比度,但有极少数例外情况。

为了提供帮助,我们在 Bootstrap 中包含了 color-contrast 函数。它使用 WCAG 对比度算法,根据 sRGB 色彩空间中的 相对亮度 计算对比度阈值,以根据指定的基色自动返回浅色 (#fff)、深色 (#212529) 或黑色 (#000) 对比色。此函数对于您在其中生成多个类的混合或循环特别有用。

例如,要从我们的 $theme-colors 映射生成颜色样本

@each $color, $value in $theme-colors {
  .swatch-#{$color} {
    color: color-contrast($value);
  }
}

它还可以用于一次性的对比度需求

.custom-element {
  color: color-contrast(#000); // returns `color: #fff`
}

您还可以使用我们的颜色映射函数指定基色

.custom-element {
  color: color-contrast($dark); // returns `color: #fff`
}

转义 SVG

我们使用 escape-svg 函数转义 SVG 背景图像的 <># 字符。使用 escape-svg 函数时,必须引用数据 URI。

加法和减法函数

我们使用 addsubtract 函数包装 CSS calc 函数。这些函数的主要目的是在将“无单位”0 值传递到 calc 表达式时避免错误。诸如 calc(10px - 0) 的表达式将在所有浏览器中返回错误,尽管在数学上是正确的。

calc 有效的示例

$border-radius: .25rem;
$border-width: 1px;

.element {
  // Output calc(.25rem - 1px) is valid
  border-radius: calc($border-radius - $border-width);
}

.element {
  // Output the same calc(.25rem - 1px) as above
  border-radius: subtract($border-radius, $border-width);
}

calc 无效的示例

$border-radius: .25rem;
$border-width: 0;

.element {
  // Output calc(.25rem - 0) is invalid
  border-radius: calc($border-radius - $border-width);
}

.element {
  // Output .25rem
  border-radius: subtract($border-radius, $border-width);
}

混合

我们的 scss/mixins/ 目录包含大量混合,这些混合为 Bootstrap 的各个部分提供支持,还可以在您自己的项目中使用。

配色方案

prefers-color-scheme 媒体查询的简写混合支持 lightdark 配色方案。有关我们的颜色模式混合的信息,请参阅 颜色模式文档

@mixin color-scheme($name) {
  @media (prefers-color-scheme: #{$name}) {
    @content;
  }
}
.custom-element {
  @include color-scheme(light) {
    // Insert light mode styles here
  }

  @include color-scheme(dark) {
    // Insert dark mode styles here
  }
}