Bootstrap 自定义主题 #

Bootstrap 提供了强大的自定义能力,你可以通过 Sass 变量、CSS 变量和自定义样式来创建独特的主题风格。

自定义方式 #

Bootstrap 提供了三种主要的自定义方式:

方式 适用场景 灵活度
CSS 覆盖 简单样式修改
Sass 变量 主题定制
CSS 变量 运行时修改

CSS 覆盖 #

最简单的方式是在 Bootstrap CSS 之后引入自定义 CSS:

html
<link href="bootstrap.min.css" rel="stylesheet">
<link href="custom.css" rel="stylesheet">
css
/* custom.css */
.btn-primary {
  background-color: #ff6600;
  border-color: #ff6600;
}

.btn-primary:hover {
  background-color: #e65c00;
  border-color: #e65c00;
}

Sass 变量自定义 #

安装 Bootstrap 源码 #

bash
npm install bootstrap

创建自定义 SCSS 文件 #

scss
// custom.scss

// 1. 在引入 Bootstrap 之前定义变量
$primary: #ff6600;
$secondary: #6c757d;
$success: #28a745;
$danger: #dc3545;
$warning: #ffc107;
$info: #17a2b8;

// 字体设置
$font-family-base: 'Helvetica Neue', Arial, sans-serif;
$font-size-base: 1rem;

// 圆角设置
$border-radius: 0.375rem;
$border-radius-lg: 0.5rem;
$border-radius-sm: 0.25rem;

// 2. 引入 Bootstrap
@import "bootstrap/scss/bootstrap";

编译 SCSS #

bash
# 使用 sass 编译
sass custom.scss custom.css

# 使用 node-sass 编译
node-sass custom.scss custom.css

# 压缩输出
sass custom.scss custom.css --style=compressed

核心变量 #

颜色变量 #

scss
// 主题颜色
$primary: #0d6efd;
$secondary: #6c757d;
$success: #198754;
$danger: #dc3545;
$warning: #ffc107;
$info: #0dcaf0;
$light: #f8f9fa;
$dark: #212529;

// 灰度颜色
$gray-100: #f8f9fa;
$gray-200: #e9ecef;
$gray-300: #dee2e6;
$gray-400: #ced4da;
$gray-500: #adb5bd;
$gray-600: #6c757d;
$gray-700: #495057;
$gray-800: #343a40;
$gray-900: #212529;

// 添加自定义颜色
$theme-colors: (
  "primary": $primary,
  "secondary": $secondary,
  "success": $success,
  "danger": $danger,
  "warning": $warning,
  "info": $info,
  "light": $light,
  "dark": $dark,
  "custom": #7c3aed
);

字体变量 #

scss
// 字体家族
$font-family-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;

// 字体大小
$font-size-base: 1rem;
$font-size-sm: $font-size-base * .875;
$font-size-lg: $font-size-base * 1.25;

// 标题大小
$h1-font-size: $font-size-base * 2.5;
$h2-font-size: $font-size-base * 2;
$h3-font-size: $font-size-base * 1.75;
$h4-font-size: $font-size-base * 1.5;
$h5-font-size: $font-size-base * 1.25;
$h6-font-size: $font-size-base;

// 行高
$line-height-base: 1.5;
$line-height-sm: 1.25;
$line-height-lg: 2;

间距变量 #

scss
// 间距
$spacer: 1rem;
$spacers: (
  0: 0,
  1: $spacer * .25,
  2: $spacer * .5,
  3: $spacer,
  4: $spacer * 1.5,
  5: $spacer * 3
);

断点变量 #

scss
$grid-breakpoints: (
  xs: 0,
  sm: 576px,
  md: 768px,
  lg: 992px,
  xl: 1200px,
  xxl: 1400px
);

$container-max-widths: (
  sm: 540px,
  md: 720px,
  lg: 960px,
  xl: 1140px,
  xxl: 1320px
);

栅格变量 #

