PS:内容比较基础,目的只是覆盖面试知识点,大佬可以 history.back(-1)

W3C 标准盒模型 & IE 怪异盒模型

页面上显示的每个元素(包括内联元素)都可以看作一个盒子,即盒模型( box model )

盒模型由 4 部分组成,从内到外分别是:content padding border margin

W3C 标准盒模型一个元素的宽度(高度以此类推)应该这样计算:

1

2

3

一个元素的宽度 =  content

盒子总宽度 = margin-left + border-left + padding-left + width + padding-right + border-right + margin-right

而IE 怪异盒模型一个元素的宽度(高度以此类推)却是这样计算的:

1

2

3

一个元素的宽度 =  content + padding + border

盒子总宽度 = margin-left + width + margin-right

解决方案 box-sizing

1

2

3

4

5

// W3C 标准盒模型(浏览器默认)

box-sizing: content-box;

// IE 怪异盒模型

box-sizing: border-box;

当我们设置 box-sizing: border-box; 时,border 和 padding 就被包含在了宽高之内,和 IE 盒模型是一样的。

所以,为了避免你同一份 css 在不同浏览器下表现不同,最好加上:

1

2

3

4

5

*, *:before, *:after {

-moz-box-sizing: border-box;

-webkit-box-sizing: border-box;

box-sizing: border-box;

}

JS 如何获取盒模型对应的宽和高

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

<style>

* {

margin: 0;

padding: 0;

}

#box {

width: 100px;

height: 100px;

padding: 50px;

border: 5px solid red;

margin: 50px;

}

</style>

<div id="box" style=""></div>

<script>

let box = document.getElementById('box')

// 只能取到内联样式的宽高

console.log('style:' + box.style.width) // 100px

// 内联样式和外联样式的宽高都能取到,但只有 IE 支持

console.log('currentStyle:' + box.currentStyle.width) // 100px

// 内联样式和外联样式的宽高都能取到,几乎所有主流浏览器都支持

console.log('getComputedStyle:' + getComputedStyle(box).width) // 100px

// 内联样式和外联样式的宽高都能取到,几乎所有主流浏览器都支持,取到的是盒子总宽度

console.log('getBoundingClientRect:' + box.getBoundingClientRect().width) // 210

</script>

BFC

BFC:块级元素格式化上下文

IFC:内联元素格式化上下文(面试不常考)

BFC 原理

  1. 在 BFC 的垂直方向上,边距会发生重叠

  2. BFC 区域不会与 浮动区域重叠

  3. BFC 在页面上是一个独立的容器,与其他元素互不影响

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

如何创建 BFC

  1. float 值不为 none,只要设置了浮动,当前元素就创建了一个 BFC

  2. position值不为static,只要设置了定位,当前元素就创建了一个 BFC

  3. display 值不为默认,只要设置了display,当前元素就创建了一个 BFC

  4. overflow 值不为 visible,只要设置了overflow,当前元素就创建了一个 BFC

1

overflow: hidden;

BFC 使用场景

解决边距重叠问题

当元素都设置了 margin 边距时,margin 将取最大值。为了不让边距重叠,可以给子元素加一个父元素,并设置该父元素为 BFC

1

2

3

4

5

6

7

8

9

<div class="box" id="box">

<p>Lorem ipsum dolor sit.</p>

<div style="overflow: hidden;">

<p>Lorem ipsum dolor sit.</p>

</div>

<p>Lorem ipsum dolor sit.</p>

</div>

侵占浮动元素的位置

设置非浮动元素为 BFC 即可

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<style>

.one {

float: left;

width: 100px;

height: 100px;

background-color: pink;

}

.two {

height: 200px;

background-color: red;

/* 设置 BFC */

overflow: hidden;

}

</style>

<div class="one"></div>

<div class="two"></div>

清除浮动

BFC 原理第 4 条:计算 BFC 高度时,浮动元素也会参与计算

当然,清除浮动还有其他最佳实践,这里只是分析场景。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<style>

.one {

background-color: pink;

/* 设置 BFC */

overflow: hidden;

}

.two {

float: left;

}

</style>

<div class="one">

<div class="two">hello world</div>

</div>

