1.浮动(float)
1.1 属性值
- none:不浮动
- left:左浮动
- right:右浮动
- inherit:继承父元素浮动属性
1.2 用法
<div class="box">
<div class="left"></div>
<div class="right"></div>
</div>
.box {
width: 600px;
height: 300px;
background-color: #eee;
}
.left {
float: left;
width: 200px;
height: 200px;
background-color: blue;
}
.right {
float: right;
width: 200px;
height: 200px;
background-color: yellow;
}
1.3 特点
- 浮动会使元素脱离文档流,不在占据文档流中的位置
- 浮动的元素之间没有间隙,但是不会重叠
- 浮动的元素可以与文字图片等产生类似于word文档”环绕“,”嵌入“等效果
1.4 清除浮动方法
浮动虽然使用起来非常方便,但是却会带来一些问题,比如浮动使得子元素脱离文档流,父元素的高度无法被撑开,浮动元素与非浮动元素重叠等,所以在使用浮动后我们需要清除浮动造成的影响,这里列出四种:
-
父元素设置固定高度
只要父元素设定了高度,子元素就不会再影响父元素了,但是基本只能适用于页面完全固定的情况,现在很多时候都需要响应式的布局即元素的属性值需要动态变化,也就是不能写死高度值。
-
空div法
在浮动元素的后面加一个空的块级元素div,并设置属性
clear: both,这个属性可以简单理解为将前后元素的浮动清除了,实际上是通过触发BFC(块级格式化上下文)来达到清除浮动的效果的,当然这种方法也不是非常好,空div会使得html结构非常冗余。<div class="box"> <div class="left"></div> <div class="empty"></div> </div>.box { width: 600px; border: 1px solid black; } .left { float: left; width: 200px; height: 200px; background-color: blue; } .empty { clear: both; }
-
伪元素清除(最常用)
相当于是空div法的改进,不再通过html中添加div设置clear属性来清除浮动,而是利用伪元素after来实现,这样html就不会产生冗余,只需要对浮动的父元素设置一个属性就行了
<div class="box clearfix"> <div class="left"></div> </div>.box { width: 600px; border: 1px solid black; } .left { float: left; width: 200px; height: 200px; background-color: blue; } .clearfix:after { content:''; display: block; clear: both; height: 0; }
-
overflow属性清除
通过对浮动的父元素添加
overflow:hidden|auto|scroll属性来清除子元素的浮动,实际上原理还是触发BFC<div class="box"> <div class="left"></div> </div>.box { width: 600px; border: 1px solid black; overflow: hidden; } .left { float: left; width: 200px; height: 200px; background-color: blue; }
1.5 块级格式化上下文(BFC)
简单来说,BFC就是一个规则,只要满足其触发的条件,就可以使得子元素与其外部完全隔离,内外互相都无法再产生影响,所以清除浮动的方法大部分都与BFC有关,触发BFC的常见方式如下:
- 根元素(即
<html>元素)会自动触发一个 BFC - 使用 CSS 属性
overflow的值为除 "visible" 以外的其他值(例如 "auto"、"hidden"、"scroll") - 使用 CSS 属性
position的值为 "absolute" 或 "fixed" - 使用 CSS 属性
display的值为 "inline-block"、"flex"、"grid" 之类的块级盒子
2.定位(position)
2.1 属性值
- static: 静态定位(默认值)
- relative:相对定位,不脱离文档流,相对于当前的位置定位
- absolute:绝对定位,脱离文档流,相对于最近的非static祖先元素定位
- fixed:固定定位,脱离文档流,相对于浏览器视口定位,常用于网页小广告
2.2 控制属性
- top:相对于定位的元素顶部距离
- bottom:相对于定位的元素底部距离
- left:相对于定位的元素左侧距离
- right:相对于定位的元素右侧距离
- index:显示层级,数值越大显示越在上面
2.3 用法
<div class="box">
<div class="item-top"></div>
<div class="item-bottom"></div>
</div>
.box {
position: relative;
width: 600px;
height: 400px;
background-color: #eee;
}
.item-top {
position: absolute;
top: 100px;
left: 100px;
z-index: 1;
width: 200px;
height: 200px;
background-color: blue;
}
.item-bottom {
position: absolute;
top: 100px;
left: 100px;
z-index: 10;
width: 100px;
height: 400px;
background-color: yellow;
}
2.4 简单记法
“子绝父相”,父元素设置position: relative,子元素设置position: absolute,非常常用
3.弹性布局(flex)
3.1 属性
- display: flex 块级元素设置flex
- display: inline-flex 杭集元素设置flex
3.2 控制属性
- flex-direction 决定主轴方向
- flex-wrap 定义如果一条轴线排不下,如何换行
- flex-flow 前两个的简写
- justify-content 定义项目在主轴上的对齐方式
- align-items 定义项目在交叉轴上如何对齐
- align-content 定义多根轴线的对齐方式,如果只有一根轴线,不起作用
详细属性值如下:
// 主轴排列方向
@flex-direction: row | row-reverse | column | column-reverse;
// 容器内项目是否可换行
@flex-wrap: nowrap | wrap | wrap-reverse;
// 上面两种属性的简写
@flex-flow: <flex-direction> || <flex-wrap>;
// 主轴对齐方式
@justify-content: flex-start | flex-end | center | space-between | space-around;
// 副轴对齐方式
@align-items: stretch | flex-start | flex-end | center | baseline;
// 副轴多根轴线的对齐方式
align-content: stretch | flex-start | flex-end | center | space-between | space-around;
// 单个元素对齐方式
align-self: stretch | start | end | center;
// 项目在容器中的排列顺序,数值越小,排列越靠前,默认值为0
order: <integer>;
// 项目占据的主轴空间,主轴为row时,相当于优先级更高的width
flex-basis: auto | <length>;
// 项目的放大比例
flex-grow: <number>;
// 项目的缩小比例
flex-shrink: <number>;
// 上面三种属性的简写
@flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
3.3 理解
flex的容器有两条轴线,一条主轴,一条副轴,两条轴互相交叉,所以副轴又成为交叉轴,主轴不一定是横向的,这取决于flex-direction属性,如果属性值为column,那么主轴就是纵向的,副轴就是横向的,然后是对齐方式,总共有四个对齐,justify-content设置子元素在主轴的对齐方式,align-items设置子元素在副轴的对齐方式,align-content设置多条副轴时副轴的对齐方式,align-self对单个子元素设置各自的对齐方式,注意,前三种属性是设置在父元素上的,最后一种设置在子元素上,并且flex布局中不存在justify-items,因为flex永远只有一条主轴,当设置换行属性flex-wrap后就有可能有多条副轴。
3.4 用法
<ul>
<li></li>
<li></li>
<li></li>
</ul>
// 三点
ul {
width: 400px;
height: 400px;
background-color: yellowgreen;
display: flex;
justify-content: space-around;
}
li {
width: 100px;
height: 100px;
background-color: pink;
}
ul>li:nth-child(1) {
align-self: flex-start;
}
ul>li:nth-child(2) {
align-self: center;
}
ul>li:nth-child(3) {
align-self: flex-end;
}
4.网格布局(grid)
4.1 属性
- display: grid 块级元素设置grid
- display: inline-grid 杭集元素设置grid
4.2 控制属性
- grid-template-columns: 200px 100px 200px 声明了三列,宽度分别为 200px 100px 200px
- grid-template-rows: 50px 50px 声明了两行,行高分别为 50px 50px
- grid-row-gap: 5px 网格行间距
- grid-column-gap: 5px 网格列间距
- grid-gap: 5px 网格间距
- grid-template-areas:". one one" "two two three" 定义区域
- grid-area: one 标识区域
- justify-items:center 单元格内容水平居中
- align-items:center 单元格内容垂直居中
- justify-content:center 整个内容区域在容器里水平居中
- align-content:center 整个内容区域在容器里垂直居中
4.3 用法
<div class="box">
<div class="one item">one</div>
<div class="two item">two</div>
<div class="three item">three</div>
</div>
.box {
width: 350px;
display: grid;
grid-gap: 10px;
grid-template-columns: 100px 100px 100px;
grid-template-areas:
". one one"
"two two three";
background-color: #eee;
justify-content: center;
color: #fff;
}
.item {
height: 80px;
text-align: center;
}
.one {
grid-area: one;
background-color: pink;
}
.two {
grid-area: two;
background-color: blue;
}
.three {
grid-area: three;
background-color: yellowgreen;
}
5.总结
现在最常用的还是flex布局,能够支持响应式,浏览器兼容性较好,float布局在能正确避开浮动问题的情况下也是非常好用的,position布局语法非常简单,对于存在指定的偏移量时非常好用,grid布局在面对非常复杂的布局时相较于一维的flex布局好用的多,但是其浏览器兼容性与flex相比还不是很好,总的来说,这些布局方式各有各的特点,都有最适合使用的场合,还是都需要掌握的。