scss
$grid-columns: 12;
$grid-gutter-width: 1.5rem;
$grid-row-columns: 6;

按钮变量 #

scss
$btn-padding-y: 0.375rem;
$btn-padding-x: 0.75rem;
$btn-font-family: $font-family-base;
$btn-font-size: $font-size-base;
$btn-line-height: 1.5;
$btn-border-radius: $border-radius;

$btn-padding-y-sm: 0.25rem;
$btn-padding-x-sm: 0.5rem;
$btn-font-size-sm: $font-size-sm;

$btn-padding-y-lg: 0.5rem;
$btn-padding-x-lg: 1rem;
$btn-font-size-lg: $font-size-lg;

表单变量 #

scss
$input-padding-y: 0.375rem;
$input-padding-x: 0.75rem;
$input-font-family: $font-family-base;
$input-font-size: $font-size-base;
$input-line-height: 1.5;
$input-border-radius: $border-radius;

$input-focus-border-color: tint-color($primary, 50%);
$input-focus-box-shadow: 0 0 0 0.25rem rgba($primary, .25);

导航栏变量 #

scss
$navbar-padding-y: 0.5rem;
$navbar-padding-x: 1rem;
$navbar-brand-font-size: $font-size-lg;

$navbar-dark-color: rgba($white, .55);
$navbar-dark-hover-color: rgba($white, .75);
$navbar-dark-active-color: $white;

$navbar-light-color: rgba($black, .55);
$navbar-light-hover-color: rgba($black, .7);
$navbar-light-active-color: rgba($black, .9);

CSS 变量 #

Bootstrap 5 使用 CSS 自定义属性(CSS 变量),可以在运行时修改样式:

全局 CSS 变量 #

css
:root {
  --bs-blue: #0d6efd;
  --bs-indigo: #6610f2;
  --bs-purple: #6f42c1;
  --bs-pink: #d63384;
  --bs-red: #dc3545;
  --bs-orange: #fd7e14;
  --bs-yellow: #ffc107;
  --bs-green: #198754;
  --bs-teal: #20c997;
  --bs-cyan: #0dcaf0;
  --bs-black: #000;
  --bs-white: #fff;
  --bs-gray: #6c757d;
  --bs-gray-dark: #343a40;
  --bs-gray-100: #f8f9fa;
  --bs-gray-200: #e9ecef;
  --bs-gray-300: #dee2e6;
  --bs-gray-400: #ced4da;
  --bs-gray-500: #adb5bd;
  --bs-gray-600: #6c757d;
  --bs-gray-700: #495057;
  --bs-gray-800: #343a40;
  --bs-gray-900: #212529;
  --bs-primary: #0d6efd;
  --bs-secondary: #6c757d;
  --bs-success: #198754;
  --bs-danger: #dc3545;
  --bs-warning: #ffc107;
  --bs-info: #0dcaf0;
  --bs-light: #f8f9fa;
  --bs-dark: #212529;
  --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
  --bs-body-font-family: var(--bs-font-sans-serif);
  --bs-body-font-size: 1rem;
  --bs-body-font-weight: 400;
  --bs-body-line-height: 1.5;
  --bs-body-color: #212529;
  --bs-body-bg: #fff;
}

通过 JavaScript 修改 #

javascript
// 修改主题色
document.documentElement.style.setProperty('--bs-primary', '#ff6600');

// 修改字体
document.documentElement.style.setProperty('--bs-body-font-family', 'Arial, sans-serif');

// 修改背景色
document.documentElement.style.setProperty('--bs-body-bg', '#f5f5f5');

组件 CSS 变量 #

css
/* 按钮 */
.btn-primary {
  --bs-btn-color: #fff;
  --bs-btn-bg: #0d6efd;
  --bs-btn-border-color: #0d6efd;
  --bs-btn-hover-color: #fff;
  --bs-btn-hover-bg: #0b5ed7;
  --bs-btn-hover-border-color: #0a58ca;
}

