css 浮动的特点和浮动引起高度塌陷及浮动的清除

CSS浮动与BFC详解
本文详细介绍了CSS中浮动的概念及特点,包括元素如何通过浮动实现水平布局,并探讨了浮动可能导致的高度塌陷问题及其解决方案——BFC(块级格式化环境)。此外,还介绍了clear属性的作用。

目录

1. 浮动的简介

2. 浮动的特点

3. 脱离文档流的特点

4 .高度塌陷与BFC

5. clear


1. 浮动的简介


通过浮动可以使一个元素向其父元素的左侧或右侧移动

使用float属性来设置于元素的浮动

none 默认值,元素不浮动
left 元素向左浮动
right 元素向右浮动

注意:

元素设置浮动以后,水平布局的等式便不需要强制成立
元素设置浮动以后,会完全从文档流中脱离,不再占用文档流的位置,所以元素下边的还在文档流中的元素会自动向上移动


2. 浮动的特点


浮动元素会完全脱离文档流,不再占据文档流中的位置

设置浮动以后,元素会向父元素的左侧或右侧移动

浮动元素默认不会从父元素中移出

浮动元素向左或向右移动时,不会超过前边的浮动元素(先来后到的顺序)

浮动元素不会超过上边的浮动的兄弟元素,最多就是和它一样高

如果浮动元素的上边是一个没有浮动的块元素,则浮动元素无法上移

浮动元素不会盖住文字,文字会自动环绕在浮动元素的周围,所以我们可以利用浮动来设置文字环绕图片的效果

image-20210524203900253

简单总结:

浮动目前来讲它的主要作用就是让页面中的元素可以水平排列,通过浮动可以制作一些水平方向的布局
元素设置浮动以后,将会从文档流中脱离,从文档流中脱离后,元素的一些特点也会发生变化


3. 脱离文档流的特点


块元素:

块元素不再独占页面的一行
脱离文档流以后,块元素的宽度和高度默认都被内容撑开

行内元素:

  • 行内元素脱离文档流以后会,特点和块元素一样

4 .高度塌陷与BFC







  高度塌陷

在浮动布局中,父元素的高度默认是被子元素撑开的

当子元素浮动后,其会完全脱离文档流,子元素从文档流中脱离将会无法撑起父元素的高度,导致父元素的高度丢失

父元素高度丢失以后,其下的元素会自动上移,导致页面的布局混乱

动画2021-41

所以高度塌陷是浮动布局中比较常见的一个问题,这个问题我们必须要进行处理!

4.2. BFC
BFC(Block Formatting Context)块级格式化环境

BFC是一个CSS中的一个隐含的属性,可以为一个元素开启BFC
开启BFC该元素会变成一个独立的布局区域
元素开启BFC后的特点:

不会被浮动元素覆盖
父子元素外边距不会重叠
可以包含浮动的元素

设置overflow为非visible值:既没有覆盖元素,也保持了独占一方的特性(保持了宽度),与下方元素也保持了最初的间隙

常用的方式为元素设置overflow:hidden(overflow:auto也是ok的) 开启其BFC, 以使其可以包含浮动元素

overflow:scroll 会有滚动条,可能并不需要的,所以不太推荐

不过,这种方式也存在一定问题,如下,overflow并没有完全清除div2布局上受到的影响

总结

  • 可以通过变成浮动元素,来防止自身被浮动元素覆盖(有点“以毒攻毒”那味了)
  • 可以设置行内块,来防止自身及其他元素被浮动元素覆盖(如果说浮动是“独善其身”,那行内块就有点“兼济天下”的意思)
  • 可以设置overflow属性,包含浮动元素(既“独善其身”,又“兼济天下”,但仍有缺陷)

5. clear

我们这里设计三个兄弟元素,对前两个元素进行float的浮动属性设置,看下效果

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
 </head>
 <body>
  <style type="text/css">
    .box1{
        width:200px;
        height:200px;
        background-color:orange;
        float:left;
    }

    .box2{
        width:300px;
        height:300px;
        background-color:green;
        float:right;
    }

    .box3{
        width:400px;
        height:400px;
        background-color:blue;
        clear:right;
    }
  </style>
  <div  class="box1">
    1111
  </div>
  <div  class="box2">
    22222222
  </div>
  <div  class="box3">
    3333333
  </div>
 </body>
</html>

动画2021-36

如果我们不希望某个元素因为其他元素浮动的影响而改变位置,可以通过clear属性来清除浮动元素对当前元素所产生的影响

clear作用:清除浮动元素对当前元素所产生的影响(本质是为元素添加一个margin-top属性,值由浏览器自动计算)

可选值:

left 清除左侧浮动元素对当前元素的影响
right 清除右侧浮动元素对当前元素的影响
both 清除两侧中影响较大一侧元素的影响(注意,这里不是同时清除两侧的影响)


动画2021-32

Q1:这里使用了一个伪元素选择器::after,那有人会问了,跟在box2下直接定义一个box3有什么区别呢?

A:我们知道,网页的结构思想是:结构+表现+行为。在box2下直接定义一个box3,属于结构;而使用伪元素选择器,属于表现

而高度塌陷问题属于表现问题,定义box3的目的是为了撑起box1的内容,属于表现,而不是结构,所以在css中定义::after更符合网页的编程思想

Q2:为什么需要使用display: block呢?

A:因为默认情况下,::after伪元素是一个行内元素,如果不转为块元素,将仍然撑不起box1的高度
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fish_study_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值