Skip to content

全局样式与组件(Bootstrap 1/2) ​

本页对应 课堂视频,共 7 段视频,约 2 小时 11 分。

学习目标 ​

  1. 能说明 Bootstrap 3/4/5 的版本差异与依赖关系,并独立完成 Bootstrap CSS、jQuery、Bootstrap JS 的正确引入与基本模板搭建。
  2. 能使用 container、row、col-xs/sm/md/lg-*、offset、push 等类名实现响应式栅格布局,并通过浏览器验证不同视口下的分栏与偏移效果。
  3. 能运用 Bootstrap 全局样式完成表格、按钮、图片、文本颜色、背景颜色及辅助类的应用,并能通过自定义类名覆盖默认样式。
  4. 能根据文档复制并改造导航条、页头、面板、列表组等组件,结合栅格系统完成页面区块布局。
  5. 能使用 data-* 属性或 jQuery 调用方式启用选项卡、工具提示等 JavaScript 插件,并说明其基本初始化原理。
  6. 能独立完成“Bootstrap 页面案例 01”中的导航条改造,实现固定顶部、深色主题、菜单与搜索框布局,并验证页面滚动与响应式效果。

知识点 ​

Bootstrap 是什么,为什么要学它 ​

文档地址:https://v3.bootcss.com/

为什么需要:课堂里已经手写过选项卡、CSS 案例和若干特效,把这些样式、脚本攒成一套可复用的东西,就是界面框架的思路。Bootstrap 是 Twitter 前端工程师做出来的,出名早、接受度高,适合拿来摸清这类框架的套路。
怎么想:学习重点不是死记类名,而是理解它由哪些部分组成、怎么组织 CSS/JS、怎么按文档取用。Bootstrap 3、4、5 是同步更新的不同技术方向,不是简单替代:3 兼容性最好,依赖 jQuery;4 不再兼容 IE8;5 更激进,放弃 IE,采用网格布局方向。课程选 3,是因为它典型,且用 Less 编写,便于顺带分析源码设计。
怎么做:打开中文文档,先看“起步、全局样式、组件、插件”四大部分。下载时文档给三个选项:生产环境、源码、Sass 版。实际使用下载“生产环境”即可;想研究 Less 就下源码,源码里也带编译好的文件。
易错点:不要把“源码”和“生产环境”混为一谈;不要以为 4/5 一定比 3 新就无脑用,兼容性和项目要求要分开看。转写稿里的“几块论”就是 jQuery,“不特学”就是 Bootstrap,“山格”是栅格,“详应式”是响应式,“矢口”是视口,先把这些同音字纠正过来。

基本使用:先引入,再加类名 ​

为什么需要:Bootstrap 自带现成 CSS 和 JS,直接拿来做页面能减少重复劳动;但引入顺序、压缩文件、目录结构不清楚,就会出现“类名写了没效果”。
怎么想:页面先引 Bootstrap 样式,再引 jQuery,最后引 Bootstrap 脚本。Bootstrap 3 的 JS 依赖 jQuery,顺序反了插件不好使。课堂目录里通常有 css、js、fonts:css 放样式,js 放脚本,fonts 放字体图标。
怎么做:

html
<link rel="stylesheet" href="./css/bootstrap.min.css">
<script src="./js/jquery.min.js"></script>
<script src="./js/bootstrap.min.js"></script>

调试时先写一个 h1、按钮、段落,观察默认外边距、字号、按钮颜色是否变化。转写稿中第一次写栅格“没效果”,原因就是还没引入 Bootstrap;引入后 container 才有版心、固定宽度和居中效果。
易错点:bootstrap.min.css 是压缩版,空格换行被去掉,文件更小,适合上线;开发阶段想看报错可先用未压缩版。.map 文件是压缩后方便调试定位的映射记录,不需要手读。不要手动把 CSS 压成一行,后面用工具处理。

栅格系统:一行十二列 ​

为什么需要:页面布局永远是先分行、行里再分列。Bootstrap 把这件事标准化:一行最多 12 份,元素通过类名声明占几份。
怎么想:先有 container(版心),里面放 row,行里放列。col-md-6 表示中等屏幕及以上占父元素的 12 分之 6。列里还能再放 row 继续分,但嵌套后的 12 份是相对“父元素”,不是整个页面。
怎么做:

html
<div class="container">
  <div class="row">
    <div class="col-md-3">1</div>
    <div class="col-md-3">2</div>
    <div class="col-md-3">3</div>
    <div class="col-md-3">4</div>
  </div>
</div>

转写稿里先写 col-3 没分栏,补上 md 才生效;多一个列会自动换行。行间可自己加样式,列加边框时因 Bootstrap 设置了 box-sizing: border-box,内边距不会撑大尺寸。
易错点:断点是 <768 超小、≥768 小、≥992 中、≥1200 大,对应 xs/sm/md/lg。它是移动优先:只写 col-md-6,大屏也按 md,除非另写 lg 覆盖;小屏没写就默认占满。col-md-offset-3 是列偏移,转写稿里的“裂天移”就是列偏移。

