Sass
使用Sass文件来利用变量、映射、mixin和函数来帮助你更快地构建和自定你的项目。
使用源Sass文件来利用变量、映射、mixin等等。在Bootstrap的构建中,将Sass舍入精度提高到6(默认为5),以防止浏览器舍入出现问题。
结构目录
尽可能避免修改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
@import "../node_modules/bootstrap/scss/bootstrap";
// Custom.scss
// Option B: Include parts of Bootstrap
// Required
@import "../node_modules/bootstrap/scss/functions";
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/mixins";
// Optional
@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";
完成以上设置后,你可以开始在 custom.scss
中修改任何Sass变量和映射。你还可以根据需要在 // Optional
下添加引导程序。我们建议使用
bootstrap.scss
为你的起点。
变量默认值
Bootstrap中的每个Sass变量都包含 !default
标志,你可以在不修改Bootstrap源码的情况下重写自己Sass。根据需要复制和粘贴变量,修改它们的值,并删除
!default
标志。如果一个变量已经被分配,那么它不会被Bootstrap中的默认值重新赋值。
您可以在 scss/_variables.scss
中找到Bootstrap变量的完整列表。 某些变量设置为
null
,除非在配置中将其覆盖,否则这些变量不会输出属性。
同一Sass文件中的变量覆盖可以在默认变量之前或之后。 但是,在跨Sass文件进行覆盖时,必须先进行覆盖,然后再导入Bootstrap的Sass文件。
这是通过npm导入和编译Bootstrap时,更改 <body>
的 background-color
和 color
的示例:
// Your variable overrides
$body-bg: #000;
$body-color: #111;
// Bootstrap and its default variables
@import "../node_modules/bootstrap/scss/bootstrap";
如果有必要,可以对Bootstrap中的任何变量(包括下面的全局选项)进行必要的重复。
Map和循环
Bootstrap包含一些Sass映射,这可以让我们生成CSS会更加容易。 我们将Sass映射用于颜色,网格断点等。 就像Sass变量一样,所有Sass映射都包含 !default
标志,并且可以覆盖和扩展。
默认情况下,一些Sass映射会合并为空映射。 这样做是为了轻松扩展给定的Sass map,但这样做的代价是使从 Map
中删除项目变得更加困难。
修改 map
$theme-colors
映射中的所有变量都被定义为独立的变量。要在r $theme-colors
映射中修改现有的颜色,请在自定义Sass文件中添加以下内容:
$primary: #0074d9;
$danger: #ff4136;
随后,在Bootstrap的 $theme-colors
映射中设置这些变量:
$theme-colors: (
"primary": $primary,
"danger": $danger
);
添加 map
通过我们自己创建的新Sass map并将其与原map合并,将新颜色添加到 $theme-colors
或任何其他地图中。 在这种情况下,我们将创建一个新的
$custom-colors
map并将其与 $theme-colors
合并。
// Create your own map
$custom-colors: (
"custom-color": #900
);
// Merge the maps
$theme-colors: map-merge($theme-colors, $custom-colors);
从 map 中删除
要从 $theme-colors
或任何其他map中删除颜色,请使用 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";
...
所需的值
Bootstrap假定在使用和扩展这些特定的值时,它们会在Sass映射中存在。 自定义包含的map时,在使用特定Sass map的值时可能会遇到错误。
例如,我们将 $theme-colors
中的 primary
、 success
和 danger
键用于链接、按钮和表单状态。替换这些键的值应该不会出现问题,但是删除它们可能会导致Sass编译问题。在这些情况下,你需要修改使用这些值的Sass代码。
功能介绍
颜色
除了我们拥有的 Sass 映射之外,主题颜色也可以用作独立变量,比如 $primary
。
.custom-element {
color: $gray-100;
background-color: $dark;
}
可以使用Bootstrap的 tint-color()
和 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));
}
实际上,你需要调用函数并传入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
函数,color-contrast
它利用 WCAG 2.0 算法根据 sRGB
颜色空间中的 相对亮度 计算对比度阈值,根据指定的基色自动返回浅色 (#fff
)
、深色 (#212529
) 或黑色 (#000
) 对比度颜色。此函数对于生成多个类的mixin或循环特别有用。
例如,要从我们的 $theme-colors
map生成颜色样本:
@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
和 subtract
函数包装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);
}