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