全局样式:表格、表单、按钮 ​

为什么需要:表格、表单、按钮是页面高频组成部分,Bootstrap 已写好基础样式,复制后改类名即可。
怎么想:表格先加 table,再加 table-bordered、table-hover、table-striped 等状态类;颜色语义常用 success/info/warning/danger,按钮用 btn btn-success、btn-lg、btn-sm、btn-block。
怎么做:表单建议直接从文档复制,水平表单里常再嵌一套栅格;按钮不仅可给 button,也可给 a 加类名变成按钮样式。
易错点:类名不用死记,打开文档查;按钮大小类写错就查文档纠正。表格宽度可用栅格控制,不要到处写死宽度。

组件与插件:需要哪个复制哪个 ​

为什么需要:导航条、页头、面板、列表组、模态框、轮播图等都是页面组成部分,复制后改内容最快。
怎么想:组件是页面块,插件是 JS 效果。导航条常配合 navbar-fixed-top 固定顶部;固定后脱离文档流会盖住下面内容,转写稿中第一个 p 被盖住,解决是给 body 加上内边距,按导航条高度约 51px 调。
怎么做:选项卡靠 data-toggle="tab" 和 href="#对应内容id" 对齐;自己写 JS 时要用 jQuery 选中对应 a,再调用文档给出的 Tab 方法。
易错点:aria-*、role 等属性删掉一般不影响视觉,但它们是给屏幕阅读器做无障碍的;不要以为删了就不能用。自己写 JS 要写在 jQuery 和 Bootstrap 脚本之后。

页面案例:导航条改造 ​

为什么需要:综合案例能把组件、插件、栅格串起来。
怎么想:先复制导航条,再把 container-fluid 改成 container 让内容进版心;加 navbar-inverse 变深色;加 navbar-fixed-top 固定顶部;搜索框用 input-group 让输入框和按钮紧挨;放大镜用字体图标类。
怎么做:改文字、改下拉项、改登录注册链接,最后用 body { padding-top: 51px; } 防止遮挡。
易错点:文档要熟,知道组件和插件里有什么;没有现成功能再自己写。类名不必背,边看文档边用,用多了自然熟。

全局样式先解决什么问题 ​

为什么需要:页面里的表格、表单、按钮、图片、文字颜色,如果每个项目都从零写,既慢又不统一。Bootstrap 的“全局样式”就是先把这些通用元素的基础样式和类名约定好,我们复制结构、加类名即可。

怎么想:全局样式不是某个具体组件,而是“基础重置 + 类名约定”。它管的是通用元素,页面整体结构仍建议用栅格系统控制。开发时可以先引入未压缩版方便看报错;正式用压缩版减小体积。

怎么做:先引入 Bootstrap 样式,再按顺序引入 jQuery 和 Bootstrap 的 JS:

html
<link rel="stylesheet" href="./dist/css/bootstrap.min.css">
<script src="./dist/js/jquery.min.js"></script>
<script src="./dist/js/bootstrap.min.js"></script>

易错点:Bootstrap 3 的 JS 依赖 jQuery,jQuery 必须在前;不要用行内样式硬改宽度,优先用栅格包一层。

表格:先加基础类,再叠加状态类 ​

为什么需要:原生 <table> 几乎没有样式,转写稿里复制表格后“没有表格的特性”,看起来不像表格。

怎么想:Bootstrap 的表格是“基础类 + 状态类”组合。先加 table 得到基础表格,再加边框、悬停等效果。

怎么做:复制表格结构后加类名:

html
<table class="table table-bordered table-hover">
  <thead>
    <tr><th>姓名</th><th>课程</th></tr>
  </thead>
  <tbody>
    <tr><td>小乐</td><td>Bootstrap</td></tr>
  </tbody>
</table>

调试过程:加 table 后表格样式出现;加 table-bordered 出现边框;加 table-hover 后鼠标移上去有背景色。转写稿里还演示了 success 等语义色,会让行或单元格变绿。

易错点:复制代码时容易多复制外层结构,要删干净;想改表格宽度不要写行内 600px,推荐外面套 col-md-6 之类栅格;条纹、边框、悬停类可以叠加,具体类名查文档。

表单:优先复制,水平表单看栅格 ​

为什么需要:表单结构杂,输入框、标签、按钮手写容易乱。Bootstrap 文档给了基本表单和水平表单,直接复制最稳。

怎么想:基本表单是纵向排列;水平表单本质是在表单里又放了一套栅格系统,让标签和输入框各占份数。

