前端-css

143 阅读2分钟

CSS常见问题

BFC

什么是BFC

个人认为BFC是页面的一个隔离的独立渲染区域,区域内部的元素影响外部的元素。同理,外部的元素也不会影响内部的元素。

在CSS中有两种渲染区域,块级作用域(BFC),行内作用域(IFC)

BFC的布局规则:垂直排列,实际高度由内容+margin,而不是height决定。

属于同一个BFC的两个相邻元素,在垂直方向上margin会重叠,水平方向上不会。

计算父元素BFC渲染区域的高度时,内部浮动元素也会被计算到BFC中。

如何形成BFC

  1. float的值不是none
  1. position的值不是static或者relative
  1. display的值是inline-block,table-cell,flex等
  1. overflow的值不是visible

解决哪些问题:

  1. 垂直方向上的margin合并

 

如何防止父元素高度坍塌

起因:

父元素的高度是子元素内容撑起的

当子元素浮动,会导致父元素高度坍塌

 

解决:4种方案,通过形成BFC区域,解决高度坍塌

方案1:为父元素设置overflow: hidden属性

原理:

overflow: hidden会强制要求父元素必须包裹所有的内部浮动元素,已经所有元素的margin范围

缺点:子元素多高,过宽无法展示全

 

方案2:在父元素内的结尾追加空子元素(块级元素),并设置子元素清除浮动影响(clear:both)

原理:clear:both: 设定元素两边都不存在浮动元素,即清除元素左右两侧的浮动。

常用四个属性值: (both,left,right, none)

clear:left => 表示该元素左边不存在浮动元素

clear:right => 表示该元素右边不存在浮动元素

clear:none表示两边允许有浮动元素

缺点: 无故多出个空元素,导致难以查找元素和选定选择器,比如(last-child)本应想找的是最后一个孩子,找到的却是空元素

 

方案三:给父元素也加上浮动

原理:浮动元素会强制使父元素扩大到包含所有浮动的内部元素。

解决:会存在和overflow: hidden一样的问题,此时可以将末尾所需要的元素clear:both

 

方案四:完美方法 为父元素末尾伪元素 :after 设置clear:both

优点,既不影响显示隐藏,又不会影响查找元素,也不会产生多余的浮动

 

总结: 防止高度坍塌四种方案,

  1. 父元素overflow: hidden
  1. 父元素内加空元素,设置clear:both
  1. 父元素float
  1. 父元素:after {
    content: '',
    clear: both,
    display:bloak, // table
    height: 0, // 当设置display:table时,加上。某些浏览器中会存在默认高度

}