css 盒子模型专题进阶

167 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

css 盒子模型专题进阶

两种盒子模型

/* 设置当前盒子为 标准盒模型(默认) */
box-sizing: content-box;

/* 设置当前盒子为 IE盒模型 */
box-sizing: border-box;

备注:盒子默认为标准盒模型。 在 标准盒子模型中,width 和 height 指的是内容区域的宽度和高度。增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸。

IE 盒子模型中,width 和 height 指的是内容区域+border+padding 的宽度和高度。

js 获取盒子的宽和高

方式一:通过 DOM 节点的 style 样式获取
 element.style.width/height;

缺点:通过这种方式,只能获取行内样式,不能获取内嵌的样式和外链的样式。 这种方式有局限性,但应该了解。

方式二(通用型)
    window.getComputedStyle(element).width/height;

方式二能兼容 Chrome、火狐。是通用型方式。

方式三(IE 独有的)
    element.currentStyle.width/height;

和方式二相同,但这种方式只有 IE 独有。获取到的即时运行完之后的宽高(三种 css 样式都可以获取)。

方式四
    element.getBoundingClientRect().width/height;

此 api 的作用是:获取一个元素的绝对位置。绝对位置是视窗 viewport 左上角的绝对位置。 此 api 可以拿到四个属性:left、top、width、height。

margin 塌陷和重叠

标准文档流中,竖直方向的 margin 不叠加,只取较大的值作为 margin(水平方向的 margin 是可以叠加的,即水平方向没有塌陷现象)。

PS:如果不在标准流,比如盒子都浮动了,那么两个盒子之间是没有 margin 重叠的现象的。

如果要表达父子之间的距离,我们一定要善于使用父亲的 padding,而不是儿子的 margin。

BFC

BFC(Block Formatting Context):块级格式化上下文。你可以把它理解成一个独立的区域

BFC 的原理/BFC 的布局规则【非常重要】

BFC 的原理,其实也就是 BFC 的渲染规则(能说出以下四点就够了)。包括:

(1)BFC 内部的子元素,在垂直方向,边距会发生重叠。 (2)BFC 在页面中是独立的容器,外面的元素不会影响里面的元素,反之亦然。(稍后看举例 1) (3)BFC 区域不与旁边的 float box 区域重叠。(可以用来清除浮动带来的影响)。(稍后看举例 2) (4)计算 BFC 的高度时,浮动的子元素也参与计算。(稍后看举例 3)

如何生成 BFC 有以下几种方法: 方法 1:overflow: 不为 visible,可以让属性是 hidden、auto。【最常用】

方法 2:浮动中:float 的属性值不为 none。意思是,只要设置了浮动,当前元素就创建了 BFC。

方法 3:定位中:只要 posiiton 的值不是 static 或者是 relative 即可,可以是 absolute 或 fixed,也就生成了一个 BFC。

方法 4:display 为 inline-block, table-cell, table-caption, flex, inline-flex

W3C 对 BFC 的定义如下: 浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table- cells, 和 table-captions),以及 overflow 值不为"visiable"的块级盒子,都会为他们的内容创建新的 BFC(Block Fromatting Context, 即块级格式上下文)。

一个 HTML 元素要创建 BFC,则满足下列的任意一个或多个条件即可: 下列方式会创建块格式化上下 文: 根元素() 浮动元素(元素的 float 不是 none) 绝对定位元素(元素的 position 为 absolute 或 fixed) 行内块元素(元素的 display 为 inline-block) 表格单元格(元素的 display 为 table-cell,HTML 表格单元格默认为该值) 表格标题(元素的 display 为 table-caption,HTML 表格标题默认为该值) 匿名表格单元格元素(元素的 display 为 table、table-row、 table-row-group、table-header- group、table-footer-group(分别是 HTML table、row、tbody、thead、tfoot 的默认属性)或 inline-table) overflow 值不为 visible 的块元素 -弹性元素(display 为 flex 或 inline-flex 元素的直接子元素) 网格元素(display 为 grid 或 inline-grid 元素的直接子元素) 等等。

BFC 渲染规则 (1)BFC 垂直方向边距重叠 (2)BFC 的区域不会与浮动元素的 box 重叠 (3)BFC 是一个独立的容器,外面的元素不会影响里面的元素 (4)计算 BFC 高度的时候浮动元素也会参与计算

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情