怎么做:复制 form-group 结构,改文字和输入类型。转写稿里搜索框原来是两个普通元素挤在一起,换成 input-group 输入框组后,输入框和按钮就贴住了。

易错点:水平表单不要自己猜结构,先看文档里“文字占多少份、输入框占多少份”;表单整体宽度也用栅格控制,不要到处写死像素。

按钮:btn 基础类不能漏 ​

为什么需要:按钮有默认、成功、信息、警告、危险、链接样式、大小和块级等状态,统一类名能快速切换。

怎么想:先写 btn,再加语义色,再加尺寸或块级类。转写稿里按钮颜色对应:success 绿、info 浅蓝、warning 黄、danger 红。

怎么做:

html
<button class="btn btn-default">默认</button>
<button class="btn btn-success">成功</button>
<a class="btn btn-link" href="#">链接按钮</a>
<button class="btn btn-lg btn-primary">大按钮</button>
<button class="btn btn-sm btn-info">小按钮</button>
<button class="btn btn-block btn-danger">块级按钮</button>

调试过程:转写稿里演示大按钮时把 btn-lg 记错,刷新没效果,查文档后改回 btn-lg 才正常。这说明类名不熟时不要硬背,现场查。

易错点:btn 是基础类,漏了后面颜色类也不完整;a 标签加 btn 也能变按钮;btn-link 会让按钮看起来像超链接;块级按钮 btn-block 宽度跟父元素一样。

图片、辅助类与关闭按钮 ​

为什么需要:图片形状、文字/背景语义色、关闭符号、快速浮动都是页面常用小样式,单独写重复。

怎么想:这些属于辅助类,和按钮、表格共用 success/info/warning/danger 这套语义词。转写稿里用 bg-success 给容器加绿色背景;关闭按钮用 span 加类名做出叉号,它是纯 CSS 三角/符号,不是字体图标。

怎么做:图片形状类名、关闭按钮类名直接查文档;背景色用 bg-success 等;快速浮动也查辅助类文档。易错点:Bootstrap 的绿不是正绿,是调配过的语义色;类名不要死记,文档里“全局样式/辅助类”一查就有。

本节学习路线与易错点 ​

全局样式大部分是“复制—改内容—叠类名”,真正要理解的是类名组合关系和用栅格控制宽度。转写稿反复强调:不要局限于背类名,要熟悉文档结构,知道表格、表单、按钮、辅助类分别去哪里找。易错点集中在三处:引入顺序错、基础类漏写、用行内样式硬改布局。把这三处避开,全局样式就能快速拼出可用页面。

组件是什么:先建立“复制—改类名—改内容”的套路 ​

为什么需要:Bootstrap 的组件就是页面里现成的组成部分,比如导航条、下拉菜单、输入框组、字体图标、巨幕、路径导航、缩略图、分页等。转写稿反复强调:组件不是让你从零写,而是“需要哪个复制哪个”,再把内容和类名改成项目要的样子。

怎么想:先判断页面由哪些块组成,再去文档“组件”里找对应示例。找到后不要急着大改结构,先复制整段,再改文字、改颜色、改宽度。宽度优先交给栅格系统,组件本身负责外观和交互。

怎么做:基本引入顺序不能反,Bootstrap 3 依赖 jQuery,所以先引入 jQuery,再引入 Bootstrap 的 JS:

html
<link rel="stylesheet" href="./dist/css/bootstrap.min.css">
<script src="./dist/js/jquery.min.js"></script>
<script src="./dist/js/bootstrap.min.js"></script>

易错点:不要一上来背类名。转写稿里讲师明确说类名“不用刻意记,会看文档就行”。真正要熟的是文档结构:全局样式、组件、JS 插件分别去哪里找。

导航条:从示例改出项目导航 ​

为什么需要:导航条是页面顶部最常见的组件,包含标题、导航项、下拉菜单、搜索框、登录注册等。手写一个带响应式和下拉交互的导航条很费时间,用组件能快速拼出来。

怎么想:转写稿的调试过程是:先复制导航条示例,发现它默认是 container-fluid,内容贴满全屏;而案例要求内容在版心里,于是把 container-fluid 改成 container。颜色默认是灰的,案例要黑色,就把 navbar-default 改成 navbar-inverse。需要固定在顶部时加 navbar-fixed-top。

怎么做:核心是改类名和内容,不是重写结构:

html
<nav class="navbar navbar-inverse navbar-fixed-top">
  <div class="container">
    <!-- navbar-header、navbar-collapse 等结构从文档复制后改文字 -->
  </div>
</nav>

固定顶部后,转写稿发现第一个段落被导航条盖住,原因是固定定位脱离文档流。解决方法是给 body 或后续内容加上边距,讲者通过检查元素看到导航条约 51px 高,于是加:

css
body {
  padding-top: 51px;
}

