Bootstrap响应式的HTML嵌套规则
使用Bootstrap已经很长时间了,总结一些HTML嵌套规则和Bootstrap的
class使用。本来要自己总结的,重新看Bootstrap官网时发现了bootlint,所以直接把内容搬了过来,进行了分类汇总。
Bootlint使用
Bootlint是Bootstrap官方推出的一个工具,用来检测HTML结构是否符合Bootstrap响应式的规则。因为不正确的HTML嵌套,Bootstrap响应式效果不会生效。
bootlint:问题代码参考地址https://github.com/twbs/bootlint/wiki
手动引入bootlint.js
在
</body>之前引入bootlint.js
使用bookmarklet动态引入
添加一个书签,url配置为:
 1
2 > javascript:(function(){var s=document.createElement("script");s.onload=function(){bootlint.showLintReportForCurrentDocument([]);};s.src="https://maxcdn.bootstrapcdn.com/bootlint/latest/bootlint.min.js";document.body.appendChild(s)})();
>
当你点击书签时,自动在当前页面引入。
Bootstrap的HTML嵌套规则
为什么要了解
Bootstrap框架规定的HTML嵌套规则呢?因为只有了解了嵌套规则才能把响应式布局用好。
.container
.container和.container-fluid不能嵌套
1  | <!-- wrong -->  | 
.row
.row的子节点应该只有.col-*-*
Bootlint found non-grid-column children of grid rows. Bootstrap’s grid system requires that all children of grid rows must be grid columns.
Wrong:
1  | <div class="row">  | 
Right:
1  | <div class="row">  | 
.row必须是.container或者.container-fluid的后代节点
1  | <div class="container">  | 
.row and .col-*-* 不能同时用在同一个元素上
Wrong:
1  | <div class="row col-xs-6">...</div>  | 
Right (Note that the two options have different meanings):
1  | <div class="row">  | 
column(.col-*-*)
.col-*-*不能应用float属性
wrong
1  | <div class="col-sm-7 pull-right">  | 
多余的col-*-*
1  | <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"></div>  | 
col-xs-6适用于等于和大于它的尺寸,所以其它col-sm-6 col-md-6 col-lg-6都是多余的。但是不同的尺寸下,宽度不一样时,不能这样使用。
1  | <div class="col-xs-6">这样就行了</div>  | 
.col-*-*只应该是.row和.form-groups的子节点
Wrong:
1  | <div class="my-random-thing">  | 
Right:
1  | <div class="row">  | 
.input-group
.input-group 不能包含 <select>
Wrong:1
2
3
4
5
6
7
8
9<!-- select 不能自适应宽度 在webkit浏览器中 -->
<div class="input-group">
  <span class="input-group-addon">$</span>
  <select class="form-control">
    <option value="5.00"><option>
    <option value="50.00"><option>
    <option value="500.00"><option>
  </select>
</div>
.input-group 不能包含 <textarea>
Wrong:1
2
3
4
5<!-- input-group只能包含那些基于input的元素 -->
<div class="input-group">
  <span class="input-group-addon">✉</span>
  <textarea class="form-control" placeholder="To Whom It May Concern:"></textarea>
</div>
.input-group不能包含多个.form-control元素
Wrong (unsupported):
1  | <div class="input-group">  | 
Right (supported):
1  | <div class="input-group">  | 
Wrong (unsupported):
1  | <div class="input-group">  | 
Right (supported):
1  | <div class="input-group">  | 
.input-group和.form-group不能同时应用同一元素
应该在
.from-group中嵌套.input-group
Wrong:
1  | <div class="form-group input-group">  | 
Right:
1  | <div class="form-group">  | 
.input-group and .col-*-* 不能同时直接应用在同一元素上
.col-*-*不能用在.input-group元素上. 应该在.col-*-*中嵌套.input-group
Wrong:
1  | <div class="input-group col-sm-5">  | 
Right:
1  | <div class="col-sm-5">  | 
.input-group不支持在input单边(左边或者右边)包含多个.input-group-addon
Right (two add-ons are fine so long as they’re on different sides):
1  | <div class="input-group">  | 
Wrong:
1  | <div class="input-group">  | 
Wrong:
1  | <div class="input-group">  | 
button
.btn 只能用在<a> button <label>  <input>元素上
1  | <a class="btn btn-primary">Button</a>  | 
button和input大小(在input-group中)
应该使用
input-group-lg代替btn-lg
Wrong:
1  | <div class="input-group">  | 
Right:
1  | <div class="input-group input-group-lg">  | 
.btn.dropdown-toggle 只能是button group最后一个元素.
Due to current limitations, for proper rendering, the dropdown toggle button in a split button dropdown must be the last button in the .btn-group.
Wrong:1
2
3
4
5
6
7
8
9
10
11
12
13
14<div class="btn-group">
  <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown">
    <span class="caret"></span>
    <span class="sr-only">Toggle Dropdown</span>
  </button>
  <ul class="dropdown-menu" role="menu">
    <li><a href="#">Action</a></li>
    <li><a href="#">Another action</a></li>
    <li><a href="#">Something else here</a></li>
    <li class="divider"></li>
    <li><a href="#">Separated link</a></li>
  </ul>
  <button type="button" class="btn btn-danger">Action</button>
