CSS的学习入门很容易,只要1年甚至半年的时候,咱们就能根据设计图迅速切出页面,能熟练使用些CSS hack,这个阶段咱们的成长很快,天天都能汲取新知识。这其实是CSS很是初级的阶段,也是广大页面仔们(包括我本人😳)最为浮躁,最自觉得是,最以为CSS不过如此的阶段。因此咱们要增长学习的深度,深刻掌握细节和原理,当咱们对CSS的底层表现有必定的理解与认识的时候,遇到一些看似奇怪的问题,能够轻松搞定~css
咱们在研究布局以前,首先须要了解几个很重要的概念和属性:html
文档流指的是元素排版布局过程当中,元素会自动从左往右,从上往下的流式排列。并最终窗体自上而下分红一行行,并在每行中从左至右的顺序排放元素。HTML中所有元素都是盒模型,盒模型占用必定的空间,依次排放在HTML中,造成了文档流。css3
float
、position:absolute|fixed
是脱离文档流的。脱离文档流是指,这个标签脱离了文档流的管理。不受文档流的布局约束了,而且更重要的一点是,当一个元素脱离文档流后,这个标签在原文档流中所占的空间也被清除掉了,依然在文档流中的其余元素将忽略该元素并填补其原先的空间。浏览器
<div>、<p>、<h1>...<h6>、<ol>、<ul>、<dl>、<table>、<address>、<blockquote> 、<form>
<span>、<a>、<strong>、<em>
是CSS中最重要的用于控制布局的属性,每一个元素都有一个默认的值,这与元素的类型有关。对于大多数元素它们的默认值一般是block
(块级元素)或inline
(行内元素)。app
display:none
和visibility
属性不同。display:none
的元素不会占据它原本应该显示的空间,可是设置成visibility: hidden;
还会占据空间。ide
若是两个相邻元素都在其上设置外边距,而且两个外边距接触,则两个外边距中的较大者保留,较小的一个消失布局
static:默认值。元素框正常生成。块级元素生成一个矩形框,做为文档流的一部分;行内元素则会建立一个或多个行框,置于其父元素中。学习
relative:元素框相对于以前正常文档流中的位置发生偏移,而且原先的位置仍然被占据。发生偏移的时候,可能会覆盖其余元素。flex
最初,设计浮动时,其实并非为了布局的,而是为了实现文字环绕的特效。相似于ps中的图层同样,浮动的元素会在浮动层上面进行排布,而在原先文档流中的元素位置,会被以某种方式进行删除,可是仍是会影响布局,因此要记得清除浮动。spa
浮动为何会被使用在布局中呢?由于设置浮动后的元素会造成BFC(使得内部的元素不会被外部所干扰),而且元素的宽度也再也不自适应父元素宽度,而是适应自身内容。这样就能够,轻松地实现多栏布局的效果。浮动一般用于建立多个列布局,而且因为它有良好的浏览器兼容性,已经被使用了至关一段时间。
弹性布局:用来为盒状模型提供最大的灵活性,采用 Flex 布局的元素,称为 Flex 容器(flex container)。它的全部子元素自动成为容器成员,称为 Flex 项目(flex item)。
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫作main start,结束位置叫作main end;交叉轴的开始位置叫作cross start,结束位置叫作cross end。
项目(flex item)默认沿主轴排列。单个item占据的主轴空间叫作main size,占据的交叉轴空间叫作cross size。
属性决定主轴的方向(即item的排列方向)
默认状况下,项目(item)都排在一条线(又称"轴线")上。flex-wrap属性定义,若是一条轴线排不下,如何换行。
flex-flow
属性是flex-direction
属性和flex-wrap
属性的简写形式,默认值为row nowrap
justify-content
属性定义了项目在主轴上的对齐方式。
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
复制代码
align-items
属性定义项目在交叉轴上如何对齐。
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}
复制代码
具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。
align-content
属性定义了多根轴线的对齐方式。若是项目只有一根轴线,该属性不起做用
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
复制代码
order
属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
flex-grow
属性定义项目的放大比例,默认为0,即若是存在剩余空间,也不放大 若是全部项目的flex-grow属性都为1,则它们将等分剩余空间(若是有的话)。若是一个项目的flex-grow属性为2,其余项目都为1,则前者占据的剩余空间将比其余项多一倍。
flex-shrink
属性定义了项目的缩小比例,默认为1,即若是空间不足,该项目将缩小。 若是全部项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。若是一个项目的flex-shrink属性为0,其余项目都为1,则空间不足时,前者不缩小。负值对该属性无效
flex-basis
属性用于设置或检索弹性盒伸缩基准值。定义了在分配多余空间以前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的原本大小。
它能够设为一个长度单位或者一个百分比,规定灵活项目的初始长度。
div:nth-of-type(2) {
flex-basis: 80px;
}
复制代码
flex
属性是flex-grow
, flex-shrink
和 flex-basis
的简写,默认值为0 1 auto
。后两个属性可选。 该属性有两个快捷值:auto
(1 1 auto
) 和 none
(0 0 auto
)。
建议优先使用这个属性,而不是单独写三个分离的属性,由于浏览器会推算相关值。
align-self
属性容许单个项目有与其余项目不同的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,若是没有父元素,则等同于stretch
。
该属性可能取6个值,除了auto,其余都与align-items属性彻底一致。
常见的这两种单列布局的特色都是定宽,水平居中的,设置width或max-width和margin:auto便可;
三列布局的特征是左右两侧固定宽度,中间列自适应宽度。
将两个侧边栏分别向左向右浮动,经过设置中间的主栏的margin为它们留出空间,造成三列布局
.left{
float: left;
width: 200px;
}
.right{
float: right;
width: 200px;
}
.main{
margin-left: 220px; /*预留出定宽两栏的空间*/
margin-right: 220px;
}
复制代码
只设置一个浮动便可获得两列布局
经过将两个侧边栏的position设置为absolute,而后将左边栏的left设置为0,右边栏的right设置为0,主栏设置margin为边栏留出空间,便可获得三列布局。
.left{
position: absolute;
left: 0;
width: 200px;
}
.right{
position: absolute;
right: 0;
width: 200px;
}
.main{
margin-left: 220px;
margin-right: 220px;
}
复制代码
一样,将定位元素改成一个能够获得两列布局。
<div class="container">
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
复制代码
.main{
float: left;
width: 100%;
}
.left{
float: left;
width: 200px;
margin-left: -100%;
position: relative;
left: -200px;
}
.right{
float: left;
width: 300px;
margin-left: -300px;
position: relative;
right: -300px;
}
.container {
padding: 0 300px 0 200px;
}
复制代码
二列的实现方法:
若是是左边带有侧栏的二列布局,则去掉right,不设置主面板的padding-right值。
双飞翼布局和圣杯布局的思想有些类似,都利用了浮动和负边距,但双飞翼布局在主栏外加了一层div并设置margin用来容纳侧栏,两侧栏的负边距都是相对于外层div而言,main的margin值变化便不会影响两个侧栏,这样就省略了将侧栏拉到主栏那一行后进行的relative定位(由于双飞翼布局留白就在父元素的内容区,而圣杯布局的留白在父元素内容区以外)。
<div class="wrapper">
<div class="main"></div>
</div>
<div class="left"></div>
<div class="right"></div>
复制代码
.wrapper {
float: left;
width: 100%;
}
.main {
margin: 0 300px 0 200px;
}
.left {
float: left;
width: 200px;
margin-left: -100%;
}
.right {
float: left;
width: 300px;
margin-left: -300px;
}
复制代码
二列的实现方法:
若是是左边带有侧栏的二栏布局,则去掉右侧栏,不要设置main-wrap的margin-right值,其余操做相同。反之亦然。
Flex 是 Flexible Box 的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性。除了在PC端兼容性较差,没有太大的缺陷,多用于移动端布局。
.layout {
display: flex;
}
.main {
flex: 1;
}
.aside {
width: 200px;
}
复制代码
这是你们很常见的居中方式,元素会占据你所指定的宽度,而后剩余的宽度会一分为二成为左右外边距。不过问题是,当浏览器窗口比元素的宽度还要窄时,浏览器会显示水平滚动条。
在这种状况下使用 max-width 替代 width 可使浏览器更好地处理小窗口的状况。这点在移动设备上显得尤其重要~
调整窗口大小看一下二者的区别吧 居中在布局中很常见,咱们假设DOM文档结构以下,子元素要在父元素中居中:
<div class="parent">
<div class="child"></div>
</div>
复制代码
垂直居中对于子元素是单行内联文本、多行内联文本以及块状元素采用的方案是不一样的。