浮动与BFC

一、浮动

所谓的浮动:就是几个子元素脱离文本流,在父元素上一行排序
原理:给元素添加浮动后,会把右侧的空间做预留,给下一个元素添加浮动的时候,占据这个位置!
作用:让元素在父元素内部横向排序
属性:属性值 — float:left; lefy right none
1:特点:
1:脱离文本流,不占据空间 (不清除浮动的话,后面的文本流会直接补上该位置,浮动元素覆盖文本流元素)
2:多个元素添加浮动(外面需要一个父元素的存在,并且制定高度(否则需要清除浮动),而所有子元素都添加浮动形成一列)
3:浮动的子元素超过父元素的宽度的时候,被挤到下一行显示(从左开始再排序)
4:子元素添加浮动,而父元素没有添加高度,会造成高度塌陷

二、高度塌陷

所谓高度塌陷:就是父元素的高度出现崩塌的现象,使得布局乱套! 以下有着几种高度塌陷的场景!
场景1:
height不设置 或 height:auto; 元素的高度是被内容撑开的!
问题:height不设置 或 height:auto;会存在问题:当内容极度减少的时候,容器的高度不会被撑开,
会影响整个板块的布局!
解决方法:添加一个最小高度,让容器保存一个最小高度,这样就算板块内的内容极度减少,也不会造成撑开了元素的高度!
而且当内容增加的时候,需要撑开内容!
给容器添加最小高度:min-height: ;
场景2:
就是父元素未添加高度,而子元素添加了浮动(并且依靠着子元素撑开父元素),造成高度塌陷
解决方法1:
给造成高度塌陷的父元素添加overflow:hidden; —因为触发了布局逻辑BFC
并且给父元素添加最小高度 —这样你的高度可以再随着子元素来撑开!
弊端:overflow:hidden; 超出会被隐藏掉
解决方法2:
给浮动元素的后面添加一个元素(同级元素-空标签),标签给他添加样式{clear:both }
弊端:添加了太多空元素,造成代码冗余,造成浏览器加载效率慢!
解决方法3: 万能清除法
给外围父元素添加一个最小高度;还有出现高度塌陷的父元素添加清除浮动!
.clear-fix::after {
content: “.”;
height: 0;
display: block;//化为块状,占有宽度
clear: both;//清除两本的浮动
overflow: hidden;//把content中.隐藏
visibility: hidden;//不可见的元素也会占据页面上的空间,隐藏留出空间,撑开父元素
}
.clear-fix{
zoom:1;//这是针对ie浏览器,解决高度塌陷
}
思路:浮动元素 - 浮动元素的父元素添加清除浮动 - 然后父元素的外围模块(父元素)添加最小高度
也就是浮动元素撑开父元素(高度不能固定),父元素再撑开外围模块!

场景3:
     子元素高度跟随父元素的高度变化!
     需求:给一个box设置为可视区的宽高100%,那么需要给父元素设置高度,也就是body,html设置为100%

二、BFC

BFC:纯概念 -> 布局逻辑规定
直译:块级格式化上下文 ( 就是一个独立的渲染区 )
注:只有块状元素参与BFC布局逻辑
一:BFC的布局规则
a、内部的Box会在垂直方向,一个接一个地放置。
b、Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的上下margin会发生重叠(按照最大margin值设置)
c、每个元素的margin box的左边, 与包含块border box的左边相接触
重点:以下三点!
d、BFC的区域不会与float的box(盒子)重叠。
e、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。
f、计算BFC的高度时,浮动元素也参与计算

二:BFC的触发条件
a: 根元素(html)
b: float属性不为none
c:position为absolute或fixed
d: display为inline-block, table-cell, table-caption, flex, inline-flex
e: overflow不为visible(默认值)

三:BFC的应用:
1:解决高度塌陷
2: 防止margin上下重叠(了解)
解决margin上下重叠 (给box1 margin0bottom:50px 给box2包裹一个父元素,在给box2的子元素添加一个margin-top:100px;
则可以触发两个BFC,最终结果为150px间距)
3:完成自适应两栏布局 — (左侧宽度固定。右侧自适应)

(1):左侧宽度固定,右侧自适应,实现自适应布局。

