CSS盒模型、BFC

盒模型

标准模型/IE模型

标准盒模型:content  

width->content(不包含padding和border)

css设置:box-sizing:content-box;(浏览器默认的方式)

 

IE盒模型:content

width-->content+border+padding

css设置:box-sizing: border-box;

 

js如何设置获取盒模型对应的宽和高

(1)dom.style.width/height(只能取到内联样式)

三种设值方式:内联、<style><style>、外联

 

??三种拿到的是渲染后的样式属性 即时应用(三种设样式方式的都能获取到)

(2)dom.currentStyle.width/height(IE支持)

(3)window.getComputedStyle(dom).width/height (兼容火狐、谷歌 不兼容IE)

1 var div=document.getElementsByTagName("div")[0];
2 console.log(getStyle(div,"background-color"));
3 function getStyle(ele,attr){
4     if(window.getComputedStyle){
5         return window.getComputedStyle(ele,null)[attr];
6     }
7     return ele.currentStyle[attr];
8 }

(4)dom.getBoundingClientRect().width/height (即时应用 拿到元素的绝对位置 left top width height)

IE、Firefox3+、Opera9.5、Chrome、Safari支持,在IE中,默认坐标从(2,2)开始计算,导致最终距离比其他浏览器多出两个像素,我们需要做个兼容

 
 1 document.documentElement.clientTop;  // 非IE为0,IE为2
 2 document.documentElement.clientLeft; // 非IE为0,IE为2
 3 //分别加上外边据、内边距、边框和滚动条,用于测试所有浏览器是否一致。
 4 functiongGetRect (element) {
 5      var rect = element.getBoundingClientRect();
 6      var top = document.documentElement.clientTop;
 7      var left= document.documentElement.clientLeft;
 8      return{
 9          top    :   rect.top - top,
10          bottom :   rect.bottom - top,
11          left   :   rect.left - left,
12          right  :   rect.right - left
13      }
14   }

 

BFC 

概念:块级格式化上下文

(IFC 行内格式化上下文)

它是一个独立的渲染区域,只有Block-level box(块)参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干

其实就是一些规则集合的名称

FC 格式化上下文:是W3C CSS2.1规范中的一个概念,定义的是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用

 

我们页面的根元素HTML就是一个典型的遵循BFC规则的元素,还可以通过一些属性显示BFC规则

如:

float属性不为none
position为absolute或fixed(position 不为 relative 或 static)
display为inline-block, table-cell, table-caption, flex, inline-flex
overflow不为visible

 

BFC的显示规则

内部的box会在垂直方向一个接一个排列

Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠(按照最大margin值设置)

  

基本原理:(渲染规则)

垂直方向会发生重叠(不重叠解决方案:给子元素加一层父元素 给父元素创建一个BFC 包起来 设置overflow:hidden; )

// BFC垂直方向边距重叠
<
section class="layout overlap"> <style> .son { height: 100px; width: 200px; margin: 10px auto 50px; background-color: blueviolet; }
.parent { // 添加BFC 消除重叠 overflow: hidden; } </style> <div class="son"></div> <div class="parent"> <div class="son"></div> </div> <div class="son"></div> </section>

 

 

设置左浮动 右边会超出左边 因为BFC

CSS盒模型、BFC

解决:给右边子元素添加BFC overflow: auto;  解决

CSS盒模型、BFC

<!-- BFC不与float重叠 --> 
<section class="layout">
     <style>
       .left {
         background-color: brown;
         float: left;
         width: 100px;
         height: 100px;
      }
      .right {
        background-color: chartreuse;
         height: 110px;
         overflow: anto; // 解决BFC重叠问题(overflow 不为visible)
       }
     </style>
     <div class="left"></div>
     <div class="right"></div>
   </section>

 

计算BFC高度时,浮动元素也参与计算

划重点
这一点可以解决浮动带来的父元素高度塌陷问题哦~

<!-- BFC子元素即使是float也会参与高度计算 -->
  <section id="float">
    <style>
      #float {
       background-color:crimson;
       overflow: auto; /* 清除了浮动*/
       /* float: left; */
      }
      .float {
        float: left;
        height: 30px;
      }
    </style>
    <div class="float">我是浮动元素</div>
  </section>

CSS盒模型、BFC

CSS盒模型、BFC

 

CSS盒模型、BFC

上一篇:纯CSS实现环形进度条


下一篇:JS Leetcode 74. 搜索二维矩阵题解分析,二分法与坐标轴法