CSS 盒模型、解决方案、BFC 原理讲解--摘抄的更多相关文章

  1. 十分钟复习CSS盒模型与BFC

    css盒模型与BFC 本文为收集整理总结网上资源 旨在系统复习css盒模型与bfc 节省复习时间 阅读10分钟 什么是盒模型 每一个文档中,每个元素都被表示为一个矩形的盒子,它都会具有内容区.padd ...

  2. css盒模型与bfc与布局与垂直水平居中与css设计模式等

    一.css盒子与布局相关 盒子内部的布局 盒子之间的布局visual formatting 脱离正常流normal flow的盒子的布局 absolute布局上下文下的布局 float布局上下文下的布 ...

  3. 前端面试必备技巧(二)css盒模型及BFC

    CSS盒模型 基本概念:标准模型+IE模型及区别 CSS如何设置这两种模型? JS如何设置获取盒模型对应的宽和高? 实例题(根据盒模型解释边距重叠) BFC边距重叠解决方案 (1)BFC的基本概念:b ...

  4. css盒模型-BFC

    BFC(边距重叠解决方案) 1.BFC的基本概念:块级格式化上下文 2.BFC的原理(说白了就是BFC的渲染规则): 这个规则是什么呢?我觉得大家能说出4点就够了 第一个就是BFC可以解决这个元素的垂 ...

  5. css盒模型:BFC、IFC边距重叠解决方案

    BFC:块级格式化上下文 IFC:行内格式化上下文 实例如下: <div class="out" style="background: red;"> ...

  6. 神奇的盒模型(BFC)

    上一篇我提到每一个元素都有自己的display属性,其属性值可以改变.其改变的方式,可以利用神奇的css盒模型(BFC). 盒模型,是css可视化格式化系统的基础,可以用于元素定位和网页布局.一个盒模 ...

  7. CSS盒模型的深度思考及BFC

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 题目:谈一谈你对CSS盒模型的认识 专业的面试,一定会问 CSS 盒模型 ...

  8. 面试 02-CSS盒模型及BFC

    02-CSS盒模型及BFC #题目:谈一谈你对CSS盒模型的认识 专业的面试,一定会问 CSS 盒模型.对于这个题目,我们要回答一下几个方面: (1)基本概念:content.padding.marg ...

  9. 面试汇总——说一下CSS盒模型

    本文是面试汇总分支——说一下CSS盒模型. 基本概念:W3C标准盒模型和IE盒模型 CSS如何设置这两种模型 JS如何获取盒模型对应的宽和高 根据盒模型解释边距重叠 BFC(边距重叠解决方案) 一. ...

随机推荐

  1. Bootstrap历练实例:标签修饰

    您可以使用修饰的 class label-default.label-primary.label-success.label-info.label-warning.label-danger 来改变标签 ...

  2. tcp 高性能服务, netty,mqtt

    1. io 线程不要有比较长的服务. 全部异步化. [1] netty 权威指南上只是说业务复杂时派发到业务线程池种. 共用的线程池最好都轻量. 多层线程池后, 下层的可以进行隔离. 这个是 mqtt ...

  3. SwaggerUI日常使用

    最近公司项目集成springFox,记录一些swaggerUI日常使用,包括数组,文件,默认值,允许值,参数/结果类注解,响应码..等等. 一.参数注解: 单参数:@ApiImplicitParam ...

  4. C#基础-数组-ArrayList

    数组ArrayList using System.Collections; //表示引入集合的命名空间 数组ArrayList容量本身是不固定的,根据存储的数据动态变化 // 声明一个ArrayLis ...

  5. 快速排序和快速选择(quickSort and quickSelect)算法

    排序算法:快速排序(quicksort)递归与非递归算法 TopK问题:快速选择(quickSelect)算法 import java.util.*; import java.lang.*; publ ...

  6. LeetCode(152) Maximum Product Subarray

    题目 Find the contiguous subarray within an array (containing at least one number) which has the large ...

  7. Divisibility by 25 CodeForces - 988E

    You are given an integer nn from 11 to 10181018 without leading zeroes. In one move you can swap any ...

  8. NOIP 2017 小凯的疑惑

    # NOIP 2017 小凯的疑惑 思路 a,b 互质 求最大不能表示出来的数k 则k与 a,b 互质 这里有一个结论:(网上有证明)不过我是打表找的规律 若 x,y(设x<y) 互质 则 : ...

  9. Java构造器(construtor)与垃圾收集器(GB)

    在Java中,程序员会在乎内存中的两块空间. 堆(heap)和栈(stack). 当java虚拟机启动时, 它会从底层的操作系统取得一块内存, 并且以此块内存来执行java程序. 在Java中, 实例 ...

  10. Python之多线程与多进程(一)

    多线程 多线程是程序在同样的上下文中同时运行多条线程的能力.这些线程共享同一个进程的资源,可以在并发模式(单核处理器)或并行模式(多核处理器)下执行多个任务 多线程有以下几个优点: 持续响应:在单线程 ...