0%

CSS灵魂十问

CSS 选择器优先级是怎样计算的?

!important > 内联元素(style 设置) > id 选择器 > class 选择器 = 伪类(:hover :active) = 属性选择器 > 标签选择器 = 伪元素(::before ::after) > 继承样式

权重计算如下:
千位:如果声明在 style 的属性则该位得一分。
百位:选择器中包含 ID 选择器则该位得一分。
十位:选择器中包含类选择器、属性选择器或者伪类则该位得一分。
个位:选择器中包含标签选择器、伪元素选择器则该位得一分。
比如 #header p.content.active 得分为 0121。.header p.active::before 的权重是 0022。前者权重大于后者。

注意:
权重相同,后者覆盖前者。
继承样式,父级样式 > 祖父级样式。

一侧定宽、一侧自适应,尽量多的方案实现?

1.flex 布局

对 flex 布局不太熟悉的朋友可以参考这篇文章:Flex 布局教程

1
2
3
4
<div class="parent">
<div class="aside">我是定宽</div>
<div class="main">我是自适应</div>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.parent {
display: flex;
height: 200px;
width: 100%;
}

.aside {
width: 100px;
border: 1px solid red;
}

.main {
flex: 1;
border: 1px solid green;
}

手动尝试一下

2.grid 布局(有兼容性问题)

对 gird 布局不太熟悉的朋友可以参考这篇文章:CSS Grid 网格布局教程

1
2
3
4
<div class="parent">
<div class="aside">我是定宽</div>
<div class="main">我是自适应</div>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
.parent {
display: grid;
grid-template-columns: 100px 1fr;
grid-template-rows: 200px;
}

.aside {
border: 1px solid red;
}

.main {
border: 1px solid blue;
}

手动尝试一下

3.传统布局

1
2
3
4
<div class="parent">
<div class="child aside">我是定宽</div>
<div class="child main">我是自适应</div>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.parent::after {
content: "";
display: table;
clear: both;
}

.child {
height: 200px;
}

.aside {
float: left;
width: 100px;
border: 1px solid red;
}

.main {
margin-left: 100px;
border: 1px solid blue;
}

手动尝试一下

4.圣杯布局

1
2
3
4
<div class="parent">
<div class="main">我是自适应</div> // 自适应div放在定宽div之上
<div class="aside">我是定宽</div>
</div>
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
32
33
34
.parent {
box-sizing: border-box;
padding-left: 100px;
}

.parent::after {
content: "";
display: block;
clear: both;
}

.main {
box-sizing: border-box;
border: 1px solid blue;
width: 100%;
}

.aside {
box-sizing: border-box;
width: 100px;
}

.main,
.aside {
float: left;
height: 200px;
}

.aside {
position: relative;
left: -100px;
margin-left: -100%;
border: 1px solid pink;
}

手动尝试一下

5.双飞翼布局

1
2
3
4
5
6
<div class="parent">
<div class="main">
<div class="wrap">我是自适应</div> // 自适应div放在定宽div之上,并且main加一层wrap
</div>
<div class="aside">我是定宽</div>
</div>
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
32
33
34
35
.parent {
box-sizing: border-box;
border: 1px solid red;
*zoom: 1;
}

.parent:after {
content: "";
display: block;
clear: both;
}

.main {
width: 100%;
}

.main .wrap {
margin-left: 100px;
}

.aside {
box-sizing: border-box;
width: 100px;
border: 1px solid green;
}

.main,
.aside {
float: left;
height: 100px;
}

.aside {
margin-left: -100%;
}

手动尝试一下

px、em、rem、vw、百分比的区别

  • px是固定单位,其他几种都是相对单位。当我们把电脑屏幕的分辨率调为1440*900时,css里设置的1px实际的物理尺寸就是屏幕宽度的1/1440。
  • em:默认字体大小的倍数。比如给元素设置font-size: 2em,这里的默认字体大小实际上是继承自父亲的大小,font-size: 2em表示当前元素字体大小是父亲的2倍。当给元素设置width: 2em,这里的默认字体大小是该元素自身的实际字体大小。
  • rem:根元素(html 节点)字体大小的倍数。比如一个元素设置 width: 2rem 表示该元素宽度为html节点的font-size 大小的2倍。如果html未设置font-size的大小,默认是16px。需要注意的是chrome浏览器下文字最小是12px,设置低于12px的值最终也会展示12px。
  • 1vw 代表浏览器视口宽度的1%。
  • 1% 对不同属性有不同的含义。font-size: 200% 和font-size: 2em 一样,表示字体大小是默认(继承自父亲)字体大小的2倍。line-height: 200% 表示行高是自己字体大小的2倍。width: 100%在标准盒模型下表示自己content的宽度等于父亲content的宽度,在IE盒模型下表示自己content+padding+border的宽度等于父亲content的宽度。