</div>
Right:1
2
3
4
5
6
7
8
9
10
11
12
13
14<div class="btn-group">
  <button type="button" class="btn btn-danger">Action</button>
  <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown">
    <span class="caret"></span>
    <span class="sr-only">Toggle Dropdown</span>
  </button>
  <ul class="dropdown-menu" role="menu">
    <li><a href="#">Action</a></li>
    <li><a href="#">Another action</a></li>
    <li><a href="#">Something else here</a></li>
    <li class="divider"></li>
    <li><a href="#">Separated link</a></li>
  </ul>
</div>
checkbox
.checkboxclass要求结构固定
.checkbox>label>input[type="checkbox"]
1  | <div class="checkbox">  | 
.checkbox-inline 只能用在 <label>元素
Wrong:
1  | <span class="checkbox-inline">  | 
Right:
1  | <label class="checkbox-inline">  | 
.checkbox-inline class正确的标签结构
正确的结构是
label.checkbox-inline>input[type="checkbox"]
.checkbox-inline requires a specific DOM structure. There cannot be any intervening layers of elements.
Wrong:
1  | <label class="checkbox-inline">  | 
Right:
1  | <label class="checkbox-inline">  | 
.radioclass要求固定结构
.radio>label>input[type="radio"]
1  | <div class="radio">  | 
.radio-inline 只应该用在 <label>元素
Wrong:
1  | <span class="radio-inline">  | 
Right:
1  | <label class="radio-inline">  | 
.radio-inline class正确使用方式
正确标签结构:
label.radio-inline>input[type="radio"]
.radio-inline requires a specific DOM structure. There cannot be any intervening layers of elements.
Wrong:
1  | <label class="radio-inline">  | 
Right:
1  | <label class="radio-inline">  | 
.active & checked
.checkbox和.radio的.active状态
.bt-group中使用.checkbox和.radio,当input[type="checkbox"]和input[type="radio"]元素是checked状态,它们的<label>标签必须添加.active样式。
Wrong:
1  | <div class="btn-group" data-toggle="buttons">  | 
Right:
1  | <div class="btn-group" data-toggle="buttons">  | 
Wrong:
1  | <div class="btn-group" data-toggle="buttons">  | 
Right:
1  | <div class="btn-group" data-toggle="buttons">  | 
panel
.panel-footer和.panel-heading 父元素必须是 .panel
.panel-footer、 .panel-heading必须是.panel的直接子节点。.panel-footer、.panel-heading 和 .panel之间不能有任何的其它节点干扰。
Wrong:
1  | <div class="panel panel-default">  | 
Right:
1  | <div class="panel panel-default">  | 
.panel-title父元素必须是.panel-heading
table
.table-responsice应用在table的父元素上,而不是table元素
Wrong:
1  | <table class="table table-responsive">  | 
Right:
1  | <div class="table-responsive">  | 
form
.form-group元素不能嵌套
1  | <div class="form-group">  | 
.form-inline 或者.form-horizontal直接使用在 .form-group. 元素上
或者
.form-group嵌套在.form-inlineor.form-horizontal内部
1  | <div class="form-inline">  | 
.form-control-feedback
.form-control-feedback元素的祖先元素必须有.form-group.has-feedback样式
Wrong:
1  | <div class="form-group has-error">  | 
Right:
1  | <div class="form-group has-feedback has-error">  | 
.form-control不能用在没有交互输入的文本属性的input上
Right
1  | <input type="text" class="form-control" value="Text input" />  | 
glyphicon
.glyphicon-*必须和.glyphicon结合使用
1  | <span class="glyphicon glyphicon-heart"></span>  | 
.glyphicon-*的元素,不能有子节点和文本节点
Wrong:
1  | <span class="glyphicon glyphicon-heart"><a href="#love">I love this</a></span>  | 
Right:
1  | <span class="glyphicon glyphicon-heart"></span> <a href="#love">I love this</a>  | 
modal
modal正确的嵌套结构
.modal .modal-dialog .modal-content .modal-header .modal-title .modal-body .modal-footer嵌套结构不能改变。
.modal-header .modal-footer是可选的。
1  | <div class="modal fade">  | 
.hide should not be used on .modal in Bootstrap v3.
.hide在Bootstrap3中不能应用在.modal身上。
.modal必须含有tabindex和role属性
1  | <div class="modal" tabindex="-1" role="dialog">  | 
.modal-dialog元素必须含有role="document"
1  | <div class="modal-dialog" role="document">  | 
.alert
.alert 包含dismiss button时 必须包含 .alert-dismissible样式
1  | <div class="alert alert-warning alert-dismissible" role="alert">  | 
.alert的.closebutton必须是第一个子节点
1  | <div class="alert alert-warning alert-dismissible" role="alert">  | 
media
.media-left and .media-right 在.media 内部使用.
1  | <div class="media">  | 
nav
.navbar-left and .navbar-right should not be used outside of navbars.
1  | <nav class="navbar navbar-default">  | 
.carousel
.carousel-inner 必须有一个活动状态的子节点 .item.active
1  | <div class="carousel-inner" role="listbox">  | 
.carousel 必须有且只有一个 .carousel-inner 子节点
1  | <div id="carousel-example-generic" class="carousel slide">  | 
等等规则,详情见bootlint wiki
参考
https://www.tutorialrepublic.com/twitter-bootstrap-tutorial/
https://github.com/twbs/bootlint/
https://github.com/twbs/bootlint/blob/master/dist/browser/bootlint.js