在这里插入图片描述
原理:就是把左边进行浮动,右边使用overflow:hidden触发BFC,在BFC之中,触发BFC的模块不会覆盖float的盒子元素,而浮动的元素是不占据空间的,于是原本蓝色模块占据了整个视口,但是触发了BFC,因此不会覆盖浮动元素的盒子!

  <div class="left">左</div>
  <div class="right">右</div>

方法1:
    * {
      margin: 0;
      padding: 0;
    }

    body,
    html {
      height: 100%;
    }

    .left {
      width: 200px;
      height: 100%;
      background: red;
      float: left;
    }

    .right {
      height: 100%;
      background: blue;
      /* 触发BFC  */
      overflow: hidden;
    }

方法2::
    * {
      margin: 0;
      padding: 0;
    }

    body,
    html {
      height: 100%;
    }

    .left {
      width: 200px;
      height: 100%;
      background: red;
      float: left;
    }

    .right {
      margin-left: 200px;
      height: 100%;
      background: blue;
    }
(2):左侧右侧宽度固定,中间自适应

思路:
布局:先左后右 – 最后是中间
样式:就是需要先设置作用的浮动,然后把中间自适应
有两种方法:
方法1:左右浮动,中间使用这个来触发BFC(overflow: hidden;),center部位占据整个视口,由于触发BFC,因此不会覆盖folat的盒子,就实现了两边浮动,中间自适应的布局!
方法2:左右浮动,中间使用margin 0 200px; 来填充这边的浮动区域留下的空间!
方法3:左右浮动,然后中间版块外面包裹一个盒子,盒子高为100%,然后里面的center-con使用padding撑开,也就是padding:0 200px;
注意点1:设置高自适应的时候,其父元素必须添加高度为100%,也就是body,html的高度为100%!
注意点2:布局先左边,右边,最后中间版块!这样的顺序—是避免中间版块直接布局独占一行,把后面的right挤下来,因此先.left — .right — .center!
在这里插入图片描述
方法1:

  <div class="left">左</div>
  <div class="right">右</div>
  <div class="center">中</div>

    * {
      margin: 0;
      padding: 0;
    }

    body,
    html {
      height: 100%;
    }
    .left {
      float: left;
      width: 200px;
      height: 80%;
      background: red;
    }

    .right {
      float: right;
      width: 200px;
      height: 80%;
      background: blue;
    }

    .center {
      margin: 0 200px;
      height: 100%;
      margin: 0 200px;
      background: orange;
    }

方法2:

    * {
      margin: 0;
      padding: 0;
    }

    body,
    html {
      height: 100%;
    }

    .left {
      float: left;
      width: 200px;
      height: 80%;
      background: red;
    }

    .right {
      float: right;
      width: 200px;
      height: 80%;
      background: blue;
    }

    .center {
      overflow: hidden;
      height: 100%;
      margin: 0 200px;
      background: orange;
    }

方法3:

  <div class="left">1</div>
  <div class="right">2</div>
  <div class="center">
    <div class="center-con">4</div>
  </div>

    * {
      margin: 0;
      padding: 0;
    }

    body,
    html {
      height: 100%;
    }

    .left {
      float: left;
      width: 200px;
      height: 80%;
      background: yellow;
    }

    .right {
      float: right;
      width: 200px;
      height: 80%;
      background: pink;
    }

    .center {
      padding: 0 200px;
      background: purple;
      height: 100%;
    }

    .center-con {
      width: 100%;
      height: 100%;
      background: orange;
    }

三、BFC实现两栏自适应布局

在这里插入图片描述

 <header>我是头部</header>
  <div class="left">左</div>
  <div class="right">右</div>
  <div class="center">中</div>
  <footer>我是尾部</footer>

    * {
      margin: 0;
      padding: 0;
    }

    body,
    html {
      height: 100%;
    }

    header {
      height: 10%;
      background: red;
    }

    .left {
      width: 200px;
      float: left;
      background: yellow;
      height: 60%;
    }

    .right {
      width: 200px;
      float: right;
      background: orange;
      height: 60%;
    }

    .center {
      margin: 0 200px;
      background: pink;
      height: 80%;
    }

    footer {
      height: 10%;
      background: blue;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值