易错点:navbar-fixed-top 不是“加了就完事”,要处理遮挡;container-fluid 和 container 是两种宽度效果,别混用。

下拉菜单、输入框组、字体图标:三个高频小件 ​

下拉菜单为什么需要:导航项多时要把“课程、视频”等收进下拉里。怎么想:它既是组件也带插件,示例里 data-toggle 等属性负责触发,aria- 开头属性主要给屏幕阅读器用,删掉一般不影响页面效果。怎么做:从导航条示例复制下拉结构,改菜单文字;分割线保留,讲师演示时它显示成一条线。易错点:不要自己臆造触发属性,按文档示例改 data- 属性最稳。

输入框组为什么需要:搜索框的输入框和按钮默认会分开,输入框组能让它们紧挨着。怎么想:把原来的普通 input 和 button 换成 input-group 结构。怎么做:从文档复制输入框组示例,替换导航条里的搜索表单。易错点:输入框组解决的是“贴合”,不要再用额外浮动硬挤。

字体图标为什么需要:搜索按钮里要放大镜,不想用图片。怎么想:Bootstrap 自带字体图标,用行内元素加类名即可。怎么做:转写稿演示用 i 标签,类名从组件文档复制:

html
<i class="glyphicon ..."></i>

易错点:类名要从文档复制,别凭记忆写;字体文件路径要跟 CSS 一起放对。

巨幕、缩略图、路径导航、分页等:按需复制 ​

巨幕为什么需要:做首屏大横幅。怎么想:复制 jumbotron 示例,再自己加背景图。转写稿建议不要直接改 Bootstrap 类名,而是自己加前缀类名,例如“小乐-”前缀。怎么做:

css
.xiaole-jumbotron {
  background: url("./images/xxx.jpg") center / cover;
  color: #fff;
}

易错点:背景图路径、文字颜色要自己处理;宽度仍建议放栅格里。

缩略图、路径导航、分页:转写稿只列了名字,没有展开具体结构。可靠做法是:在文档“组件”里找到对应示例,复制后改内容;路径导航用于层级位置,分页用于列表翻页。易错点:不要凭记忆写类名,具体类名和结构以文档为准。

组件和栅格配合:宽度交给栅格 ​

为什么需要:组件复制过来往往占满父元素,列表组、面板、选项卡需要控制宽度。怎么想:外层用 row 分行,再用 col-md-* 分列,把组件放进列里。怎么做:例如列表组放 col-md-4,面板放 col-md-3。易错点:栅格分的是父元素的 12 份,不是整个页面;嵌套时要在列里再写 row。组件学习的关键不是背,而是熟悉文档后快速复制、改类名、改内容,再用栅格收住布局。

先看插件在 Bootstrap 里的位置 ​

Bootstrap 文档通常分三块:全局 CSS、组件、JavaScript 插件。插件就是已经写好的交互效果,例如下拉菜单、collapse 展开收起、模态框 modal.js、轮播图 carousel.js,以及转写稿里重点演示的选项卡(tab)和工具提示(tooltip)。学习时不要一上来背类名,而要先掌握套路:先保证 jQuery 和 bootstrap.js 按顺序引入,再从文档复制结构,改文字和 data 属性;需要自己控制时,再用 jQuery 调插件方法。

html
<link rel="stylesheet" href="./dist/css/bootstrap.min.css">
<script src="./dist/js/jquery.min.js"></script>
<script src="./dist/js/bootstrap.min.js"></script>

为什么需要:插件依赖脚本,顺序错了效果不出现。怎么想:Bootstrap 3 的插件依赖 jQuery,所以先 jQuery 后 bootstrap.js。怎么做:把压缩版 CSS/JS 引入页面,自己写的样式和脚本放在后面。易错点:把 bootstrap.js 写在 jQuery 前面;以为只引 CSS 就能弹框;把 bootstrap.min.css.map 当成业务文件,其实它只方便压缩后调试。

下拉菜单 dropdown ​

为什么需要:导航里“课程”“视频”等需要二级菜单,手写显示隐藏和点击外部关闭很繁琐。怎么想:Bootstrap 用 data-toggle="dropdown" 驱动,结构复制后改文字即可。怎么做:父项加 dropdown,触发链接加 dropdown-toggle 和 data-toggle="dropdown",菜单用 dropdown-menu;分割线用 divider。易错点:删掉 data-toggle 后菜单不弹;divider 是分割线不是文字;下拉菜单本身也是插件,不能只写 CSS 类名。

html
<li class="dropdown">
  <a href="#" class="dropdown-toggle" data-toggle="dropdown">课程</a>
  <ul class="dropdown-menu">
    <li><a href="#">HTML</a></li>
    <li role="separator" class="divider"></li>
    <li><a href="#">JavaScript</a></li>
  </ul>
</li>

collapse 展开收起 ​

