文档流normal flow

  • 网页是一个多层结构
  • 通过CSS可以分别给每一层设置样式
  • 作为用户只能看到最顶上一层
  • 最底下一层称为文档流,文档流是网页的基础

    • 我们所创建的元素默认都是在文档流中进行排列
    • 元素主要有两个状态:在文档流/不在文档流
  • 元素在文档流的特点

块元素:
1、独占一行,块元素会自上向下排列
2、块元素默认宽度是父元素的100%。前提都是没有设置宽高
3、高度默认被内容撑开。

内联元素:
1、在文档流只占自身的大小,会默认从左往右排列,如果一行容纳不下回换到下一行
2、在文档流中,高度宽度默认被内容撑开。

浮动

  • 块元素在文档流里默认垂直排列。如果希望块元素在页面中水平排列,可以使块元素脱离文档流。
  • 使用float来使元素浮动,从而脱离文档流。设置非none值,元素脱离文档流。
  • 可选值
    • none
    • left/right
  • 注意设置浮动后,水平布局等式不需要强制成立。会完全从文档流中脱离,不再占用文档流的位置,所以元素下边的还在文档流中的元素会自动向上移动
  • 浮动的特点
    • 主要作用就是让页面中的元素可以水平排列,制作水平布局
    • 1、浮动元素会完全脱离文档流,不再占据文档流位置
    • 2、设置浮动后元素向父元素左侧或右侧移动
    • 3、浮动元素默认不会从父元素中移出
    • 4、浮动元素不会出超过前面其他浮动元素。浮动元素上面是一个没有浮动的块元素,则上不去,块元素独占一行
    • 5、浮动元素不会超过它上边的兄弟元素,最多一边齐
    • 6、想让某个元素上去,可通过调整结构顺序
    • 7、浮动元素不会盖住文字,可用浮动设置文字环绕效果
    • 8、浮动脱离文档流后,元素特点会发生改变
      • 块元素脱离文档流
        • 不再独占一行
        • 宽度和高度被内容撑开
        • 可以设置宽高
      • 行内元素脱离文档流
        • 变成块元素,特点和块元素一样
      • 脱离文档流,不再区分行内和块

高度塌陷问题

  • 在文档流中,父元素的高度默认被子元素撑开,也就是子元素有多高,父元素就有多高
  • 当子元素设置浮动时,子元素会完全脱离文档流
  • 此时会导致子元素无法撑起父元素的高度,父元素会塌陷,则父元素下的所有元素都会向上移动

解决方案1:

可以将父元素高度写死,避免塌陷,但一旦写死,父元素的高度将不能根据子元素动态调节,所以这种方案不建议使用

解决方法2:

BFC(Block Formatting Context)

  • 块级格式化环境
  • BFC是css中一个隐含的属性,可以为一个元素开启BFC,变成独立的布局区域
  • 元素开启BFC后的特点:
    • 不会被浮动元素所覆盖
    • 子元素和父元素的外边距不会重叠
    • 可以包含浮动的子元素,开启父元素的BFC
  • 开启BFC的方法
    • 设置元素的浮动,副作用是父元素宽度丢失(不推荐)
    • 设置为行内块inline-block(不推荐)
    • 将元素的overflow设置为非visible,常用方式设置为overflow:hidden。开启其BFC,使其可以包含浮动元素(副作用最小)

      解决方法3(最终方案)

      在高度塌陷的父元素的最后添加一个空白的div子元素
      由于这个div并没有浮动,所以他可以撑开父元素高度
      然后对齐进行清除浮动,这样可以通过空白的div来撑开父元素

使用这种方法会添加多余的结构,我们希望CSS的问题由CSS解决
通过after伪类向元素最后添加一个空白的块元素,就不会有多余结构
.clearfix:after{
/ clear: left; /
content: “”;
/ 伪元素添加的元素是行内元素 /
display: block;
clear: both;
}

垂直外边距重叠

例如给子元素设置margin-top,不会只移动子元素,而是将子元素和父元素一起移动
子元素和父元素相邻的垂直外边距会发生重叠,子元素的外边距会传递给父元素
1、别用外边距,用内边距,会影响可见框高度
2、给父元素开启BFC
2、别让她们相邻, 用个空的table隔开,但结构多了内容
3、通过CSS添加一个空表格,。
box1:before{
content:””
display:table
}

同时解决高度塌陷和父子元素重叠

给要处理的元素加上clearfix类名
经过修改后的clearfix是一个多功能的
既可以解决高度塌陷,又可以确保父元素和子元素的垂直外边距不会重叠
.clearfix:before,
.clearfix:after{
content: “”;
display: table;
clear: both;
}

兼容IE6
.clearfix{
zoom: 1;
}

clear清除浮动

  • 作用:清除浮动元素对当前元素所产生的影响
  • 可选值
    • left:清除左侧浮动对当前元素的影响
    • right:清除右侧浮动对当前元素的影响
    • both:清除两侧中最大影响的那侧
  • 原理:清除浮动以后,浏览器会自动为元素添加一个上外边距使其位置不受其他元素的影响