海边的小溪鱼

vuePress-theme-reco 海边的小溪鱼    2017 - 2023
海边的小溪鱼 海边的小溪鱼

Choose mode

  • dark
  • auto
  • light
首页
分类
  • CSS
  • HTTP
  • Axios
  • jQuery
  • NodeJS
  • JavaScript
  • Vue2
  • Server
  • Vue3
标签
时间轴
更多
  • Gitee (opens new window)
Getee (opens new window)
author-avatar

海边的小溪鱼

28

文章

14

标签

首页
分类
  • CSS
  • HTTP
  • Axios
  • jQuery
  • NodeJS
  • JavaScript
  • Vue2
  • Server
  • Vue3
标签
时间轴
更多
  • Gitee (opens new window)
Getee (opens new window)

CSS 常见面试题

vuePress-theme-reco 海边的小溪鱼    2017 - 2023

CSS 常见面试题

海边的小溪鱼 2021-06-27 CSS

带着问题学习或准备面试。

# CSS常见面试题

  • 1. 盒模型:标准盒子 与 IE怪异盒子
  • 2. CSS 高度塌陷 和 清除浮动的方法(BFC机制)
  • 3. 使用 CSS 实现三角形(如:倒三角)
  • 4. 保持宽高比例(如:高度为宽度的50%)

# 1. 盒模型:标准盒子 与 IE怪异盒子

CSS盒子模型组成部分:content(内容) + padding(内边距) + border(边框) + margin(外边距)
CSS盒模型主要分为两种:W3C标准盒模型 与 IE盒模型, 它们的宽高的计算方式分别如下

重要:当您指定一个 CSS 元素的宽度和高度属性时,只是设置 content(内容区域) 的宽度和高度
css盒子模型中,盒子的实际高度和宽度是否包含 margin ?
根据下面的原型图可以看到,实线以内是盒子的实际大小,故不包含 margin(但是也有人说 margin 算作宽高,因为它占用了像素,很多教程都说宽高包含margin)

# W3C 标准盒模型(标准盒)

W3C 标准盒模型(标准盒):width 和 height 属性,只包含 content(内容),不包含 padding 和 border。

width = content(元素内容宽度)
height = content(元素内容高度)
标准盒子模型(盒子实际宽度)= margin + border + padding + content ( content = width )
注意:标准盒子模型,border 和 padding 不会影响 元素内容(content) 的大小,但是会影响盒子的总尺寸

实际效果图 原型图
avatar avatar
盒子实际宽度 = margin + border + padding + content = 220 content(元素内容宽度) = width = 100
.box {
  /* 元素内容宽度(content) = width = 100px */
  width: 100px; /* 宽:不包含 padding 和 border 在内 */
  height: 100px; /* 高:不包含 padding 和 border 在内 */
  padding: 20px; /* 内边距 */
  border: 20px solid blue; /* 边框 */
  margin: 20px; /* 外边距 */
  background-color: red;
}
1
2
3
4
5
6
7
8
9

# IE 盒模型(怪异盒):IE8及以下版本浏览器,未声明 doctype 情况下

IE 盒模型(怪异盒):width 和 height 属性,包含 content + padding + border

width = border + padding + content(元素内容宽度)
height = border + padding + content(元素内容高度)
IE盒子模型(实际总宽度)= margin + width(width = border + padding + content )
注意:IE盒子模型,border 和 padding 会影响 元素内容(content) 的大小,但是不会影响盒子的总尺寸

实际效果图 原型图
avatar avatar
盒子实际宽度 = margin + width = 140 content(元素内容宽度) = width - padding - border = 20
.box {
  /* 元素内容宽度(content) = width - padding - border = 100 - 40 - 40 = 20px */
  width: 100px; /* 宽:包含 padding 和 border 在内,一共100px */
  height: 100px; /* 高:包含 padding 和 border 在内,一共100px */
  padding: 20px; /* 内边距 */
  border: 20px solid blue; /* 边框 */
  margin: 20px; /* 外边距 */
  background-color: red;
  /* box-sizing 属性:默认值是 content-box */
  /* box-sizing 作用:转化盒模型 */
  box-sizing: border-box; /* 转化为 IE 盒子(怪异盒) */
}
1
2
3
4
5
6
7
8
9
10
11
12

# 2. CSS 高度塌陷 和 清除浮动的方法(BFC机制)

# 什么是高度塌陷?

