萨斯
利用我们的 Sass 源文件来利用变量、映射、mixin 和函数来帮助您更快地构建和自定义您的项目。
利用我们的 Sass 源文件来利用变量、映射、mixin 等。
文件结构
尽可能避免修改 Bootstrap 的核心文件。对于 Sass,这意味着创建您自己的导入 Bootstrap 的样式表,以便您可以修改和扩展它。假设您使用的是像 npm 这样的包管理器,您将拥有如下所示的文件结构:
your-project/
├── scss
│ └── custom.scss
└── node_modules/
└── bootstrap
├── js
└── scss
如果您已经下载了我们的源文件并且没有使用包管理器,那么您需要手动设置类似于该结构的东西,将 Bootstrap 的源文件与您自己的源文件分开。
your-project/
├── scss
│ └── custom.scss
└── bootstrap/
├── js
└── scss
输入
在您的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
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/mixins";
// 4. Include any optional Bootstrap components as you like
@import "../node_modules/bootstrap/scss/root";
@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";
// 5. Add additional custom code here
有了这个设置,你就可以开始修改你的custom.scss
. 您也可以根据需要开始在该部分下添加部分 Bootstrap // Optional
。我们建议使用我们bootstrap.scss
文件中的完整导入堆栈作为您的起点。
变量默认值
Bootstrap 中的每个 Sass 变量都包含一个!default
标志,允许您在自己的 Sass 中覆盖变量的默认值,而无需修改 Bootstrap 的源代码。根据需要复制和粘贴变量,修改它们的值,然后删除!default
标志。如果一个变量已经被赋值,那么它不会被 Bootstrap 中的默认值重新赋值。
您将在 中找到 Bootstrap 变量的完整列表scss/_variables.scss
。一些变量设置为null
,这些变量不会输出属性,除非它们在您的配置中被覆盖。
变量覆盖必须在我们的函数被导入之后,但在其余的导入之前。
这是一个在通过 npm 导入和编译 Bootstrap 时更改background-color
andcolor
的示例:<body>
// 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/mixins";
// Optional Bootstrap components here
@import "../node_modules/bootstrap/scss/root";
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
// etc
根据需要对 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
);
添加到地图
$theme-colors
通过使用您的自定义值创建新的 Sass 地图并将其与原始地图合并,向 或任何其他地图添加新颜色。在这种情况下,我们将创建一个新$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
。请注意,您必须在我们的要求和选项之间插入它:
// Required
@import "../node_modules/bootstrap/scss/functions";
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/mixins";
$theme-colors: map-remove($theme-colors, "info", "light", "dark");
// Optional
@import "../node_modules/bootstrap/scss/root";
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
// etc
必需的键
Bootstrap 假设 Sass 映射中存在一些特定的键,因为我们自己使用并扩展了这些键。当您自定义包含的映射时,您可能会遇到使用特定 Sass 映射键的错误。
例如,我们使用链接、按钮和表单状态中的primary
、success
和danger
键。$theme-colors
替换这些键的值应该没有问题,但删除它们可能会导致 Sass 编译问题。在这些情况下,您需要修改使用这些值的 Sass 代码。
功能
颜色
在我们拥有的Sass 地图旁边,主题颜色也可以用作独立变量,例如$primary
.
.custom-element {
color: $gray-100;
background-color: $dark;
}
tint-color()
您可以使用 Bootstrap和shade-color()
函数使颜色变亮或变暗。这些函数会将颜色与黑色或白色混合,这与 Sass 的原生lighten()
和darken()
函数不同,后者会以固定的量改变亮度,这通常不会产生预期的效果。
// 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%);
}
颜色对比
为了满足WCAG 2.0 颜色对比度的可访问性标准,作者必须提供至少 4.5:1 的对比度,只有极少数例外。
我们在 Bootstrap 中包含的另一个功能是颜色对比功能,color-contrast
. 它利用WCAG 2.0 算法根据色彩空间中的相对亮度计算对比度阈值,以根据指定的基色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。
加减函数
我们使用add
andsubtract
函数来包装 CSScalc
函数。这些函数的主要目的是避免将“无单位”0
值传递给calc
表达式时出现错误。像这样的表达式calc(10px - 0)
将在所有浏览器中返回错误,尽管在数学上是正确的。
计算有效的示例:
$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);
}
计算无效的示例:
$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/
目录有大量的 mixin,它们为 Bootstrap 的各个部分提供动力,也可以在您自己的项目中使用。
配色方案
媒体查询的速记 mixinprefers-color-scheme
支持light
、dark
和自定义配色方案。
@mixin color-scheme($name) {
@media (prefers-color-scheme: #{$name}) {
@content;
}
}
.custom-element {
@include color-scheme(dark) {
// Insert dark mode styles here
}
@include color-scheme(custom-named-scheme) {
// Insert custom color scheme styles here
}
}