bootstrap中的container row与col
比较好奇bootstarp是如何写响应式的也就是container row col是怎么形成的.先来看看container代码
container
.container {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
@media (min-width: 768px) {
.container {
width: 750px;
}
}
@media (min-width: 992px) {
.container {
width: 970px;
}
}
@media (min-width: 1200px) {
.container {
width: 1170px;
}
}
.container-fluid {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
这里是bootstrap中的container. 在正常的PC也就是大于1200px的情况下 container宽度是1170px 但是无论是1200px还是992,768px.这里都给container设置了一个margin-left,right:auto和paading-left,right:15px。 为什么? 先不急 我们来看看row是怎么写的
row
.row {
margin-right: -15px;
margin-left: -15px;
}
很简单.就一句话 给margin-right和left设置了一个-15px 抵消了container的padding 15px 在来看看 col-sm col-xs 之类的是怎么写的
col--
col-xx-xx的通用定义
所有分辨率下是如何定义.col-xx-xx的
.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
position: relative;
min-height: 1px;
padding-right: 15px;
padding-left: 15px;
}
首先所有的col-xx-xx都要遵循一个规则.他们的规则是
- 不脱离文档流但可以拥有left,right,top,bottom等属性设置(position:relative)
- 设置了一个最小高度1px(min-height: 1px)
- 设置了內右边距15px(padding-right:15px)
- 这些了內左边距15px(padding-left:15px)
col-xs-xx
然后我们来看看通用分辨率下的.col-xs-xx的定义 因为.col-xs-xx是不需要考虑分辨率的
.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
float: left;
}
.col-xs-12 {
width: 100%;
}
.col-xs-11 {
width: 91.66666667%;
}
.col-xs-10 {
width: 83.33333333%;
}
.col-xs-9 {
width: 75%;
}
.col-xs-8 {
width: 66.66666667%;
}
.col-xs-7 {
width: 58.33333333%;
}
.col-xs-6 {
width: 50%;
}
.col-xs-5 {
width: 41.66666667%;
}
.col-xs-4 {
width: 33.33333333%;
}
.col-xs-3 {
width: 25%;
}
.col-xs-2 {
width: 16.66666667%;
}
.col-xs-1 {
width: 8.33333333%;
}
.col-xs-pull-12 {
right: 100%;
}
.col-xs-pull-11 {
right: 91.66666667%;
}
.col-xs-pull-10 {
right: 83.33333333%;
}
.col-xs-pull-9 {
right: 75%;
}
.col-xs-pull-8 {
right: 66.66666667%;
}
.col-xs-pull-7 {
right: 58.33333333%;
}
.col-xs-pull-6 {
right: 50%;
}
.col-xs-pull-5 {
right: 41.66666667%;
}
.col-xs-pull-4 {
right: 33.33333333%;
}
.col-xs-pull-3 {
right: 25%;
}
.col-xs-pull-2 {
right: 16.66666667%;
}
.col-xs-pull-1 {
right: 8.33333333%;
}
.col-xs-pull-0 {
right: auto;
}
.col-xs-push-12 {
left: 100%;
}
.col-xs-push-11 {
left: 91.66666667%;
}
.col-xs-push-10 {
left: 83.33333333%;
}
.col-xs-push-9 {
left: 75%;
}
.col-xs-push-8 {
left: 66.66666667%;
}
.col-xs-push-7 {
left: 58.33333333%;
}
.col-xs-push-6 {
left: 50%;
}
.col-xs-push-5 {
left: 41.66666667%;
}
.col-xs-push-4 {
left: 33.33333333%;
}
.col-xs-push-3 {
left: 25%;
}
.col-xs-push-2 {
left: 16.66666667%;
}
.col-xs-push-1 {
left: 8.33333333%;
}
.col-xs-push-0 {
left: auto;
}
.col-xs-offset-12 {
margin-left: 100%;
}
.col-xs-offset-11 {
margin-left: 91.66666667%;
}
.col-xs-offset-10 {
margin-left: 83.33333333%;
}
.col-xs-offset-9 {
margin-left: 75%;
}
.col-xs-offset-8 {
margin-left: 66.66666667%;
}
.col-xs-offset-7 {
margin-left: 58.33333333%;
}
.col-xs-offset-6 {
margin-left: 50%;
}
.col-xs-offset-5 {
margin-left: 41.66666667%;
}
.col-xs-offset-4 {
margin-left: 33.33333333%;
}
.col-xs-offset-3 {
margin-left: 25%;
}
.col-xs-offset-2 {
margin-left: 16.66666667%;
}
.col-xs-offset-1 {
margin-left: 8.33333333%;
}
.col-xs-offset-0 {
margin-left: 0;
}
okay 先不看这些代码.我们先来探讨个问题 当float:left和position:relative混合在一起会产生什么效果?
脱离文档流
定义和用法float 属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可能地窄。注释:假如在一行之上只有极少的空间可供浮动元素,那么这个元素会跳至下一行,这个过程会持续到某一行拥有足够的空间为止。
脱离文档流的意思就是 当一个元素脱离文档流后 其他的元素进行排列的时候都会忽视这个元素 比如float和position:absolute那么float脱离文档流后.因为position:relative是没有脱离文档流的,那么position的元素最自动往上浮靠近float 来看一段代码.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
font-family: '微软雅黑'
}
.box1{
width: 300px;
height: 300px;
background: red;
}
.floatPosition{
position: relative;
width:100px;
height: 100px;
background:gray;
}
</style>
</head>
<body>
<div class="box1">
<div class="floatPosition" style="background-color: gray;z-index: 2;float:left">1</div>
<div class="floatPosition" style="background-color: #432;left: 100px;">22</div>
<div class="floatPosition" style="background-color: black;left: 100px;">333</div>
</div>
</body>
</html>
会产生如上图的效果.其中box1中的第一个div是设置了float的,第二个,第三个都是没有设置float. 那么我们改动下给第一个div加上一个left:120px 效果如下图
其中float是距离左边也就是box1有120个px像素的.因为设置了z-index:2 那么第一个div是会在第二个div上面的.那么为什么第三个div仍旧在下面而不是上去的呢?因为position:relative是没有脱离文档流的,所以第三个,第二个div仍旧独占一行.但是float是脱离文档流的所有独占一行的时候是不会考虑float的.因为同时设置了float和postion那么第一个div即拥有left,right,bottom,top这些属性设置 也拥有脱离文档流的功能.再设置一下 给第二个div加上float同是给第二个div宽度设置为201px 效果如下图
其中第三个div是浮上去了 因为是不考虑已经脱离文档流的元素 但是呢 第三个div上面的文字仍旧是考虑文档流的排列的 所以文字会在最下面.但是我们给第二个div设置了float为什么他还是没有浮上去呢?这就涉及到float的一个属性
假如在一行之上只有极少的空间可供浮动元素,那么这个元素会跳至下一行,这个过程会持续到某一行拥有足够的空间为止。
第一个float元素宽度是100px 第二个float元素宽带是201px 其中box1的宽带是300px; 所以100px+201px>300px 所以会浮动下去.bootstrap也是利用float属性来做自适应的.
col-sm-xx
@media (min-width: 768px) {
.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
float: left;
}
.col-sm-12 {
width: 100%;
}
.col-sm-11 {
width: 91.66666667%;
}
.col-sm-10 {
width: 83.33333333%;
}
.col-sm-9 {
width: 75%;
}
.col-sm-8 {
width: 66.66666667%;
}
.col-sm-7 {
width: 58.33333333%;
}
.col-sm-6 {
width: 50%;
}
.col-sm-5 {
width: 41.66666667%;
}
...略
}
其中col-sm-xx是在屏幕最低分辨率为768px才设置的那么屏幕分辨率没有768px col-sm-xx宽度是多少呢?显而易见 在屏幕分辨率低于768px后 bootstrap是没有给他设置一个固定的宽度 也就是说无论是col-sm-10 还是col-sm-1这些宽度都是自适应的 而且都是独占一行的也就是没有设置float这个属性 仅仅是设置了position:relative这个属性
col-md-xx col-lg-xx原理都是一样的 只是设置的分辨率不同
container与row中的margin padding
其中container的属性为(测试分辨率大于1200px)
.container {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
@media (min-width: 1200px) {
.container {
width: 1170px;
}
}
row的属性为
.row {
margin-right: -15px;
margin-left: -15px;
}
为什么这里要用负margin呢?我们来模拟下 不用负margin的情况
会发现row左右两边多出了15px的padding 这个是container设置的 那么为什么container要设置15px的padding呢 其是为了实现栅栏效果具体可以看这篇文章
注意啦,每个column 也会有15px的水平方向的 padding,也就是图片中黄色的部分,唉,先别急,会明白的。还记得上面提到的 row 的作用吗,colunmn 只能在 row 中生存,由于 row 的 margin 为-15px,那么位于两边的 column 就碰到了 container 的边界。但是 colunmn 本身又有 15px 的 padding 使得它其中的内容并不会碰到 container,同时 不同column的内容之间就有了30px的槽。结合图片看一下就一目了然了。