首先了解一下什么是浮动?
添加了浮动(float)的盒子,会脱离标准文档流(会浮起来),原来的位置不再保留;
那么下面标准流的盒子,就会向上移动,从而导致,浮动的盒子会压住这个标准流的盒子(被浮动的盒子遮盖住)
1. 产生高度塌陷的原因
在文档流中,父元素的高度默认是由子元素撑开的,等于说子元素多高,父元素就多高,但是当为子元素设置了浮动之后,子元素会脱离标准流,此时,将会导致子元素无法撑起父元素的高度,会导致父元素的高度塌陷。
简而言之:父元素不写高度时,子元素写了浮动后,父元素会发生高度塌陷(造成父元素高度为 0)
2. 高度塌陷带来的影响
会使父元素的兄弟元素都想上移动,会使页面布局变化,影响原来的布局
3. 解决高度塌陷的问题
清除浮动,可以解决高度塌陷的问题:因为产生高度塌陷的原因是浮动产生的

<html>
<body>
    <div class="father">
        <div class="son"></div>
    </div>
    <div class="box"></div>
</body>

<style>
    .father {
        width: 100px;
        /* 1. 在标准文档流中,父元素默认高度是由子元素撑开的,等于说子元素多高,父元素就多高 */
    }
    .son {
        width: 100px;
        height: 100px;
        background-color: green;
        /* 2. 当子元素写了浮动后,子元素会脱离文档流,此时,将会导致子元素无法撑起父元素的高度,
	父元素会发生高度塌陷(造成父元素高度为 0) */
        float: left;
    }
    .box {
        /* 3. 高度塌陷带来的影响: 会使父元素的兄弟元素都想上移动,会使页面布局变化,影响原来的布局 */
        width: 100px;
        height: 100px;
        background-color: red;
    }
</style>
</html>
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

# 清除浮动的几种方式

方法1:给父元素设置宽高(不推荐,这样设置父元素的高度不会适应子元素的高度)
方法2:给父元素添加 overflow: hidden(不推荐)
方法3:在浮动元素下方添加空div,并添加 clear:both 属性样式(不推荐,会造成大量的代码冗余)

<body>
    <div class="father">
        <div class="son1">浮动的盒子</div>
        <!-- 额外标签法(隔墙法):在浮动的盒子下面,添加空的 div 元素 -->
        <div style="clear: both;"></div>
    </div>
    <div class="box"></div>
</body>
1
2
3
4
5
6
7
8

方法4:给父元素添加 :after 伪类(隔墙法升级版,百度/淘宝/网易等用的方法)

<body>
    <div class="father clearfix">
        <div class="son"></div>
    </div>
    <div class="box"></div>
</body>
<style>
/* 给父元素添加 after 伪类(隔墙法升级版,百度/淘宝/网易等用的方法) */
.father:after {
    content: "";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}
.clearfix {
    *zoom: 1;  /* IE6、7 清除浮动的方式,*号表示只在IE6-7执行,其他浏览器不执行 */
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

方法5:给父元素添加双伪元素(小米/腾讯用的方法)

<body>
    <div class="father clearfix">
        <div class="son"></div>
    </div>
    <div class="box"></div>
</body>
<style>
/* 给 父元素 添加双伪元素(小米/腾讯用的方法) */
.clearfix:before, .clearfix:after {
    content: "";
    display: table;
}
.clearfix:after {
    clear: both;
}
.clearfix {
    *zoom: 1; /* IE6、7 清除浮动的方式,*号表示只在IE6-7执行,其他浏览器不执行 */
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 3. 使用 CSS 实现三角形(如:倒三角)

<html>

<body>
    <div class="triangle"></div>
</body>
<style>
    .triangle {
        width: 0;
        height: 0;
        border: 100px solid transparent; /* 边框透明 */
        border-top-color: red; /* Top: 实现倒三角 */
    }
</style>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 4. 保持宽高比例(如:高度为宽度的50%)

方法一

:root 是一个伪类选择器,表示文档根元素,所有主流浏览器均支持(除了 IE8 及更早的版本)
:root 的作用:声明全局属性,在当前页面可以使用 var() 来引用

<html>

<body>
    <div class="box"></div>
</body>
<style>
    :root {
        --my-width: 200px;
        --my-height: calc(var(--my-width) / 2); /* 高度为宽度的50% */
    }
    .box {
        width: var(--my-width);
        height: var(--my-height);
        background-color: pink;
    }
</style>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

方法二

使用 width: 100%; + padding-bottom: 60%; 来实现

<html>

<body>
    <div class="father">
        <div class="son"></div>
        <span>此处应该有文字</span>
    </div>
</body>
<style>
    .father {
        width: 100px;
        padding: 20px 30px; /* 无关样式 */
        background-color: red;
    }
    .son {
        width: 100%;/* 和父元素宽度一样 */
        padding-bottom: 60%; /* 高度为宽度的60% */
        background-color: green;
    }
</style>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
帮助我们改善此页面! (opens new window)