Bootstrap 高级用法 #

本指南介绍 Bootstrap 的高级用法,包括性能优化、可访问性、与其他框架集成等内容,帮助你成为 Bootstrap 专家。

性能优化 #

按需引入 #

只引入需要的组件,减少文件大小:

scss
// 仅引入必要的文件
@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/root";
@import "bootstrap/scss/reboot";
@import "bootstrap/scss/type";
@import "bootstrap/scss/grid";
@import "bootstrap/scss/buttons";
@import "bootstrap/scss/utilities";

移除未使用的 CSS #

使用 PurgeCSS 移除未使用的样式:

javascript
// purgecss.config.js
module.exports = {
  content: [
    './**/*.html',
    './**/*.js'
  ],
  css: ['./css/bootstrap.css'],
  output: './css/'
};

压缩 CSS #

bash
# 使用 sass 压缩
sass custom.scss custom.css --style=compressed

# 使用 cssnano
npx cssnano bootstrap.css bootstrap.min.css

异步加载 JavaScript #

html
<!-- 异步加载 -->
<script src="bootstrap.bundle.min.js" async></script>

<!-- 延迟加载 -->
<script src="bootstrap.bundle.min.js" defer></script>

预加载关键资源 #

html
<!-- 预加载 CSS -->
<link rel="preload" href="bootstrap.min.css" as="style">
<link href="bootstrap.min.css" rel="stylesheet">

<!-- 预加载字体 -->
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>

可访问性 #

语义化 HTML #

html
<!-- 推荐:使用语义化标签 -->
<nav class="navbar">
  <ul class="navbar-nav">
    <li class="nav-item"><a class="nav-link" href="#">首页</a></li>
  </ul>
</nav>

<main>
  <article>
    <h1>文章标题</h1>
    <p>文章内容</p>
  </article>
</main>

ARIA 属性 #

html
<!-- 导航栏 -->
<nav class="navbar" role="navigation" aria-label="主导航">
  ...
</nav>

<!-- 按钮 -->
<button type="button" class="btn btn-primary" aria-label="保存">
  <svg class="bi">...</svg>
</button>

<!-- 模态框 -->
<div class="modal" tabindex="-1" aria-labelledby="modalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="modalLabel">标题</h5>
      </div>
    </div>
  </div>
</div>

跳过链接 #

html
<a href="#main-content" class="visually-hidden-focusable">跳到主要内容</a>

<nav>...</nav>

<main id="main-content">
  主要内容
</main>

颜色对比度 #

确保文本与背景的对比度符合 WCAG 标准:

