css

109 阅读3分钟

盒子模型

包括外边距(margin),内边距(padding),边框(border),内容(content)。

标准盒子模型 width/height = content。

IE盒子模型 width/height = content + padding + border。

box-sizing: content-box;  的 width 不包括 padding 和 border。

box-sizing: border-box; 的 width 包括 padding 和 border。

margin重叠

  • 水平边距永远不会重合
  • 2个或以上的块级盒模型相邻的垂直margin会重叠

防止外边距重叠解决方案:

外层元素padding代替

外层元素 overflow: hidden;

内层元素绝对定位 postion: absolute;

内层元素 加float: left; 或 display: inline-block;

内层元素透明边框 border: 1px solid transparent;

垂直水平居中的实现方式:

  • 父级设置text-align: centerline-height等同高度。

  • 子节点绝对定位,设置position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);

  • 子节点绝对定位,需要设置宽度和高度。设置position: absolute;top:0;left:0;right:0;bottom:0;margin:auto;

  • 父级设置display: table,子节点设置display:table-cell;text-align:center;vertical-align:middle;

  • 父级设置display: flex;justify-content:center;align-items:center;

  • 父节点设置display: grid;,子节点设置:align-self:center;justify-self: center;

html渲染过程

  1. HTML被HTML解析器解析成DOM Tree, CSS则被CSS解析器解析成CSSOM Tree。

  2. DOM Tree和CSSOM Tree解析完成后,被附加到一起,形成渲染树(Render Tree)。

  3. 节点信息计算(重排),即根据渲染树计算每个节点的几何信息(布局)。

  4. 渲染绘制(重绘),即根据计算好的信息绘制整个页面。

减少回流和重绘

  • 批量修改DOM或者样式

  • 不要在循环里读取节点的属性值

  • css3硬件加速(GPU加速)

  • 尽量使用visibility替代display:none

移动端1px问题

  1. dpr(设备像素比)动态计算 

  2. viewport + rem 实现;

  3. box-shadow模拟边框;

  4. 伪类 + transform:scaleY(0.5) 实现;

  5. 背景图

animation 和 transition 的区别

  • transition是过度属性,强调过度,他的实现需要触发一个事件(比如鼠标移动上去,焦点,点击等)才执行动画。它类似于flash的补间动画,设置一个开始关键帧,一个结束关键帧。

  • animation是动画属性,他的实现不需要触发事件,设定好时间之后可以自己执行,且可以循环一个动画。他也类似于flash的补间动画,但是他可以设置多个关键帧(用@keyframe定义)完成动画。

介绍下flex布局

Flex是Flexible Box的缩写,意为”弹性布局”,通过给父盒子添加flex属性,来控制子盒子的位置和排列方式。

主轴方向:水平排列(默认) | 水平反向排列 | 垂直排列 | 垂直反向排列

flex-direction: row | row-reverse | column | column-reverse;

换行:不换行(默认) | 换行 | 反向换行(第一行在最后面)

flex-wrap: nowrap | wrap | wrap-reverse;

flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap

flex-flow: || ;

主轴对齐方式:起点对齐(默认) | 终点对齐 | 居中对齐 | 两端对齐 | 分散对齐

justify-content: flex-start | flex-end | center | space-between | space-around;

侧轴对齐方式(单行) :拉伸对齐(默认) | 起点对齐 | 终点对齐 | 居中对齐 | 第一行文字的基线对齐

align-items: stretch | flex-start | flex-end | center | baseline;

侧轴线对齐方式(多行) :拉伸对齐(默认) | 起点对齐 | 终点对齐 | 居中对齐 | 两端对齐 | 分散对齐

align-content: stretch | flex-start | flex-end | center | space-between | space-around;

子项常见属性:

  • flex子项目占的分数
  • align-self控制子项自己在侧轴的排列方式
  • order 属性定义子项目的排列顺序(前端顺序)