本篇内容为准备面试所写,其中所有皆为参考其他面筋而来;主要是好记性不如难笔头,过下手加深印象。
盒模型
- CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:外边距(
margin
)、边框(border
)、内边距(padding
)、实际内容(content
)四个属性。 - CSS盒模型:标准模型 + IE模型
- 标准盒子模型:宽度=内容的宽度(content)+ border + padding
- 低版本IE盒子模型:宽度=内容宽度(content+border+padding),如何设置成 IE 盒子模型:
{
box-sizing: border-box;
}
BFC
BFC(Block Formatting Context)格式化上下文,是 Web 页面中盒模型布局的 CSS 渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器。
形成 BFC 的条件:
参考 谈谈你对BFC的理解?
- 浮动元素,float 除 none 以外的值
- 定位元素,position(absolute,fixed)
- display 为以下其中之一的值 inline-block,table-cell,table-caption
- overflow 除了 visible 以外的值(hidden,auto,scroll)
- HTML 就是一个 BFC
BFC 的特性:
- 内部的 Box 会在垂直方向上一个接一个的放置。
- 垂直方向上的距离由 margin 决定
- bfc 的区域不会与 float 的元素区域重叠。
- 计算 bfc 的高度时,浮动元素也参与计算
- bfc 就是页面上的一个独立容器,容器里面的子元素不会影响外面元素。
浮动
参考 全面了解CSS“浮动”
清除浮动
不清除浮动会发生高度塌陷:浮动元素父元素高度自适应(父元素不写高度时,子元素写了浮动后,父元素会发生高度塌陷)
- clear清除浮动(添加空div法)在浮动元素下方添加空div,并给该元素写css样式:
{
clear: both;
height: 0;
overflow: hidden;
}
- 给浮动元素父级设置高度
- 父级同时浮动(需要给父级同级元素添加浮动)
- 父级设置成inline-block,其margin: 0 auto居中方式失效
- 给父级添加overflow:hidden 清除浮动方法
- 万能清除法 after伪类 清浮动(现在主流方法,推荐使用)
:after {
content:'';
clear: both;
display: block;
}
CSS 的权重和优先级
- 权重
从0开始,一个行内样式+1000,一个id选择器+100,一个属性选择器、class或者伪类+10,一个元素选择器,或者伪元素+1,通配符+0
- 优先级
权重相同,写在后面的覆盖前面的 使用 !important 达到最大优先级,都使用 !important 时,权重大的优先级高
div 高度永远是宽度的一半
// padding的 % 是基于父元素的宽度的百分比的内边距
.outer {
width: 400px;
height: 600px;
}
.inner {
width: 100%;
padding-bottom: 50%;
}
<div class="outer">
<div class="inner">
</div>
</div>
Flex 布局
- 阮一峰Flex 布局教程:语法篇
- 容器的属性
flex-direction
flex-wrap
flex-flow
justify-content
align-items
align-content
- 项目属性
order
flex-grow 放大比例,默认为0,即如果存在剩余空间,也不放大。按比例分配空间,也可以是小数但不能是负数。
flex-shrink 缩小比例,默认为1,即如果空间不足,该项目将缩小。空间不足时(比如父1000px,4个子每个300px),值都相同则等比缩小,否则按比例缩小,值为0的不缩小。
flex-basis 默认值为auto,可以是100px之类的固定占据空间大小。
flex
align-self
* flex
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
flex横向滚动条 flex-shrink: 0;
css2实现水平垂直居中
已知宽高,进行水平垂直居中
.outer {
position: relative;
width: 200px;
height: 200px;
}
.inner {
position: absolute;
width: 100px;
height: 100px;
left: 50%;
top: 50%;
margin: -50px 0 0 -50px;
}
<div class="outer">
<div class="inner"></div>
</div>
宽高未知,比如 内联元素,进行水平垂直居中
.outer {
width: 400px;
height: 600px;
position: relative;
}
.inner {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
<div class="outer">
<span class="inner">居中显示</span>
</div>
绝对定位的 div 水平垂直居中
.outer {
width: 200px;
height: 200px;
position: relative;
}
.inner {
position: absolute;
left: 0;
right: 0;
bottom: 0;
top: 0;
width: 100px;
height: 100px;
margin: auto;
}
<div class="outer">
<div class="inner"></div>
</div>
css3 垂直、水平居中
.outer {
width: 200px;
height: 200px;
display: flex;
justify-content: center;
}
visibility 和 display 还有 opacity 的区别
- visibility 设置 hidden 会隐藏元素,但是其位置还存在与页面文档流中,不会被删除,所以会触发浏览器渲染引擎的
重绘
- display 设置了 none 属性会隐藏元素,且其位置也不会被保留下来,所以会触发浏览器渲染引擎的
回流和重绘
。 - opacity 会将元素设置为透明,但是其位置也在页面文档流中,不会被删除,所以会触发浏览器渲染引擎的
重绘
两栏布局
参考
左float:left + 右margin-left(右边自适应)
<style>
div {
height: 200px;
}
.left {
width: 300px;
float: left;
background: yellow;
}
.right {
margin-left: 300px;
background: red;
}
</style>
BFC + float
<style>
div {
height: 200px;
}
.left {
width: 300px;
float: left;
background: yellow;
}
.right {
overflow: hidden;
background: red;
}
</style>
float + 负margin
<style>
div {
height: 200px;
}
.left {
width: 200px;
float: left;
background: yellow;
}
.right {
width: 100%;
float: left;
margin-right: -200px;
background: red;
}
</style>
flex
<style>
div {
height: 200px;
}
.container {
display: flex;
}
.left {
width: 200px;
background: yellow;
}
.right {
flex: 1;
background: red;
}
</style>
position + margin
<style>
div {
height: 200px;
}
.container {
position: relative;
}
.left {
width: 200px;
position: absolute;
background: yellow;
}
.right {
width: 100%;
margin-left: 200px;
background: red;
}
</style>
三列布局
参考
position + margin-left + margin-right
<style>
div {
height: 200px;
}
.container {
position: relative;
}
.left {
position: absolute;
left: 0;
top: 0;
width: 200px;
background: yellow;
}
.right {
position: absolute;
right: 0;
top: 0;
width: 200px;
background: red;
}
.middle {
margin-left: 200px;
margin-right: 200px;
background: hotpink;
}
</style>
flex
<style>
div {
height: 200px;
}
.container {
display: flex;
}
.left {
flex: 0 0 200px;
order: 1;
background: yellow;
}
.right {
flex: 0 0 300px;
order: 3;
background: red;
}
.middle {
flex: 1 1;
order: 2;
background: hotpink;
}
</style>
圣杯布局
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>圣杯布局</title>
<style>
div {
height: 200px;
}
.container {
padding: 0 200px 0 200px;
/* BFC 让浮动元素也参与高度计算 */
overflow: hidden;
}
.left,
.middle,
.right {
position: relative;
float: left;
}
.left {
/* middle占据了100%宽度,-100%就能让left移动到左侧起始位置 */
margin-left: -100%;
/* 父元素设置了padding */
left: -200px;
width: 200px;
background-color: yellow;
}
.right {
margin-left: -200px;
right: -200px;
width: 200px;
background-color: red;
}
.middle {
width: 100%;
background-color: hotpink;
}
</style>
</head>
<body>
<div class="container">
<div class="middle"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body>
</html>
双飞翼布局
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>双飞翼布局</title>
<style>
div {
height: 200px;
}
.container {
overflow: hidden;
}
.left,
.middle,
.right {
float: left;
}
.left {
margin-left: -100%;
width: 200px;
background-color: yellow;
}
.right {
margin-left: -220px;
width: 220px;
background-color: red;
}
.middle {
width: 100%;
background-color: hotpink;
}
</style>
</head>
<body>
<div class="container">
<div class="middle"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body>
</html>
实现自适应正方形、等宽高比矩形
css 动画
- animation:用于设置动画属性,他是一个简写的属性,包含6个属性
- transition:用于设置元素的样式过度,和animation有着类似的效果,但细节上有很大的不同
- transform:用于元素进行旋转、缩放、移动或倾斜,和设置样式的动画并没有什么关系
- translate:translate只是transform的一个属性值,即移动,除此之外还有 scale 等
1px 边框解决方案
.scale-1px-bottom {
position: relative;
border:none;
}
.scale-1px-bottom::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
background: #000;
width: 100%;
height: 1px;
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
-webkit-transform-origin: 0 0;
transform-origin: 0 0;
}
长文本处理
- 默认:字符太长溢出了容器
- 字符超出部分自动换行
.wrap {
overflow-wrap: break-word;
}
- 单行溢出省略
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
- 多行溢出省略
.line-clamp {
overflow : hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
文档流
在 CSS 的世界中,会把内容按照从左到右、从上到下的顺序进行排列显示。正常情况下会把页面分割成一行一行的显示,而每行又可能由多列组成,所以从视觉上看起来就是从上到下从左到右,而这就是 CSS 中的流式布局,又叫文档流。 文档流就像水一样,能够自适应所在的容器。
- 块级元素默认会占满整行,所以多个块级盒子之间是从上到下排列的;
- 内联元素默认会在一行里一列一列的排布,当一行放不下的时候,会自动切换到下一行继续按照列排布;
如何脱离文档流呢?
脱流文档流指节点脱流正常文档流后,在正常文档流中的其他节点将忽略该节点并填补其原先空间。文档一旦脱流,计算其父节点高度时不会将其高度纳入,脱流节点不占据空间。
- 使用浮动(float)会将元素脱离文档流,移动到容器左/右侧边界或者是另一个浮动元素旁边,该浮动元素之前占用的空间将被别的元素填补,另外浮动之后所占用的区域不会和别的元素之间发生重叠;
- 使用绝对定位(position: absolute;)或者固定定位(position: fixed;)也会使得元素脱离文档流,且空出来的位置将自动被后续节点填补。
伪类和伪元素
伪类和伪元素是用来修饰不在文档树中的部分
- 伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以通过:hover来描述这个元素的状态。虽然它和普通的css类相似,可以为已有的元素添加样式,但是它只有处于dom树无法描述的状态下才能为元素添加样式,所以将其称为伪类。
- 伪元素用于创建一些不在文档树中的元素,并为其添加样式。比如说,我们可以通过::before来在一个元素前增加一些文本,并为这些文本添加样式。虽然用户可以看到这些文本,但是这些文本实际上不在文档树中。
区别
伪类的操作对象是文档树中已有的元素,而伪元素则创建了一个文档树外的元素。因此,伪类与伪元素的区别在于:有没有创建一个文档树之外的元素。
CSS3规范中的要求使用双冒号(::)表示伪元素,以此来区分伪元素和伪类,比如::before和::after等伪元素使用双冒号(::),:hover和:active等伪类使用单冒号(:)。
层叠上下文
层叠准则
- 谁大谁上:当具有明显的层叠水平标示的时候,如识别的z-indx值,在同一个层叠上下文领域,层叠水平值大的那一个覆盖小的那一个。
- 后来居上:当元素的层叠水平一致、层叠顺序相同的时候,在DOM流中处于后面的元素会覆盖前面的元素。
position有哪些属性?
- static:无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用。
- relative:对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。而其层叠通过z-index属性定义。
- absolute:对象脱离正常文档流,使用top,right,bottom,left等属性进行绝对定位。而其层叠通过z-index属性定义。
- fixed:对象脱离正常文档流,使用top,right,bottom,left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。而其层叠通过z-index属性定义。
- sticky:具体是类似 relative 和 fixed,在 viewport 视口滚动到阈值之前应用 relative,滚动到阈值之后应用 fixed 布局,由 top 决定。
重绘 和 重排(回流)
重绘不一定导致重排,但重排一定会导致重绘
重绘:元素的外观被改变所触发的浏览器行为(颜色)
重排:重新生成布局,重新排列元素(宽高和位置)
优化:1.脱离文档流,使用 absolute 或 fixed 脱离文档流(减小重排范围
)2.样式集中改变,减少单个css属性操作改为直接添加一个className(减少重排次数
)
参考