为什么需要:导航条在窄屏要折叠成三横杠,点开再显示菜单;手写高度动画容易出错。怎么想:转写稿里的导航条用了 navbar-collapse,三横杠按钮负责展开收起,这背后就是 collapse 插件。怎么做:复制导航条结构,保留 data-toggle="collapse" 和 data-target,改菜单文字。易错点:导航条固定顶部后会脱离文档流,下面的第一个段落被盖住;转写稿的调试是给 body 加上边距,按导航条高度约 51px 处理。

html
<button data-toggle="collapse" data-target="#navMenu">展开/收起</button>
<div id="navMenu" class="collapse">菜单内容</div>

选项卡 tab 插件:转写稿的重点推导 ​

为什么需要:选项卡要点击标题切换内容,自己写要维护选中状态和内容显隐。怎么想:标题的 href="#home" 对应内容区的 id="home",再加 data-toggle="tab",插件就能接管。怎么做:先复制文档结构,改标题和内容;如果要让外部按钮控制选项卡,用 jQuery 选中对应链接并调用 .tab('show')。易错点:转写稿特别调试过——document.querySelector() 得到原生 DOM 对象,没有 .tab();必须用 $() 得到 jQuery 对象再调用。ARIA 属性删掉不影响功能,但它是给屏幕阅读器做无障碍阅读的,不要误以为它是效果开关。

html
<ul class="nav nav-tabs">
  <li class="active"><a href="#home" data-toggle="tab">首页</a></li>
  <li><a href="#message" data-toggle="tab">消息</a></li>
</ul>
<div class="tab-content">
  <div class="tab-pane active" id="home">首页内容</div>
  <div class="tab-pane" id="message">消息内容</div>
</div>
js
$('#btnHome').click(function () {
  $('a[href="#home"]').tab('show');
});

工具提示 tooltip ​

为什么需要:按钮或链接需要悬浮提示,纯 title 样式不可控。怎么想:Bootstrap 用 data-toggle="tooltip" 声明插件,title 放提示文字,data-placement 控制方向。怎么做:从文档复制示例,改 title 和方向;它同样依赖 bootstrap.js。易错点:只写 title 不会变成 Bootstrap 提示;删掉 data-toggle 后插件不接管;不要把提示文字写成按钮可见文字。

html
<button class="btn btn-default"
        data-toggle="tooltip"
        data-placement="top"
        title="提示文字">按钮</button>

为什么需要:模态框用于弹层确认,轮播图用于多图切换,都是常见但手写成本高的交互。怎么想:它们和下拉、collapse 一样,优先在“插件”页找示例复制,再改内容和尺寸;转写稿明确说这两个放到综合案例中演示,因此这里不编造额外参数。怎么做:先确认脚本已引入,再复制对应示例结构,保留触发按钮和内容容器的对应关系。易错点:不要在没有引入 bootstrap.js 时手写动画;不要删掉触发按钮与目标容器之间的对应属性;固定导航条遮挡内容的问题同样要在综合案例里检查。

调试顺序与学习原则 ​

为什么需要:插件代码是现成的,出错多半在引入顺序、复制遗漏和对象类型。怎么想:先看控制台,再查 jQuery 是否先加载,最后查 data-* 是否完整。怎么做:按“引入脚本→复制结构→改文字→需要时写 jQuery 调用”的顺序做。易错点:把 data-toggle 写成 data-togo;把 .tab() 用在原生 DOM 上;忘了固定导航条要给内容让出上边距。掌握这套套路后,换其他界面框架也能快速上手。

课堂画面 ​

课堂画面 1

课堂画面 2

课堂画面 3

课堂画面 4

课堂画面 5

课堂画面 6

代码示例 ​

示例一:Bootstrap 基本使用 + 栅格系统 ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Bootstrap 基本使用</title>
  <!-- 引入编译好的压缩版样式 -->
  <link rel="stylesheet" href="./dist/css/bootstrap.min.css">
</head>
<body>
  <div class="container">
    <div class="page-header">
      <h1>Bootstrap 基本使用 <small>基本使用</small></h1>
    </div>

    <!-- 一行放 4 个,每个占 12 份里的 3 份 -->
    <div class="row">
      <div class="col-md-3">1</div>
      <div class="col-md-3">2</div>
      <div class="col-md-3">3</div>
      <div class="col-md-3">4</div>
      <div class="col-md-3">5</div>
    </div>

    <!-- 列嵌套:8 份里再分成 6 + 6 -->
    <div class="row">
      <div class="col-md-4">占 4 份</div>
      <div class="col-md-8">
        <div class="row">
          <div class="col-md-6">内层 6 份</div>
          <div class="col-md-6">内层 6 份</div>
        </div>
      </div>
    </div>

    <!-- 表格:一个 table 类名就有样式,其他是状态类 -->
    <table class="table table-bordered table-hover">
      <thead>
        <tr>
          <th>编号</th>
          <th>课程</th>
        </tr>
      </thead>
      <tbody>
        <tr class="success">
          <td>1</td>
          <td>HTML5</td>
        </tr>
        <tr class="danger">
          <td>2</td>
          <td>CSS3</td>
        </tr>
      </tbody>
    </table>

    <p class="text-danger">红色文字</p>
    <p class="text-success">绿色文字</p>
    <button class="btn btn-danger">按钮</button>
    <button class="btn btn-info btn-lg">大按钮</button>
    <button class="btn btn-default btn-sm">小按钮</button>
    <button class="btn btn-default btn-block">块级按钮</button>
  </div>

  <!-- 顺序不能反:先 jQuery,再 bootstrap -->
  <script src="./dist/js/jquery.min.js"></script>
  <script src="./dist/js/bootstrap.min.js"></script>
