美文网首页
CSS:浮动定位和BFC

CSS:浮动定位和BFC

作者: jiangzj | 来源:发表于2017-02-08 23:54 被阅读0次

    一、浮动元素

    特征

    浮动元素会脱离文档流,并按照指定的方向移动,直到其碰到父元素边框或另一个浮动元素的边缘。普通文档流会视浮动元素不存在一样,但文字和图片等内容可以感知浮动元素的存在,遇到浮动元素会避开。

    • 对于父容器
      若子元素都是浮动元素,相当于子元素不存在,父元素没有包含任何内容,因此会无法撑开父容器,父元素高度为0。
    • 对于其他浮动元素
      浮动元素会水平排列,如果包含块太窄无法容纳全部浮动元素,那么无法包含的浮动元素会向下移动,直到有足够的空间,而如果浮动元素的高度不同,那么向下移动的时候可能会被卡主。
    • 对于其他普通元素
      普通元素会占据浮动元素原来的空间,但会被浮动元素遮盖。
    • 对于文字
      文字会感知到浮动元素的存在,会环绕其周边。

    二、清除浮动

    清除浮动是指清除浮动元素带来的不利影响。

    清除浮动的方法
    1. 在浮动元素的后面增加一个无内容的标签,添加clear属性。
    2. 因为BFC可以包含浮动元素,因此可以使父容器形成BFC:
    • float: left | right;
    • overflow: hidden | auto | scroll;
    • display: table-cell | table-caption | inline-block;
    • position: absolute | fixed
    1. 利用CSS添加一个空的内容,1类似
    /*方法1*/
    .clearfix{
      *zoom:1;
    }
    .clearfix:after{
      content:"";
      display:block;
      clear:left;
    }
    
    /*方法2*/
    .clearfix{
    *zoom:1;
    }
    .clearfix:after{
    content:"";
      display:table;
      clear:both;
    }
    

    三、定位

    1. inherit
      从父元素继承。
    2. static
      默认值,元素出现在正常流中,参考点是文档流中正常的位置。
    3. relative
      相对定位。相对于元素本身正常的位置进行定位,通过top、bottom、left、right属性来设置偏移值,原有位置不被其他元素占据。
      使用场景:为绝对定位设置参照物或元素自身位置进行局部调整。
    4. absolute
      绝对定位。相对于除static定位外的第一个父元素进行定位,通过top、bottom、left、right属性来设置偏移值,不占空间。
      使用场景:因为是一父元素作为参照,可以比较方便地设置元素的位置,且不影响其他元素的布局。
    5. fixed
      固定定位。相对于viewport进行的定位,不为元素预留空间。
      使用场景:弹窗等。
    6. sticky
      粘性定位是相对定位和固定定位的混合。元素在跨越特定阈值前为相对定位,之后为固定定位。

    四、z-index

    z-index属性指定了一个元素及其子元素的z-order。当元素之间重叠的时候,z-order决定了哪一个元素覆盖在其他元素的上方显示。通常来说,z-index较大的元素会覆盖较小的一个。


    五、position:relative和margin的偏移作用

    • position:relative 不会影响其他元素的布局,即使偏移了,页面还是会保留其原来的位置。
    • margin 自身偏移的情况下,还会影响后面其他普通流的元素。

    六、 BFC(Block Formatting Context)

    块格式化上下文是由以下之一创建的:

    • 根元素或其它包含它的元素
    • 浮动
    • 绝对定位的元素(元素具有position为absolute或fixed)
    • 内联块inline-blocks
    • 表格单元格(display:table-cell)
    • 表格标题(display:table-caption)
    • 块元素 元素具有overflow的值不是visible
    • 弹性盒子 flex boxes(display:flex | inline-flex)
    • display:flow-root

    块格式化上下文对定位和清除浮动很重要。可以理解BFC为一个模块,两个不同模块是相对独立互不影响的:

    • 同一个模块内,两个相邻元素或嵌套元素的垂直margin重叠;
    • 可以包含浮动,因此浮动不会影响其他模块中元素的布局;
    • 清除浮动只能清除同一模块中,在它前面的元素的浮动。
    例子:通过{display:inline-block}包裹浮动元素
      <div class="one">
        <div class="two">2</div>
      </div>
    
    .one{
      display: inline-block;
      border: 5px solid black;
    }
    .two{
      width:400px;
      height:400px;
      background:red;
      float: left;
    }
    

    七、外边距合并

    1. 在什么场景下会出现外边距合并?
      在同一BFC里,垂直相邻的两个元素或嵌套关系的父子元素会发生外边距合并。
    2. 如何合并?
    • 外边距为正值时,并不是将两个边距相加,而是只保留较大一个。
    • 遇到外边距为负数时,会进行相加。
    1. 如何不让相邻元素外边距合并?
    • 将其分别放置在不同的BFC中。
    • 设置padding或border,保证外边距不接触。
    1. 父子外边距实例
      注意,red的左右margin在yellow里显示,而red的上下margin与yellow的合并,然后两者合并后的margin又和blue的margin合并。
      <div class="blue"></div>
      <div class="yellow">
        <div class="red"></div>
      </div>
    
    .blue{
      width: 400px;
      height: 200px;
      background: blue;
      margin: 20px
    }
    .yellow{
      background: yellow;
      margin:20px;
    }
    .red{
      width: 400px;
      height: 400px;
      background: red;
      margin: 20px;
    }
    
    Screenshot.png

    相关文章

      网友评论

          本文标题:CSS:浮动定位和BFC

          本文链接:https://www.haomeiwen.com/subject/zrxbittx.html