CSS浮动
- 传统网页布局的三种方式:
标准文档流
,浮动
和定位
,在实际开发中,一个页面基本都包含了这三种布局方式; -
标准文档流
:标签元素按照规定好的方式进行排列,是最基本的布局方式;-
块级元素
按照从上往下顺序进行排列,会独占一行; -
行内元素
按照从左到右顺序进行排列,碰到父元素边缘就自动换行;
-
-
浮动
:是标签元素的一个属性用于创建浮动框,将标签移动到一边,直到左边缘或右边缘碰到父标签元素或另一个标签元素浮动框的边缘;- 浮动最典型的应用是可以
让多个块级元素在一行内排列显示
; -
多个块级元素纵向排列 找标准流
,多个块级元素横向排列 找浮动
;
- 浮动最典型的应用是可以
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.left,
.right {
font-size: 20px;
color: orangered;
font-weight: 700;
width: 200px;
height: 200px;
background-color: pink;
float: left;
}
.right {
float: right;
}
</style>
</head>
<body>
<div class="left">的方式带来了饭的饭</div>
<div class="right">都是废话开始的复合的方法地方</div>
</body>
</html>
浮动的特性
- 第一点:浮动元素会脱离标准流,俗称
脱标
;- 浮动脱标的盒子
不会再占用原先的位置
,其原先的位置会被其他标签占用;
- 浮动脱标的盒子
- 第二点:浮动的元素会在一行内进行显示并且顶部对齐;
- 若多个盒子都设置了浮动,则它们会按照属性值
一行内显示
并且顶端对齐
排列; - 浮动的元素是
相互贴靠在一起的(不会有缝隙)
,如果父级宽度装不下这些浮动的盒子,多出的盒子会另起一行对齐;
- 若多个盒子都设置了浮动,则它们会按照属性值
- 第三点:浮动的元素会具有行内块元素的特性;
-
任何元素都可以浮动
,不管原先是什么模式的元素,添加浮动之后具有行内块元素的特性
,就可以直接设置其高度和宽度
; - 若块级元素没有设置宽度,默认宽度与父级一样宽,但是添加浮动之后,其宽度为内容的宽度;
-
- 网页布局第一准则:
首先使用标准流,让父元素上下纵向排列,然后每一行的内部子元素利用浮动左右排列
;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
width: 1200px;
height: 400px;
background-color: pink;
margin: 0 auto;
}
.left {
width: 300px;
height: 400px;
background-color: red;
float: left;
text-align: center;
line-height: 400px;
}
.right {
width: 900px;
height: 400px;
background-color: green;
float: left;
text-align: center;
}
</style>
</head>
<body>
<div class="box">
<div class="left">左侧</div>
<div class="right">右侧</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style: none;
}
.box {
width: 1200px;
height: 300px;
background-color: pink;
margin: 0 auto;
}
.box li {
width: 292.5px;
height: 300px;
float: left;
margin-right: 10px;
background-color: green;
}
/* 注意权重的优先级 */
.box .last {
margin-right: 0;
}
</style>
</head>
<body>
<ul class="box">
<li>1</li>
<li>2</li>
<li>3</li>
<li class="last">4</li>
</ul>
</body>
</html>
- 浮动布局的注意点:
-
浮动
和标准流的父盒子
搭配使用; - 一个元素浮动了,理论上其余的兄弟元素也要浮动;
- 浮动的盒子
只会影响
浮动盒子后面的标准流
,不会
影响前面的标准流
;
-
清除浮动
- 由于父级盒子在很多情况下,
不方便设置高度,但是子盒子浮动又不占有位置,最后父级盒子高度为0,就会影响下面的标准流盒子
; - 由于浮动元素不再占用原文档流的位置,所以它会对后面的元素排版产生影响;
- 清除浮动的本质:就是
清除浮动元素造成的影响
,若父盒子本身有高度,则不需要清除浮动;- 清除浮动之后,
父级就会根据浮动的子盒子自动检测高度,父级有了高度
,就不会影响下面的标准流了; - 语法格式:
选择器 {clear: 属性值}
- 清除浮动之后,
-
清除浮动的方法有如下:
- 额外标签法:也称为隔墙法;
- 父级添加overflow属性;
- 父级添加after伪元素;
- 父级添加双伪元素;
-
额外标签法
:会在浮动元素末尾添加一个空的标签;- 优点:通俗易懂,书写方便;
- 缺点:添加许多无意义的标签,结构化较差,且要求新添加的标签必须是块级元素;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
width: 400px;
border-width: 2px;
border-color: green;
border-style: solid;
margin: 0 auto;
background-color: pink;
}
.one {
width: 100px;
height: 200px;
background-color: red;
float: left;
}
.two {
width: 100px;
height: 200px;
background-color: royalblue;
float: left;
}
.footer {
height: 300px;
background-color: black;
}
.clear {
clear: both;
}
</style>
</head>
<body>
<div class="box">
<div class="one">one</div>
<div class="two">two</div>
<div class="clear"></div>
</div>
<div class="footer"></div>
</body>
</html>
-
给父级添加overflow
:其属性值设置为hidden,auto,scroll;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
width: 400px;
border-width: 2px;
border-color: green;
border-style: solid;
margin: 0 auto;
background-color: pink;
/* 给父级添加overflow属性 可清除浮动 */
overflow: hidden;
}
.one {
width: 100px;
height: 200px;
background-color: red;
float: left;
}
.two {
width: 100px;
height: 200px;
background-color: royalblue;
float: left;
}
.footer {
height: 300px;
background-color: black;
}
</style>
</head>
<body>
<div class="box">
<div class="one">one</div>
<div class="two">two</div>
</div>
<div class="footer"></div>
</body>
</html>
-
父级添加after伪元素
:是额外标签法的升级版,也是给父级元素添加;- 优点:没有添加新标签,结构简单;
- 缺点:照顾低版本浏览器;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
*zoom: 1;
}
.box {
width: 400px;
border-width: 2px;
border-color: green;
border-style: solid;
margin: 0 auto;
background-color: pink;
}
.one {
width: 100px;
height: 200px;
background-color: red;
float: left;
}
.two {
width: 100px;
height: 200px;
background-color: royalblue;
float: left;
}
.footer {
height: 300px;
background-color: black;
}
</style>
</head>
<body>
<div class="box clearfix">
<div class="one">one</div>
<div class="two">two</div>
</div>
<div class="footer"></div>
</body>
</html>
-
父级添加双伪元素
:也是给父元素添加;- 优点:代码简洁;
- 缺点:照顾低版本浏览器;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.clearfix:before,
.clearfix:after {
content: "";
display: block;
}
.clearfix:after {
clear: both;
}
.clearfix {
*zoom: 1;
}
.box {
width: 400px;
border-width: 2px;
border-color: green;
border-style: solid;
margin: 0 auto;
background-color: pink;
}
.one {
width: 100px;
height: 200px;
background-color: red;
float: left;
}
.two {
width: 100px;
height: 200px;
background-color: royalblue;
float: left;
}
.footer {
height: 300px;
background-color: black;
}
</style>
</head>
<body>
<div class="box clearfix">
<div class="one">one</div>
<div class="two">two</div>
</div>
<div class="footer"></div>
</body>
</html>
- CSS清除浮动的总结:
定位
- 定位:将盒子定在某个位置,所以定位也是在摆盒子,按照定位的方式移动盒子;
-
定位 = 定位模式 + 边偏移
; -
position
:指定一个元素在文档中定位方式,其值有如下;
-
边偏移
:决定目标元素的最终位置,有如下四个属性:
静态定位static
-
静态定位
:元素默认的定位方式,即无定位; - 静态定位按照标准流的特性摆放位置,它没有偏移;
- 静态定位在布局时很少使用;
相对定位relative
-
相对定位
:元素在定位时,以元素在标准流中的原来位置
为基准; - 定位元素
在标准流的原来位置会继续占有
,后面的盒子仍然以标准流的方式对待它,不脱标,继续占用原来的位置
;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>定位布局Position</title>
<style>
div {
width: 200px;
height: 100px;
}
.one {
background-color: blueviolet;
}
.two {
position: relative;
top: 50px;
left: 50px;
background-color: pink;
}
.three {
background-color: red;
}
</style>
</head>
<body>
<div class="one">one</div>
<div class="two">two</div>
<div class="three">three</div>
</body>
</html>
- 可以看到two设置相对定位时,以它在标准流中原来的位置为基准,进行位置偏移;
- two设置相对定位,并没有脱离标准流,依然占据原来的位置,three排列在two原来标准流位置的下方;
绝对定位absolute
-
绝对定位
:元素在定位时,以其祖先元素为基准; - 如果
没有祖先元素或者祖先元素没有定位
,则以浏览器为基准
进行定位; - 如果
祖先元素有定位
(相对,绝对,固定),则以最近一级的有定位的的祖先元素
为基准; -
绝对定位不再占有原先的位置
(脱标);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>定位布局Position</title>
<style>
div {
width: 200px;
height: 100px;
}
.one {
background-color: blueviolet;
}
.two {
position: absolute;
top: 50px;
left: 50px;
background-color: pink;
}
.three {
background-color: red;
}
</style>
</head>
<body>
<div class="one">one</div>
<div class="two">two</div>
<div class="three">three</div>
</body>
</html>
- two的祖先元素没有定位,最终以浏览器为基准进行偏移;
- two设置绝对定位后,脱标,不会再占据标准流中的原来位置;
- three在排列时,会忽略two在标准流中的原来位置,直接排在one的下方;
固定定位fixed
-
固定定位
:元素固定在浏览器可视区域的位置,可以在浏览器页面滚动时元素的位置不会发生改变; - 以浏览器的可视窗口为参照点移动元素;
- 与根父元素没有任何关系;
- 不会随着浏览器页面滚动而滚动;
- 固定定位不会占用原先的位置,也是脱标的,其可看成是一种特殊的绝对定位;
- 如何让固定定位的盒子固定在版心右侧的位置:
- 让固定定位的盒子的left: 50% 占浏览器的一半的位置;
- 让固定定位的盒子的margin-left: 版心宽度的一半;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.w {
width: 800px;
height: 1400px;
background-color: pink;
margin: 0 auto;
}
.fixed {
position: fixed;
/* 走浏览器宽度的一半 */
left: 50%;
margin-left: 405px;
width: 50px;
height: 150px;
background-color: red;
}
</style>
</head>
<body>
<div class="fixed"></div>
<div class="w"></div>
</body>
</html>
粘性定位sticky
-
粘性定位
:可视为是相对定位于固定定位的混合; - 以浏览器的可视窗口为参照点移动元素(固定定位的特点);
- 占有原先的位置(相对定位的特点);
- 必须添加top,left,right,bottom其中一个才会有效;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
height: 3000px;
}
.nav {
position: sticky;
top: 0;
width: 800px;
height: 50px;
background-color: pink;
margin: 100px auto;
}
</style>
</head>
<body>
<div class="nav">我的导航栏</div>
</body>
</html>
-
z-index
:使用定位布局时,可能会出现盒子重叠的情况,此时可使用z-index
来控制盒子的前后次序(Z轴);- 语法格式:
选择器 {z-index: 1}
; - 数值可以是正整数,负整数或0,默认是auto,数值越大,盒子越靠上;
- 如果属性值相同,则按照书写顺序,后来居上;
- 数字后面加单位;
- 只有定位的盒子才有z-index属性;
- 语法格式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
position: absolute;
top: 0;
width: 200px;
height: 200px;
}
.one {
background-color: pink;
z-index: 1;
}
.two {
background-color: green;
z-index: 2;
}
.three {
background-color: hotpink;
z-index: 3;
}
</style>
</head>
<body>
<div class="box one">熊大</div>
<div class="box two">熊二</div>
<div class="box three">光头强</div>
</body>
</html>
子绝父相
-
子绝父相
:子元素是绝对定位时,父元素要用相对定位;- 子元素绝对定位,不会占有位置,可以放到父盒子里面的任何一个位置,不会影响到其他兄弟盒子;
- 子盒子的运动范围必须在父盒子内部,因此父盒子需要加定位,
因为子盒子的定位基准是有定位的祖先元素
; - 父盒子布局时,需要占有位置,因此父盒子只能是相对定位;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
li {
list-style: none;
}
.pic {
height: 150px;
background-color: red;
}
.icon {
position: absolute;
right: -10px;
top: 10px;
width: 20px;
height: 20px;
background-color: slateblue;
}
ul li {
position: relative;
width: 228px;
height: 270px;
background-color: pink;
}
</style>
</head>
<body>
<ul class="clearfix">
<li>
<div class="icon"></div>
<div class="pic"></div>
<h4> ThinkPad 地方喝酒房贷首付款打发时computer game</h4>
<div class="info"> <span>高级</span> 人才 1000左右</div>
</li>
</ul>
</body>
</html>
绝对定位元素居中
- 绝对定位的盒子居中:加了绝对定位的盒子不能通过
margin:0 auto
进行水平居中,可通过下列计算实现水平和垂直居中:-
left: 50%
:让盒子左侧移动到父级元素的水平中心位置; -
margin-left: -100px
:让盒子向左移动自身宽度的一半;
-
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
position: absolute;
left: 50%;
top: 50%;
margin-left: -100px;
margin-top: -100px;
width: 200px;
height: 200px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
定位元素的特性
-
行内元素
加绝对定位或者固定定位
,可以直接设置高度和宽度
; -
块级元素
添加绝对定位或者固定定位
,如果不给宽度或者高度,默认大小是内容的大小
; - 脱标的盒子不会触发外边距塌陷;
- 浮动元素不同,只会压住它下面标准流的盒子,但是不会压住下面标准流盒子里面的文字(图片),但
绝对定位(固定定位)会完全压住盒子
,主要是因为浮动最初是为了文字环绕的效果,所以文字会围绕着浮动元素;
淘宝焦点图
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style: none;
}
.box {
position: relative;
width: 400px;
height: 300px;
background-color: pink;
margin: 100px auto;
}
.prev {
position: absolute;
left: 0;
top: 50%;
margin-top: -15px;
width: 30px;
height: 30px;
background-color: rgba(0, 0, 0, 0.3);
}
.next {
position: absolute;
right: 0;
top: 50%;
margin-top: -15px;
width: 30px;
height: 30px;
background-color: rgba(0, 0, 0, 0.3);
}
.bottom-nav {
position: absolute;
left: 50%;
margin-left: -45px;
bottom: 15px;
background-color: red;
width: 90px;
height: 20px;
}
.bottom-nav li {
float: left;
width: 8px;
height: 8px;
background-color: #fff;
border-radius: 50%;
margin: 7px;
}
.bottom-nav .selected {
background-color: chocolate;
}
</style>
</head>
<body>
<div class="box">
<div class="pic"></div>
<div class="prev"></div>
<div class="next"></div>
<ul class="bottom-nav">
<li class="selected"></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
</body>
</html>
- 网页布局总结:
- 一个完整的网页,是标准流,浮动和定位一起完成的布局;
- 标准流可以让盒子上下排列或者左右排列,垂直的块级盒子显示就用标准流;
- 浮动可以让多个块级元素一行显示或者左右对齐盒子,多个块级盒子水平显示就用浮动布局;
- 定位其最大的特点是有层叠的概念,就是可以让多个盒子前后压叠来显示,如果元素自由在某个盒子内移动就用定位布局;