</body>
</html>

要点解释关键行和易错点:

  • bootstrap.min.css / bootstrap.min.js 是压缩版(把空格换行去掉了,体积更小,正式用),bootstrap.css 是未压缩版,便于调试。
  • container 是版心,宽度本身是响应式的;row 必须包在 container(或 container-fluid)里,col-* 必须包在 row 里,这是栅格的三层结构。
  • col-md-3 的 md 是中等屏幕(≥992px),一共 12 份,占 3 份就是 1/4;一行放满 12 份之后多余的元素会自动换行。
  • 列嵌套时,内层再分 12 份是相对于父列,不是相对于整个页面。
  • table、table-bordered、table-hover 可以叠加;success / info / warning / danger 这套颜色词在表格、按钮、文字、背景里通用。
  • 易错点:jQuery 必须先引入,Bootstrap 3 依赖 jQuery,顺序反了插件就不好使。
  • 易错点:btn-block 让它变成块元素、宽度和父元素一样,注意父级宽度。

示例二:响应式栅格系统 ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>响应式栅格系统</title>
  <link rel="stylesheet" href="./dist/css/bootstrap.min.css">
  <style>
    [class*="col-"] {
      border: 1px solid #ccc;
      padding: 10px;
    }
  </style>
</head>
<body>
  <!-- container 自带响应式宽度:768→750,992→970,1200→1170 -->
  <div class="container bg-success">

    <!-- 每种屏幕都单独设计:超小 6、小 4、中 3、大 2 -->
    <div class="row">
      <div class="col-xs-6 col-sm-4 col-md-3 col-lg-2">1</div>
      <div class="col-xs-6 col-sm-4 col-md-3 col-lg-2">2</div>
      <div class="col-xs-6 col-sm-4 col-md-3 col-lg-2">3</div>
      <div class="col-xs-6 col-sm-4 col-md-3 col-lg-2">4</div>
      <div class="col-xs-6 col-sm-4 col-md-3 col-lg-2">5</div>
      <div class="col-xs-6 col-sm-4 col-md-3 col-lg-2">6</div>
    </div>

    <!-- 只写 sm 和 md:小于 768 时没有设置,默认占满 -->
    <div class="row">
      <div class="col-sm-6 col-md-3">只写了 sm 和 md</div>
      <div class="col-sm-6 col-md-3">只写了 sm 和 md</div>
    </div>

    <!-- 列偏移:占 6 份再向右偏 3 份,等于居中 -->
    <div class="row">
      <div class="col-md-6 col-md-offset-3">col-md-6 col-md-offset-3</div>
    </div>

    <!-- 响应式工具类:在小屏幕上隐藏 -->
    <div class="row">
      <div class="col-md-6 hidden-sm">我在小屏幕上隐藏</div>
      <div class="col-md-6">正常显示</div>
    </div>
  </div>

  <script src="./dist/js/jquery.min.js"></script>
  <script src="./dist/js/bootstrap.min.js"></script>
</body>
</html>

要点解释关键行和易错点:

  • 断点:xs < 768,sm 768~992,md 992~1200,lg ≥ 1200,对应 sm=small、md=medium、lg=large。
  • 移动优先:内部媒体查询写的是 min-width,所以只写 col-md-6 时,大屏幕(lg)也按 md 的 6 份走,除非你给 lg 单独设置了;而比 md 小的屏幕相当于“没设置”,默认占满整行。
  • 所以规则是:比自己大的屏幕沿用设置,比自己小的屏幕默认 100%。
  • col-md-offset-3 是向右偏移 3 份,和 col-md-6 加起来正好 12,实现居中;如果只写 offset 不写宽度,容易看不出效果。
  • 易错点:偏移和占的份数要同步写,比如 col-md-6 配 col-md-offset-3,只在 md 及以上生效,小屏幕既不占 6 份也不偏移。
  • 易错点:hidden-sm 只是在该尺寸隐藏,不是“小及以下都隐藏”,其他尺寸仍正常显示。
  • 选择器 [class*="col-"] 是属性选择器,class 值里包含 col- 的都命中,用来统一加边框方便观察。

