学习目标
- 了解margin合并与塌陷现象(相邻块元素垂直外边距的合并,嵌套块元素垂直外边距的塌陷)
- 能够说出解决margin塌陷的几种方式
- 理解浮动的作用及特点(解决上下盒子 可以水平布局的问题,脱标)
- 能够说出几种清除浮动的方式(额外标签法、overflow、伪元素清除浮动)
- 能够使用浮动完成导航案例
- 能够说清除浮动的目的(消除浮动对之后元素的影响)
理解上课的知识点
margin的特殊现象
marign的合并现象
正常情况下:比如当两个盒子水平布局时,左右的margin会叠加;
但是当两个盒子垂直布局时,会出现合并现象(两者之间的距离取最大值)
正常现象:
比如:当两个盒子水平布局时,左右的margin会叠加,盒子之间的距离为margin的和。
合并现象:
当两个盒子垂直布局时,上下的margin会合并,盒子之间的距离为margin的最大值
合并现象解决方案: 避免就好了
上下盒子的margin距离,只给其中一个设置即可
margin的塌陷现象(重要)
互相嵌套的块级元素,垂直外边距会塌陷
塌陷现象:
互相嵌套的块级元素,如果给子元素设置margin-top,此时父元素会一起往下移动!!!
塌陷现象解决方案:
给父盒子加一个边框
相当于给老父亲添加一块钢板
给父盒子加 padding-top
相当于给老父亲添加一层泡沫
给父盒子设置属性
overflow: hidden
(该属性触发了父盒子的BFC:块级格式化上下文)触发父盒子的BFC可以解决塌陷问题
给父盒子设置浮动
给父盒子设置为行内块
伪元素
顾名思义:假的元素
对比:
元素:指的是页面中HTML标签
伪元素:假的HTML标签
伪元素是由CSS代码模拟的一个HTML标签 不是真的HTML标签
学习伪元素的时候,可以就当做学习两个新标签来看。
种类:
常见的有2种
::after(在...之后)
:在标签里面的最后,添加一个伪元素::before(在...之前)
:在标签里面的最前,添加一个伪元素
ヾ(๑╹◡╹)ノ”div里面放一个span标签,然后用伪元素模拟效果
注意点:
使用伪元素有一个必加属性
content:'';
content属性值里写标签里面的问题
伪元素默认是行内元素
浮动
浮动初体验
解决盒子水平布局的问题
需求:在页面上有两个div,在一行中显示,一个靠左,一个靠右
解决方法:
先转换成行内块元素,再使用marign移动div的位置
但是缺点是:当改变浏览器大小的时候,效果就崩了。
其实有一个css属性就是为了完成这个效果的→浮动
浮动的代码:
float:left;
→左浮动float:right;
→右浮动
此时我们就可以使用浮动完成需求了
浮动的特点(了解)
重点在于浮动的使用
标准流:就是浏览器默认摆放盒子的顺序(从上往下、从左往右)
浮动的特点:
浮动的元素会脱离标准流(脱标)
可以把标准想象成地面
相当于飘起来了
相当于飘到了空中
在标准流中不占位置
在地面中不占位置→地面中之后的元素会往上跑
浮动的元素会覆盖在标准流的元素之上
比标准流高出半个级别
之后学习的定位比标准流高出一个级别
浮动的规则:浮动找浮动
浮动元素排列的时候,会找上一个浮动元素的后面
浮动的重点:浮动的元素只会影响下面的元素
浮动的元素受到上一个盒子边界的限制(块级元素独占一行)
.png)
浮动的元素有特殊的显示效果
- 可以设置宽高
一行可以显示多个
注意:浮动元素不能使用text-align或者margin:0 auto居中!
记忆 :
1 | 1. 浮动元素会脱标 ==> 飘起来了(不占位置) ==> 比标准流高半个级别 |
浮动的案例
浮动完成页面的布局
SEO导航
之前直接使用 a 标签
display:inline-block
制作导航是有问题的
问题:
- 导航与导航之间应该是列表关系,按照标签语义化的要求,必须要用到 ul 标签
- a 标签不用其他的标签包裹起来,搜索引擎在查看页面时,认为该页面在作弊,会把排名靠后
所以导航必须要用 ul 和 li 将 a 标签包裹起来
书写导航的步骤:
清除默认的margin和padding→
初始化样式
找到ul,去除小圆点→
list-style:none;
给li标签设置
float:left
让li标签在一行中显示给a标签设置宽高
点击导航的四角应该也能跳转的,所以a标签应该有宽高
问题来了:a标签是行内元素,默认不能设置宽高的,怎么办呢?
方法:
三种方法都可以
给a标签设置
display: inline-block;
给a标签设置
display: block;
li标签是由a标签撑开的,所以a标签在自己的父元素li中就是独占一行的
给a标签设置
float:left;
因为浮动元素也是可以设置宽高的
清除浮动(清除浮动的影响)
浮动带来的问题:浮动元素撑不开父级容器
seo导航的问题
回顾之前写的SEO导航,存在一定的问题:
如果此时想在SEO导航下面写上一个红色的div,会发现
原因:
审查元素之后你会发现:因为li标签都是浮动了,在标准流中不占位置,所以不能把ul撑开,此时ul的高度为0。
这就是浮动带来的问题:ul没高度,影响了之后盒子的布局
那么如果解决浮动的问题呢?
我们可以通过清除浮动的方法来让ul有高度
清除浮动
清除浮动其实就是:清除浮动带来的影响(问题)
如:ul没有高度,我们需要清除这个影响→让ul有高度
浮动带来的影响(问题):
当父元素没有设置高度,此时由子元素撑开。但是如果 子元素浮动了(相当于飘起来了→在标准流中不占位置),此时不能把父元素撑开(父元素高度为0)
清除浮动的方法(会用即可)
额外标签法
不推荐,会产生一个多余的盒子
步骤:
- 在父元素里面的最后的添加一个块级元素
- 给添加的块级元素设置清除浮动的核心代码
clear:both;
缺点: 需要在页面中添加额外的标签,让页面的HTML结构变得更加复杂
使用 overflow 清除浮动
在某些特定场景下使用不了
步骤:
- 直接给父元素设置
overflow:hidden;
单伪元素清除法
其实原理和额外标签法一样,使用伪元素替代了HTML标签
代码:
一般伪元素清除法会使用
.clearfix
这个类名
1 | .clearfix::after { |
伪元素由CSS渲染,不会增加额外的html标签(解决了额外标签法的缺点)
设置高度
简单粗暴,但是不推荐,不利于后期维护
步骤:
- 直接给父元素设置高度
浮动最开始的作用
浮动最开始的作用是为了将网页做成报纸那样的图文环绕效果
图文环绕:
ヾ(๑╹◡╹)ノ”网页头部案例~
拓展
行内元素margin和padding的失效
行内元素的上下margin和padding会失效
ヾ(๑╹◡╹)ノ”上面两个span,下面有个p标签~
现象:
margin
行内元素的margin
左右的margin能生效
上下的margin会失效!!
没有作用
行内元素的padding
- 左右的padding能生效
- 上下的padding会失效
注意:
- 块级元素和行内块元素的margin和padding随便使用!没问题
- 行内元素的上下margin和上下padding会失效!!开发中不要使用!!