浮动属性是专门用于进行网页并排布局的
作用:脱离标准文档流,不再受元素等级的限制,又可以并排显示,又可以设置宽和高
float:属性就是设置元素浮动
属性值:left、right
float: left;
float: right;
浮动的特性:元素会按照书写的顺序进行依次贴边,同一个父盒子中,即可以设置左浮动,也可以设置右浮动
<div>
<p class="left">1p>
<p class="right">2p>
<p class="left">3p>
<p class="right">4p>
<p class="left">5p>
<p class="right">6p>
<p class="left">7p>
<p class="right">8p>
<p class="left">9p>
<p class="right">10p>
div>
补充知识点:所有的兄弟元素,如果一个有浮动了,剩下的所有兄弟元素必须都设置浮动
如果浮动元素不设置宽度,不会撑满父盒子,而被内容撑宽
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
*{
margin: 0;
padding: 0;
}
.inner{
width: 970px;
margin: 0 auto;
}
.inner .top{
height: 103px;
margin-bottom: 10px;
}
.inner .top .logo {
width: 277px;
height: 103px;
float: left;
background-color: red;
}
.inner .top .nav{
width: 679px;
height: 103px;
float: right;
}
.inner .top .nav .news {
width: 137px;
height: 49px;
background: greenyellow;
margin-bottom: 8px;
float:right;
}
.inner .top .nav .nav_li{
height: 46px;
background: #000;
background: greenyellow;
float: right;
width: 100%;
}
.inner .middle{
height: 435px;
margin-bottom: 10px;
}
.inner .middle .left {
width: 310px;
height: 435px;
background-color: orange;
float: left;
}
.inner .middle .right{
width: 650px;
height: 435px;
float: right;
}
.inner .middle .right .r_top{
height: 401px;
margin-bottom: 10px;
}
.inner .middle .right .r_top .r_top_left{
width: 450px;
height: 401px;
float: left;
}
.inner .middle .right .r_top .r_top_left .s_top{
height: 240px;
background: blue;
margin-bottom: 10px;
}
.inner .middle .right .r_top .r_top_left .s_center{
height: 110px;
background: blue;
margin-bottom: 10px;
}
.inner .middle .right .r_top .r_top_left .s_bottom{
height:30px;
background: blue;
}
.inner .middle .right .r_top .r_top_right{
width: 190px;
height:401px;
background: purple;
float: right;
}
.inner .middle .right .r_bottom{
height: 25px;
background: green;
}
.inner .bottom {
height: 35px;
background: navy;
}
style>
head>
<body>
<div class="inner">
<div class="top">
<div class="logo">div>
<div class="nav">
<div class="news">div>
<div class="nav_li">div>
div>
div>
<div class="middle">
<div class="left">div>
<div class="right">
<div class="r_top">
<div class="r_top_left">
<div class="s_top">div>
<div class="s_center">div>
<div class="s_bottom">div>
div>
<div class="r_top_right">div>
div>
<div class="r_bottom">div>
div>
div>
<div class="bottom">
div>
div>
body>
html>
标准流元素是区分行、块
我们知道了浮动元素是脱离标准流的,那么脱离标准流后,浮动元素有哪些特性?
答:浮动元素,脱离标准流后,既可以设置宽度和高度,也可以实现并排显示,不区分元素状态,也就是不区分行内元素和块级元素
div p {
width: 100px;
height: 100px;
background: purple;
}
div span {
width: 100px;
height: 100px;
background: orange
}
p标签和span标签都设置了宽度和高度,但是由于元素类型的限制,span标签没有宽度和高度
div内部元素浮动之后
div p {
width: 100px;
height: 100px;
background: purple;
float: left;
}
div span {
width: 100px;
height: 100px;
background: orange;
float: left;
}
需要注意的是,兄弟元素如果有一个浮动了,剩下必须都要浮动
如果此时p标签和span标签都没有设置宽度和高度,元素的宽度会被内容撑宽,不会自动撑满父盒子
div p {
background: purple;
float: left;
}
div span {
background: orange;
float: left;
}
如果父盒子的宽度不足以存下所有的子盒子,存放不下的会自动向前寻找,知道空余位置能够存放,从而进行贴边显示
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
*{
margin: 0;
padding: 0;
}
div {
width: 400px;
height: 400px;
border: 5px solid red;
margin: 100px auto
}
div p{
width: 100px;
height: 100px;
float: left;
}
div p.par1{
height: 250px;
background: green;
}
div p.par2{
height: 200px;
background: blue;
}
div p.par3{
background: yellow;
}
div p.par4{
width: 300px;
background: cyan;
}
style>
head>
<body>
<div>
<p class="par1">1p>
<p class="par2">2p>
<p class="par3">3p>
<p class="par4">4p>
div>
body>
如果父盒子的跨度不够,子盒子会依次贴边,但是如果前面元素中有空隙当前需要贴边的元素不会钻空,不会出现钻空的现象,而之会查询剩余宽度实现依次贴边
div {
width: 600px;
height: 400px;
border: 5px solid red;
margin: 100px auto
}
div p{
width: 100px;
height: 100px;
float: left;
}
div p.par1{
height: 250px;
background: green;
}
div p.par2{
width: 330px;
background: blue;
}
div p.par3{
height: 200px;
background: yellow;
}
div p.par4{
width: 400px;
background: cyan;
}
如果某一个子盒子的宽度大于了父盒子,会有溢出状态
div {
width: 600px;
height: 400px;
border: 5px solid red;
margin: 100px auto
}
div p{
width: 100px;
height: 100px;
float: left;
}
div p.par1{
height: 250px;
background: green;
}
div p.par2{
width: 330px;
background: blue;
}
div p.par3{
height: 200px;
background: yellow;
}
div p.par4{
width: 650px;
background: cyan;
向右贴边的原理和向左相同,也是按照先后顺序进行贴边
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
*{
margin: 0;
padding: 0;
}
.outer {
height: 440px;
width: 940px;
padding: 10px;
border: 2px solid #000;
margin: 10px auto
}
.outer div {
float: left;
}
.outer .box1{
width: 300px;
height: 260px;
background: pink;
}
.outer .box2 {
width: 240px;
height: 260px;
background:cyan;
}
.outer .s_box{
width: 200px;
height: 130px;
}
.outer .box3 {
background: yellowgreen;
}
.outer .box4 {
background: greenyellow;
}
.outer .box7{
width: 300px;
height: 180px;
background: blueviolet;
}
.outer .s_box2 {
width: 160px;
height: 180px;
}
.outer .box5 {
background: purple;
}
.outer .box6 {
background: palegreen;
}
style>
head>
<body>
<div class="outer">
<div class="box1">div>
<div class="box2">div>
<div class="s_box box3">div>
<div class="s_box box4">div>
<div class="s_box box4">div>
<div class="s_box box3">div>
<div class="box7">div>
<div class="s_box2 box5">div>
<div class="s_box2 box6">div>
<div class="s_box2 box5">div>
<div class="s_box2 box6">div>
div>
body>
html>
标准流有margin塌陷的现象
在垂直方向上,如果有相遇的margin,两个盒子之间不是属性值的和,而是比较两个盒子谁的margin更大,使用的就是margin值更大的高度
同级盒子margin塌陷
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
*{
margin: 0;
padding: 0;
}
div{
width: 200px;
height: 200px;
margin: 50px;
background: blue
}
.bottom{
margin-top: 100px;
}
style>
head>
<body>
<div>div>
<div class="bottom">div>
body>
父子盒子,如果子盒子设置margin-top,父盒子没有设置或者margin-top的值小于了子盒子,此时会存在margin塌陷的现象
如何解决margin塌陷的现象,如果是兄弟关系,统一都设置一个方向的margin,比如都设置margin-bottom
如果是父子盒子,可以给父盒子加border或者padding,其实这两种方法都不合理,正常情况下都不会使用子盒子去向上踹父盒子,而是使用父盒子加padding
总结:浮动元素没有了标准流的margin塌陷现象,各自有各自的margin,不会相互塌陷;
标准流中的元素都有自己的一个标准流位置,后面的元素只能在前面元素的后面进行加载。
浮动元素脱离了标准流,它会让后面的元素占有自己原来的位置,显示效果上来看仿佛是自己“飘”起来了,我们称之为脱标了
标准流显示
此时粉色盒子浮动了
字围现象:同级元素中,前面元素如果浮动了,后面的标准流会占有前面元素的文字,后面盒子中如果有文字,不会和盒子一样占有前面盒子的位置,而是绕开浮动元素的位置,围绕着加载,实现字围现象。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
*{
margin: 0;
padding: 0;
}
.outer{
width: 300px;
height: 300px;
margin: 100px auto;
}
.par{
width: 100px;
height: 100px;
background: pink;
float: left;
}
.box{
width: 200px;
height: 200px;
background: cyan;
}
style>
head>
<body>
<div class="outer">
<p class="par">p>
<div class="box">
111文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
div>
div>
body>
我们可以利用字围实现网页中明显简介的案例
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
*{
margin: 0;
padding: 0;
}
div{
width: 300px;
padding: 10px;
border: 1px solid red;
margin: 30px auto;
}
div img{
width: 100px;
float: right;
margin: 8px;
}
style>
head>
<body>
<div>
<img src="images/sxb.jpg" alt="">
<p>
宋小宝,本名宋宝利,1981年1月5日出生,吉林省通化市辉南县楼街乡光明村人 [1] ,中国内地男演员,喜剧表演艺术家赵本山先生的第32位徒弟。
p>
<p>
2009年,因参加综艺节目《本山快乐营》小有名气。2011年,因参演辽宁卫视春节晚会与师父赵本山合作小品《相亲》而获得更多关注。2012年8月,凭借电视剧《樱桃》参加第四届新农村电视艺术节获最佳男主角 [2] 。同年12月10日,凭借电视剧《樱桃》参加第八届华鼎奖获当代类最佳男演员。2013年10月,第十届华鼎奖获最受中国媒体欢迎的演员。2014年8月,凭借电视剧《樱桃红》参加第十三届华鼎奖获中国当代题材电视剧最佳男演员奖 [3] 。2015年参加中国首档明星喜剧竞赛真人秀《欢乐喜剧人第一季》 [4] 。同年11月5日,参加《咱们穿越吧》庆功会。同年12月9日,献唱电影《唐人街探案》推广曲《往事只能回味》。2016年12月13日,献唱电影《东北往事之破马张飞》主题曲《全世界都在说东北话》。
p>
div>
body>
html>
标准流的盒子,如果不设置高度,会被内容自动撑高。
如果盒子内部的元素浮动了,子盒子脱标后,不能撑高父盒子
父盒子的高度就会为0,会导致一些问题
根据以上两个问题,需要整理方案解决以上问题
缺点:父盒子的高度不可以随着子元素变高而增高,如果子盒子是动态的,父盒子还会出现原来的问题
使用height属性清除浮动影响只适用于父子都是固定高度的
css有个clear属性,专门清除浮动元素带来的影响
属性值:
left: 清除前面左浮动的影响
right: 清除前面右浮动的影响
both: 清除前面所有浮动的影响
clear: both;
clear属性可以解决当前盒子的浮动影响
缺点: 父盒子还是不能被内部元素撑高,父盒子之间的margin显示有问题
方法:利用clear属性和height属性,制作一堵墙,将两个有浮动的元素父亲隔离起来
.cl {
clear: both;
height: 10px;
}
<body>
<div class="box">
<p>p>
<p>p>
<p>p>
<p>p>
div>
<div class="cl">div>
<div class="box1 ">
<p>p>
<p>p>
<p>p>
<p>p>
div>
body>
缺点: 子盒子还是不能撑满父盒子的高度
方法:通过隔墙法演变而来,将墙放在了两个受影响父元素内部,所有的子元素最后,设置一堵内墙法,设置clear属性
.cl {
clear: both;
}
<div class="box">
<p>p>
<p>p>
<p>p>
<p>p>
<div class="cl">div>
div>
<div class="box1 ">
<p>p>
<p>p>
<p>p>
<p>p>
<div class="cl">div>
div>
解决了之前遇到浮动影响所有的问题
CSS选择器的一种(后面我们CSS3课程中会学习)
.clearfix::after {
content: '';
display: block;
height: 0;
clear:both;
visibility: hidden;
}
overflow属性清除浮动影响是一个小偏方,值必须是hidden,可以解决浮动的所有问题
overflow: hidden;
通过overflow属性解决浮动影响的原因:overflow属性有BFC特性,BFC特性有一个特点,设置是该属性的元素就拥有被内部元素撑高的特点
实际工作中,使用内墙法或者overflow属性去解决浮动的影响
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
*{
margin: 0;
padding: 0;
}
.outer {
width: 1000px;
height: 96px;
background: #F4F3F2;
margin: 100px auto;
padding: 15px 0;
}
.outer .pic {
width: 290px;
height: 96px;
float: left;
padding-left: 20px;
border-right: 1px solid #D0CDC7;
}
.outer .pic .top{
height: 65px;
}
.outer .pic .top img {
width: 83px;
float: left;
}
.outer .pic .top .t_cont{
float: left;
width: 197px;
padding-left: 10px;
font-size: 14px;
color: #0B335F;
}
.outer .pic .top .t_cont .tit {
line-height: 24px;
}
.outer .pic .top .t_cont .des{
font-size: 12px;
color: #666560;
line-height: 22px;
}
.outer .pic .top .t_cont .tit span{
color: #DA0000;
}
.outer .pic .bottom {
font-size: 14px;
color:#164560;
line-height: 30px;
}
.outer .news {
float: left;
padding-left: 32px;
line-height: 24px;
font-size: 14px;
color:#164560;
}
.outer .news ul {
list-style: none;
}
style>
head>
<body>
<div class="outer">
<div class="pic">
<div class="top">
<img src="images/cctvpic1.jpg" alt="">
<div class="t_cont">
<p class="tit">
<span>快看|span>2019我们一起想她表白
p>
<p class="des">
新中国70华诞,为祖国母亲而歌。
p>
div>
div>
<div class="bottom">
解放军最新地空导弹车曝光!战力惊人
div>
div>
<div class="pic">
<div class="top">
<img src="images/cctvpic2.jpg" alt="">
<div class="t_cont">
<p class="tit">
<span>中国梦实践者|span>大国工匠 行业先锋 创业圆梦
p>
div>
div>
<div class="bottom">
“家国情怀”是新时代一支强心剂
div>
div>
<div class="news">
<ul>
<li>第七届中国网络视听大会li>
<li>聚焦2019数博会li>
<li>壮丽70年li>
<li>2019中国北京世界园艺博览会li>
ul>
div>
div>
body>
html>