示例三:导航条 + 选项卡插件 ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>导航条与选项卡</title>
  <link rel="stylesheet" href="./dist/css/bootstrap.min.css">
  <style>
    /* 固定定位脱离文档流,用上内边距把内容让出来 */
    body { padding-top: 51px; }
    .xiaole-tab { margin-top: 20px; }
  </style>
</head>
<body>
  <!-- 导航条:直接复制组件改内容,navbar-inverse 变黑底白字 -->
  <nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container">
      <div class="navbar-header">
        <button class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-navbar">
          <span class="sr-only">切换导航</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
        <a class="navbar-brand" href="#">上硅谷</a>
      </div>

      <div class="collapse navbar-collapse" id="bs-navbar">
        <ul class="nav navbar-nav">
          <li class="active"><a href="#">首页</a></li>
          <li><a href="#">视频</a></li>
          <li><a href="#">课程</a></li>
          <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">前端 <span class="caret"></span></a>
            <ul class="dropdown-menu">
              <li><a href="#">HTML5</a></li>
              <li><a href="#">CSS3</a></li>
              <li><a href="#">JavaScript</a></li>
              <li role="separator" class="divider"></li>
              <li><a href="#">Vue</a></li>
              <li><a href="#">React</a></li>
            </ul>
          </li>
        </ul>

        <!-- 输入框组让输入框和按钮紧挨着 -->
        <form class="navbar-form navbar-left">
          <div class="input-group">
            <input type="text" class="form-control">
            <span class="input-group-btn">
              <button class="btn btn-default" type="button">
                <span class="glyphicon glyphicon-search"></span>
              </button>
            </span>
          </div>
        </form>

        <ul class="nav navbar-nav navbar-right">
          <li><a href="#">登录</a></li>
          <li><a href="#">注册</a></li>
        </ul>
      </div>
    </div>
  </nav>

  <div class="container">
    <div class="row">
      <div class="col-md-6">
        <!-- 选项卡:标题用 nav-tabs,href 对应下面面板的 id -->
        <ul class="nav nav-tabs" role="tablist">
          <li role="presentation" class="active">
            <a href="#home" data-toggle="tab" role="tab">首页</a>
          </li>
          <li role="presentation">
            <a href="#profile" data-toggle="tab" role="tab">视频</a>
          </li>
          <li role="presentation">
            <a href="#message" data-toggle="tab" role="tab">课程</a>
          </li>
          <li role="presentation">
            <a href="#settings" data-toggle="tab" role="tab">设置</a>
          </li>
        </ul>

        <div class="tab-content xiaole-tab">
          <div class="tab-pane active" id="home" role="tabpanel">首页的内容</div>
          <div class="tab-pane" id="profile" role="tabpanel">视频的内容</div>
          <div class="tab-pane" id="message" role="tabpanel">课程的内容</div>
          <div class="tab-pane" id="settings" role="tabpanel">设置的内容</div>
        </div>
      </div>
    </div>
  </div>

  <script src="./dist/js/jquery.min.js"></script>
  <script src="./dist/js/bootstrap.min.js"></script>
</body>
</html>

要点解释关键行和易错点:

  • navbar-inverse 直接变黑底白字,比手写样式省事;navbar-fixed-top 会变成直角并固定在顶部。
  • 固定定位会脱离文档流,后面的内容会被盖住,所以要给 body 加 padding-top(按导航条实际高度,这里约 51px)。
  • navbar-header 里的三个 icon-bar 就是响应式那个“三条杠”,配合 data-toggle="collapse" 和 data-target="#bs-navbar" 使用,靠的是 collapse 插件,一行 JS 都不用写。
  • data-toggle="dropdown" 是下拉菜单插件;divider 是下拉里的分割线;caret 是那个小三角。
  • 搜索框用 input-group + input-group-btn 才能让输入框和按钮紧挨着;图标用 glyphicon glyphicon-search,需要 dist/fonts 字体文件在位,否则图标显示成方块——这是最常见的易错点。
  • 选项卡靠的是 data-toggle="tab" 加上 href="#id",这个 #id 对应下面 tab-pane 的 id,不是锚点跳转;active 决定默认选中的是哪一项和哪块内容。
  • 复制过来的 role、aria-* 属性是给屏幕阅读器用的,删掉不影响功能。
  • 易错点:tab-pane 的 id 和 href 对不上、忘了给默认面板加 active,就会出现点了没反应或者一进去什么都不显示。
  • 想自己改样式时,按转写稿建议加自己的前缀类名(如 xiaole-tab),不要直接改 Bootstrap 的类,保证选择器权重够或者写在后边覆盖。

