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
.checkbox
class要求结构固定
.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"> |
.radio
class要求固定结构
.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-inline
or.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
的.close
button必须是第一个子节点
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