汇总 CSS 中的高频面试题,以及一些常见的 CSS 知识点。
所有 HTML 元素都可以视为一个盒子,该盒子包括:边距(margin)、边框(border)、填充(padding)和实际内容(content)
差异:宽高计算方式不同
-
标准模型:计算元素的宽高只算 content 的宽高
-
IE 模型:计算元素的宽高包含 content 、padding、border
div {
// 设置标准模型
box-sizing: content-box;
// 设置IE模型
box-sizing: border-box;
}
box-sizing 的默认值是 content-box
假设已经获取节点 dom
// 只能获取内联样式设置的宽高
dom.style.width / height;
// 获取渲染后即使运行的宽高,只支持IE
dom.currentStyle.width / height;
// 获取渲染后即时运行的宽高,兼容性很好
dom.getComputedStyle.width / height;
// 获取渲染后即使运行的宽高,兼容性很好,一般用来获取元素的绝对位置
dom.getBoundingClientRect().width / height;
!important
- 内联样式(1000)
- ID 选择器(0100)
- 类选择器 / 属性选择器 / 伪类选择器(0010)
- 元素选择器 / 关系选择器 / 伪元素选择器(0001)
- 通配选择器(0000)
- link 是从 html 引入的,@import 是从 css 引入的
- link 会在浏览器加载页面是同步加载 css;页面加载完成后再加载 @import 的 css
- 优先级 link > @import
- @import 是 css2.1 加入的语法,只有 IE5+ 才可识别,link 无兼容问题
伪类用于当已有元素处于某种状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。
比如:
- hover
- visited
- link
等等。
伪元素用于创建一些不在文档树中的元素,并为其添加样式。
比如::before
来为一个元素前增加一些文本,并为这些文本增加样式。用户虽然可以看到这些文本,但是这些文本实际并不在文档树中。
伪类的操作对象时文档树中已有的元素,而伪元素则创建一个文档树以外的元素。因此他们之间的区别在于:有没有创建一个文档树之外的元素。
CSS3 规范中要求使用双冒号(::) 表示伪元素,单冒号(:) 表示伪类
左边定宽,右边自适应方案:
- float + margin
- float + calc
/* 方案1 */
.left {
width: 120px;
float: left;
}
.right {
margin-left: 120px;
} /* 方案2 */
.left {
width: 120px;
float: left;
}
.right {
width: calc(100% - 120px);
float: left;
}
左右两边定宽, 中间自适应:
- float
- float + calc
- 圣杯布局 (设置 BFC , margin 负值法)
- flex
.wrap {
width: 100%;
height: 200px;
}
.wrap > div {
height: 100%;
}
/* 方案1 */
.left {
width: 120px;
float: left;
}
.right {
float: right;
width: 120px;
}
.center {
margin: 0 120px;
}
/* 方案2 */
.left {
width: 120px;
float: left;
}
.right {
float: right;
width: 120px;
}
.center {
width: calc(100% - 240px);
margin-left: 120px;
}
/* 方案3 */
.wrap {
display: flex;
}
.left {
width: 120px;
}
.right {
width: 120px;
}
.center {
flex: 1;
}
- 定高: margin , position + margin (负值)
- 不定高: position + transform , flex , IFC + vertical-align:middle
/* 定高方案1 */
.center {
height: 100px;
margin: 50px 0;
}
/* 定高方案2 */
.center {
height: 100px;
position: absolute;
top: 50%;
margin-top: -25px;
}
/* 不定高方案1 */
.center {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
/* 不定高方案2 */
.wrap {
display: flex;
align-items: center;
}
.center {
width: 100%;
}
/* 不定高方案3 */
/* 设置 inline-block 则会在外层产生 IFC, 高度设为 100% 撑开 wrap 的高度 */
.wrap::before {
content: "";
height: 100%;
display: inline-block;
vertical-align: middle;
}
.wrap {
text-align: center;
}
.center {
display: inline-block;
vertical-align: middle;
}