常见错误 ​

  1. 现象:下拉菜单、模态框、选项卡点击无反应,控制台报 jQuery is not defined → 原因:Bootstrap 3 插件依赖 jQuery,且引入顺序写反或漏引 → 修法:按 jquery.min.js → bootstrap.min.js 顺序引入,生产用压缩版、调试可换未压缩版。
  2. 现象:小屏下列布局突然全宽或挤成一行 → 原因:只写了 col-md-*,小屏断点没有显式设计,移动优先下未设置的断点按默认全宽处理 → 修法:按 xs/sm/md/lg 逐级确认,必要时补 col-xs-*、col-sm-*,并在浏览器不同宽度下实测。
  3. 现象:栅格出现横向滚动、左右间距怪异、列高不齐 → 原因:col 没放在 .row 里,或 .row 没放在 .container/.container-fluid 里,负边距和 padding 配套关系被破坏 → 修法:固定使用 container > row > col 层级,嵌套列时在列内再写 row > col。
  4. 现象:自定义按钮/导航条样式不生效 → 原因:选择器权重低于 Bootstrap,或自定义 CSS 引入在 Bootstrap 之前 → 修法:自定义样式放在 Bootstrap 之后,加项目前缀类提高权重,避免直接改框架源码。
  5. 现象:复制组件后插件不触发,或删了 data-* 后功能消失 → 原因:把驱动插件的 data-toggle/data-target 当冗余属性删掉;aria-* 主要服务屏幕阅读器,功能属性不能删 → 修法:保留 data-*,按文档改值;aria-* 可保留,便于无障碍阅读。
  6. 现象:导航条 navbar-fixed-top 后首屏内容被盖住 → 原因:固定定位脱离文档流,后续内容顶到导航条下面 → 修法:给 body 或主内容加等于导航高度的 padding-top/margin-top,并随导航高度调整。
  7. 现象:表格、表单复制后“没样式” → 原因:只复制了结构,漏了 .table、.form-group、.form-control 等基础类 → 修法:先补基础类,再按需叠加 .table-bordered/.table-hover、水平表单栅格等状态类。
  8. 现象:用 querySelector 拿到元素后调 .tab() 报错 → 原因:插件方法挂在 jQuery 对象上,DOM 对象没有该方法 → 修法:用 $()/jQuery() 获取元素后再调用插件方法,明确 DOM 对象与 jQuery 对象区别。

练习 ​

  1. 用 Bootstrap 3 搭一个响应式导航条:品牌、首页/课程/视频下拉、输入框组搜索、登录/注册;要求固定顶部,并解决内容被遮挡问题,记录各断点下的折叠表现。
  2. 用栅格实现商品列表:xs 1 列、sm 2 列、md 3 列、lg 4 列;给每列加边框和内边距,要求不撑破布局,并测试 768/992/1200 附近的变化。
  3. 在同一行放一个表格和一个表单:表格加基础类、边框、悬停;表单做水平排列;小屏时自动堆叠,按钮和输入框使用输入框组/按钮组。
  4. 用选项卡插件完成两种写法:先纯 data-* 实现,再用 jQuery 调用 .tab() 切换到指定项;说明为什么不能直接用 querySelector 的结果调插件方法。
  5. 用工具提示实现四个方向的提示,修改提示文字和方向;再做一个“导航条 + 巨幕 + 面板/缩略图 + 轮播图”的小综合页,要求组件复制后改内容、加自定义前缀类覆盖样式。

原视频对照 ​

#视频时长
1BootStrap介绍13:32
2Bootstrap基本使用32:32
3Bootstrap的栅格系统32:06
4Bootstrap的全局样式12:40
5Bootstrap组件06:44
6Bootstrap插件19:26
7Bootstrap页面案例0114:14

小结 ​

  1. 本阶段重点不是背类名,而是掌握“引资源→搭栅格骨架→复制组件改内容→用 data-* 启插件→自定义样式覆盖”的界面框架使用套路。
  2. Bootstrap 3 兼容性好且依赖 jQuery;4/5 技术方向不同,但组件化、栅格化、插件化的使用脉络一致,迁移学习成本可控。
  3. 栅格必须按移动优先和断点来设计,行/列层级不能乱;只写一个断点类名时,要明确小屏和大屏分别继承到什么效果。
  4. 插件排错先看依赖和引入顺序,再看 data-* 是否完整;调试用未压缩资源,生产用 min 资源,并保留 map 便于定位。
  5. 组件和插件文档的熟悉度直接决定开发效率;需要什么复制什么,但复制后必须按项目内容、断点和样式规范改造。
  6. 自定义样式要放在框架样式之后,用项目前缀类隔离,避免升级或换框架时大面积冲突。
  7. 源码和 Less 结构值得借鉴,但日常开发优先使用编译产物;固定导航、栅格嵌套、表单/表格基础类是案例中最容易翻车的检查点。