scss
// 确保对比度至少为 4.5:1
.text-primary { color: #0d6efd; } // 对白色背景对比度 4.5:1
.text-dark { color: #212529; }    // 对白色背景对比度 14.7:1

键盘导航 #

html
<!-- 确保所有交互元素可通过键盘访问 -->
<button class="btn btn-primary" type="button">按钮</button>

<!-- 使用 tabindex -->
<div class="card" tabindex="0" role="button">
  可聚焦的卡片
</div>

与框架集成 #

React #

bash
npm install bootstrap
javascript
// App.js
import 'bootstrap/dist/css/bootstrap.min.css';

function App() {
  return (
    <div className="container">
      <button className="btn btn-primary">按钮</button>
    </div>
  );
}

使用 React Bootstrap(推荐):

bash
npm install react-bootstrap
javascript
import Button from 'react-bootstrap/Button';
import Container from 'react-bootstrap/Container';

function App() {
  return (
    <Container>
      <Button variant="primary">按钮</Button>
    </Container>
  );
}

Vue #

bash
npm install bootstrap
javascript
// main.js
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.bundle.min.js';
vue
<template>
  <div class="container">
    <button class="btn btn-primary">按钮</button>
  </div>
</template>

使用 BootstrapVue(推荐):

bash
npm install bootstrap-vue
javascript
// main.js
import { createApp } from 'vue';
import BootstrapVue from 'bootstrap-vue';
import 'bootstrap/dist/css/bootstrap.css';
import 'bootstrap-vue/dist/bootstrap-vue.css';

const app = createApp(App);
app.use(BootstrapVue);

Angular #

bash
npm install bootstrap
json
// angular.json
{
  "styles": [
    "node_modules/bootstrap/dist/css/bootstrap.min.css"
  ],
  "scripts": [
    "node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"
  ]
}

使用 ng-bootstrap(推荐):

bash
npm install @ng-bootstrap/ng-bootstrap
typescript
// app.module.ts
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';

@NgModule({
  imports: [NgbModule]
})
export class AppModule { }

Next.js #

bash
npm install bootstrap
javascript
// pages/_app.js
import 'bootstrap/dist/css/bootstrap.min.css';

function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

export default MyApp;

Nuxt.js #

bash
npm install bootstrap
javascript
// nuxt.config.js
export default {
  css: [
    'bootstrap/dist/css/bootstrap.min.css'
  ],
  scripts: [
    { src: 'bootstrap/dist/js/bootstrap.bundle.min.js', body: true }
  ]
};

自定义组件 #

扩展按钮 #

scss
.btn-custom {
  @include button-variant(
    $background: #ff6600,
    $border: #ff6600,
    $hover-background: darken(#ff6600, 10%),
    $hover-border: darken(#ff6600, 10%),
    $active-background: darken(#ff6600, 15%),
    $active-border: darken(#ff6600, 15%)
  );
  
  border-radius: 50rem;
  padding: 0.75rem 2rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

扩展卡片 #

scss
.card-hover {
  transition: transform 0.3s ease, box-shadow 0.3s ease;
  
  &:hover {
    transform: translateY(-5px);
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
  }
}

扩展模态框 #

scss
.modal-blur {
  backdrop-filter: blur(5px);
}

.modal-slide {
  .modal-dialog {
    transform: translateX(100%);
    transition: transform 0.3s ease;
  }
  
  &.show .modal-dialog {
    transform: translateX(0);
  }
}

响应式设计技巧 #

响应式字体 #

scss
html {
  font-size: 14px;
  
  @include media-breakpoint-up(sm) {
    font-size: 15px;
  }
  
  @include media-breakpoint-up(md) {
    font-size: 16px;
  }
  
  @include media-breakpoint-up(lg) {
    font-size: 17px;
  }
}

响应式间距 #

html
<div class="p-2 p-md-4 p-lg-5">
  响应式内边距
</div>

响应式隐藏 #

html
<!-- 仅在移动端显示 -->
<div class="d-block d-md-none">移动端内容</div>

<!-- 仅在桌面端显示 -->
<div class="d-none d-md-block">桌面端内容</div>

JavaScript 高级用法 #

编程式控制组件 #

javascript
// 模态框
var modal = new bootstrap.Modal(document.getElementById('myModal'));
modal.show();
modal.hide();
modal.toggle();

// Toast
var toast = new bootstrap.Toast(document.getElementById('myToast'));
toast.show();

// Dropdown
var dropdown = new bootstrap.Dropdown(document.getElementById('myDropdown'));
dropdown.toggle();
dropdown.update();

监听事件 #

javascript
// 模态框事件
document.getElementById('myModal').addEventListener('shown.bs.modal', function() {
  console.log('模态框已显示');
});

// 按钮点击
document.querySelectorAll('.btn').forEach(function(btn) {
  btn.addEventListener('click', function() {
    // 处理点击
  });
});

动态创建组件 #

javascript
// 动态创建模态框
function createModal(title, content) {
  var modalHtml = `
    <div class="modal fade" tabindex="-1">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title">${title}</h5>
            <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
          </div>
          <div class="modal-body">${content}</div>
        </div>
      </div>
    </div>
  `;
  
  var modalElement = document.createElement('div');
  modalElement.innerHTML = modalHtml;
  document.body.appendChild(modalElement.firstElementChild);
  
  var modal = new bootstrap.Modal(modalElement.querySelector('.modal'));
  modal.show();
  
  return modal;
}

最佳实践 #

1. 文件组织 #

text
project/
├── scss/
│   ├── _variables.scss
│   ├── _mixins.scss
│   ├── _components/
│   │   ├── _buttons.scss
│   │   ├── _cards.scss
│   │   └── _navbar.scss
│   └── main.scss
├── css/
│   └── main.css
├── js/
│   └── main.js
└── index.html

2. 命名约定 #

scss
// 使用有意义的类名
.btn-primary { }
.card-product { }
.navbar-main { }

// 避免过度嵌套
.card {
  .card-body { }
}

// 使用 BEM 命名
.card { }
.card__header { }
.card__body { }
.card--featured { }

3. 性能优化清单 #

  • [ ] 按需引入组件
  • [ ] 压缩 CSS 和 JS
  • [ ] 移除未使用的样式
  • [ ] 使用 CDN 加速
  • [ ] 启用浏览器缓存
  • [ ] 优化图片
  • [ ] 异步加载非关键资源

4. 可访问性清单 #

  • [ ] 使用语义化 HTML
  • [ ] 添加 ARIA 属性
  • [ ] 确保颜色对比度
  • [ ] 支持键盘导航
  • [ ] 提供跳过链接
  • [ ] 添加 alt 属性
  • [ ] 使用正确的焦点顺序

常见问题解决 #

1. 样式冲突 #

scss
// 使用更高优先级的选择器
.my-app .btn-primary {
  // 自定义样式
}

// 或使用 !important(不推荐)
.btn-primary {
  color: #fff !important;
}

2. JavaScript 依赖 #

html
<!-- 确保 Popper.js 在 Bootstrap 之前加载 -->
<script src="popper.min.js"></script>
<script src="bootstrap.min.js"></script>

<!-- 或使用 bundle -->
<script src="bootstrap.bundle.min.js"></script>

3. IE 兼容 #

Bootstrap 5 不支持 IE,如需支持请使用 Bootstrap 4:

html
<link href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" rel="stylesheet">

总结 #

通过本指南,你已经学习了 Bootstrap 的高级用法:

  1. 性能优化:按需引入、压缩、PurgeCSS
  2. 可访问性:语义化、ARIA、键盘导航
  3. 框架集成:React、Vue、Angular
  4. 自定义组件:扩展按钮、卡片、模态框
  5. 最佳实践:文件组织、命名约定、清单

继续实践和探索,你将成为 Bootstrap 专家!

最后更新:2026-03-28