CSS之浮动
网页布局的本质是用CSS来摆放盒子,把盒子摆到相应位置
CSS提供三种布局方式,就是盒子如何进行排列顺序:
1.** 标准流(普通流或文档流)**,就是标签按照规定好的默认的方式排列,
1.块级元素会默认独占一行,从上到下顺序排列,常用:div hr p h1到h6 ul ol dl form table
2.行内元素默认会按顺序,从左到右排列,碰到父元素边缘自动换行,例如:span a i em
2. 浮动
3. 定位
一个完整的网页,基本包含了这三种布局方式
若想将多个块级元素横向排列时:
若将块级元素转换为行内块元素,虽然可以实现横向排列,但行内块元素横向排列时,元素之间是会有空白空隙。其大小不好控制。而且有时盒子间还没有空袭
网页布局原则:多个块级元素纵向排列找标准流,多个块级元素横向排列找浮动,
1. 浮动(float)属性
float属性用于创建浮动框,将其移动到一边,直到左边缘或右边缘或另一个浮动框的边缘
语法:
选择器 {
float: ; 属性值:left right
}
<style>
.left,.right{
width:200px;
height:200px;
background-color:pink;
float:left;
}
</style>
</head>
<body>
<div class="left">盒子1</div>
<div class=" right">盒子2</div>
两个盒子的边缘紧贴在一起
2. 浮动特性
加了浮动之后的元素,会有以下 浮动特性
1.浮动元素会脱离标准流(脱标)
- 脱离标准流的控制移动到指定位置,浮动的盒子不再保留原先的位置
会出现:若盒子1设为浮动的,盒子2还是标准流,可能会出现盒子2占据盒子1的位置,或者盒子间的叠加效果
<style>
.left{
width:200px;
height:200px;
background-color:pink;
float:left;
}
.right{
width:200px;
height:400px;
background-color: blue ;
}
</style>
</head>
<body>
<div class="left">盒子1</div>
<div class=" right">盒子2</div>
2.若多个盒子都设置了浮动,则他们会按照属性值一行内显示并且顶端对齐排列
浮动的盒子是相互贴靠在一起的,若父级宽度装不下这些浮动的盒子,多出的盒子会另起一行对齐
3.浮动元素会具有行内块元素的特性
任何元素都可以浮动,不管原先是何模式的元素,添加浮动后,就具有行内块元素相似的特性:可设高和宽,一行显示多个 ,宽度默认是盒子内容的宽度
所以,行内元素有了浮动,不需要转换块级或行内块元素就直接设置高和宽
块级元素默认宽度和父级一样宽
浮动的元素经常和标准流父级搭配使用
为了约束元素的位置,网页布局时:
先用标准流的父元素排列上下位置,之后内部的子元素采取浮动排列左右位置,
就是大的标准流盒子里放许多浮动子盒子
<style>
/*在一个大的标准流盒子里放许多浮动子盒子,而ul li都是块级元素,ul就是大的盒子*/
* {/*去除网页标签中的所有默认的内外边距*/
margin:0;
padding:0;
}
li {/*去除li前面的小黑点*/
list-style:none;
}
.box {
width:1030px;
height:250px;
background-color:pink;
margin: 0 auto;
}
.box li{/*权重0010+0001=0011*/
width: 250px;
height:250px;
background-color: #3CF;
float:left;
margin-right:10px;
}
/*.one {
margin-right:0;
/*没有执行此设置,是因为权重的问题 0010*/
.box .one {
margin-right:0;
}
</style>
</head>
<body>
<ul class="box">
<li>1</li>
<li>2</li>
<li>3</li>
<li class="one">4</li>
</ul>
</body>
</html>
常见的网页布局
<title>网页布局</title>
<style>
* {/*网页布局第一步*/
margin:0;
padding:0;
}
.top{/*默认宽度与父元素浏览器同宽*/
height:50px;
background-color:gray;
}
.banner{
width:978px;
height:150px;
background-color:gray;
margin: 10px auto;/*盒子水平居中*/
}
.box {/*父盒子放许多小盒子*/
width:978px;
height:300px;
background-color:gray;
margin: 0 auto;/*盒子水平居中*/
}
li {/*去掉无序列表项默认的小黑点*/
list-style:none;
}
.box li{
width:237px;
height:300px;
background-color: pink;
float:left;/*小盒子水平显示*/
margin-right:10px;
}
.box .last{/*最右边的小盒子不需要右外边距*/
margin-right: 0px;
}
/*只要是通栏的盒子,就是和浏览器一样宽,不需要指定宽度*/
.footer{
height:200px;
background-color: red;
margin-top:10px;
}
</style>
</head>
<body>
<div class="top"></div>
<div class=" banner"></div>
<div class="box">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li class="last">4</li>
</ul>
</div>
<div class="footer"></div>
</body>
注意点:浮动的盒子只会影响盒子后面的标准流,不会影响前面的标准流
例如1:
盒子1是标准流,盒子2是浮动的且左浮动,盒子3是标准流
排列顺序:盒子1独占一行,盒子2浮动起来左对齐,盒子3跑到盒子2的位置
2. 清除浮动
1. 引入:
- 思考: 前面浮动元素有一个标准流的父元素,他们有一个共同的特点,就都是有高度的,那么父盒子必须有高度吗?当一个盒子中所包含的小盒子个数很多时,或者不知道要包含多少文字时,父盒子再有高度就不太方便
- 为什么要消除浮动?
父级盒子多数情况下不太方便给出高度,但是子盒子浮动又不占有位置,最后父级盒子高度是0,就会影响标准流盒子(就是标准流盒子会占据父级盒子的位置,然后父级的子盒子又浮动,会出现内容的叠加等情况),浮动元素不再占用原文档流的位置,所以它会对后面元素的排版产生影响 - 清除浮动的本质清除浮动元素造成的影响:
清除浮动后,父级就会根据浮动的子盒子自动检测高度,父级有了高度,就不会影响下面的标准流了 - 清除浮动的策略是闭合浮动,只让浮动在父盒子内部影响,不影响父盒子外面的其他盒子
2. 语法:
选择器 {clear: 属性值;}
属性值 可以取:
- left 不允许左侧有浮动元素(清除左侧浮动的影响)
- right 不允许右侧有浮动元素(清除右侧浮动的影响)
- both 同时清除左右侧浮动的影响(最常用)
3. 清除浮动的方法
- 额外标签法又称隔墙法 (了解)
就是在浮动元素末尾添加一个空的块级元素标签
补充:清除浮动:
clear: left 清除左边的浮动对象,如果左边有浮动对象,则当前元素会在浮动对象的底下显示
clear: right 清除右边的浮动对象,如果右边有浮动对象,则当前元素会在浮动对象的底下显示
clear:both 清除左右边的浮动对象,如果左右边有浮动对象,则当前元素会在浮动对象的底下显示
实现三栏居中(用到子绝父相)和浮动一样,也可以用到网页布局,只不过浮动是利用外边距实现盒子之间的空袭,多数是用浮动来实现盒子的横向排列
- 把三栏放在父容器中
- 父容器实现居中
- 三栏相对父容器绝对定位
<style>
body{
text-align: center;
}
.father{
width: 800px;
height: auto;
position: relative;
margin:0 auto;
}
/* height: auto; 是自适应高度 */
.left{
width: 200px;
height: 200px;
background-color: turquoise;
position: absolute;
top:20px;
left:20px;
}
.main{
width: 400px;
height: 200px;
background-color: violet;
position: absolute;
top:20px;
left:240px;
}
.right{
width: 200px;
height: 200px;
background-color: yellow;
position: absolute;
top:20px;
left:660px;
}
</style>
</head>
<body>
<div class="father">
<div class="left"></div>
<div class="main"></div>
<div class="right"></div>
</div>
</body>