/* 卡片 */
.card {
  --bs-card-spacer-y: 1rem;
  --bs-card-spacer-x: 1rem;
  --bs-card-title-spacer-y: 0.5rem;
  --bs-card-border-width: 1px;
  --bs-card-border-color: rgba(0, 0, 0, .125);
  --bs-card-border-radius: 0.375rem;
}

按需引入 #

只引入需要的组件 #

scss
// 1. 必须引入
@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/mixins";

// 2. 选择性引入组件
@import "bootstrap/scss/root";
@import "bootstrap/scss/reboot";
@import "bootstrap/scss/type";
@import "bootstrap/scss/grid";
@import "bootstrap/scss/buttons";
@import "bootstrap/scss/forms";
@import "bootstrap/scss/card";
@import "bootstrap/scss/modal";
@import "bootstrap/scss/navbar";
@import "bootstrap/scss/utilities";

只引入栅格系统 #

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

只引入工具类 #

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

主题示例 #

深色主题 #

scss
// dark-theme.scss
$primary: #6ea8fe;
$secondary: #6c757d;
$success: #3dd5f3;
$danger: #ea868f;
$warning: #ffc107;
$info: #6edff6;

$body-bg: #212529;
$body-color: #dee2e6;

$card-bg: #2b3035;
$card-border-color: rgba(255, 255, 255, .125);

$navbar-dark-color: rgba(255, 255, 255, .55);
$navbar-dark-hover-color: rgba(255, 255, 255, .75);

@import "bootstrap/scss/bootstrap";

企业主题 #

scss
// corporate-theme.scss
$primary: #0056b3;
$secondary: #6c757d;
$success: #28a745;
$danger: #dc3545;

$font-family-base: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
$font-size-base: 0.9375rem;

$border-radius: 0;
$border-radius-lg: 0;
$border-radius-sm: 0;

$btn-font-weight: 600;

@import "bootstrap/scss/bootstrap";

圆润主题 #

scss
// rounded-theme.scss
$primary: #6366f1;
$secondary: #8b5cf6;
$success: #10b981;
$danger: #ef4444;
$warning: #f59e0b;
$info: #3b82f6;

$border-radius: 1rem;
$border-radius-lg: 1.25rem;
$border-radius-sm: 0.75rem;

$btn-border-radius: 50rem;
$btn-border-radius-sm: 50rem;
$btn-border-radius-lg: 50rem;

$card-border-radius: 1.5rem;

@import "bootstrap/scss/bootstrap";

构建工具配置 #

Webpack #

javascript
// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: [
          'style-loader',
          'css-loader',
          'postcss-loader',
          'sass-loader'
        ]
      }
    ]
  }
};

Vite #

javascript
// vite.config.js
export default {
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "bootstrap/scss/functions"; @import "bootstrap/scss/variables";`
      }
    }
  }
};

Gulp #

javascript
// gulpfile.js
const gulp = require('gulp');
const sass = require('gulp-sass')(require('sass'));
const postcss = require('gulp-postcss');
const autoprefixer = require('autoprefixer');
const cssnano = require('cssnano');

gulp.task('build-css', () => {
  return gulp.src('scss/custom.scss')
    .pipe(sass())
    .pipe(postcss([autoprefixer(), cssnano()]))
    .pipe(gulp.dest('css'));
});

最佳实践 #

1. 变量优先 #

scss
// 推荐:使用变量
$primary: #ff6600;

// 不推荐:硬编码
.btn-primary {
  background-color: #ff6600;
}

2. 模块化组织 #

text
scss/
├── _variables.scss
├── _mixins.scss
├── _buttons.scss
├── _forms.scss
├── _navbar.scss
└── main.scss

3. 版本控制 #

scss
// 记录 Bootstrap 版本
// Bootstrap 5.3.0
// 自定义主题 v1.0.0

下一步 #

现在你已经掌握了自定义主题,接下来学习 高级用法,了解更多 Bootstrap 的高级技巧!

最后更新:2026-03-28