重学前端,温故知新 🤔🤔🤔
# 1.小知识点
- 在head中可以出现任意多个meta标签。一般的meta标签由name和content两个属性来定义。name表示元信息的名,content则用于表示元信息的值。
- 浏览器实际的实现中会把阴影作为一个独立的盒来处理。
- 把宿主发起的任务称为宏观任务,把JavaScript引擎发起的任务称为微观任务。许多的微观任务的队列组成了宏观任务。
- 语义上void运算表示忽略后面表达式的值,变成undefined
- javascript引擎在解释代码时对于“1.toString()”认为“.”是浮点符号,但因小数点后面的字符是非法的,所以报语法错误;1.2.toString()就不会报错
# 2.CSS
CSS支持一批特定的计算型函数:
- calc() 加减乘除四则运算。在针对维度进行计算时,calc()函数允许不同单位混合运算
- max()
- min()
- clamp() 是给一个值限定一个范围,超出范围外则使用范围的最大或者最小值。
- toggle() 在规则选中多于一个元素时生效,它会在几个值之间来回切换
- attr()
section {
float: left;
margin: 1em; border: solid 1px;
width: calc(100%/3 - 2*1em - 2*1px);
}
# css的渲染过程:
流式渲染,每生成一个dom节点,便立刻去匹配相应的css规则
dom节点的生成顺序是 从父-> 子。 css的渲染顺序也是 从 父节点-》子节点
# 伪元素
目前兼容性达到可用的伪元素有以下几种。 ::first-line 第一行 ::first-letter 第一个字母 ::before 元素内容之前插入一个虚拟的元素 ::after 之后
# css动画
# animation的基本用法
@keyframes mykf
{
from {background: red;}
to {background: yellow;}
}
div
{
animation:mykf 5s infinite;
}
- animation-name 动画的名称,这是一个keyframes类型的值(我们在第9讲“CSS语法:除了属性和选择器,你还需要知道这些带@的规则”讲到过,keyframes产生一种数据,用于定义动画关键帧);
- animation-duration 动画的时长;
- animation-timing-function 动画的时间曲线;
- animation-delay 动画开始前的延迟;
- animation-iteration-count 动画的播放次数;
- animation-direction 动画的方向。
# 3.浏览器
从HTTP请求回来,就产生了流式的数据,后续的DOM树构建、CSS计算、渲染、合成、绘制,都是尽可能地流式处理前一步的产出:即不需要等到上一步骤完全结束,就开始处理上一步的输出,这样我们在浏览网页时,才会看到逐步出现的页面。
3xx系列比较复杂,301和302两个状态表示当前资源已经被转移,只不过一个是永久性转移,一个是临时性转移。实际上301更接近于一种报错,提示客户端下次别来了。
304又是一个每个前端必知必会的状态,产生这个状态的前提是:客户端本地已经有缓存的版本,并且在Request中告诉了服务端,当服务端通过时间或者tag,发现没有更新的时候,就会返回一个不含body的304状态。
# DOM
一一对应:
Element: <tagname>...</tagname>
Text: text
Comment: <!-- comments -->
DocumentType: <!Doctype html>
ProcessingInstruction: <?a 1?>
我们可以把元素的Attribute当作字符串来看待,这样就有以下的API:
- getAttribute
- setAttribute
- removeAttribute
- hasAttribute
document节点提供了查找元素的能力。比如有下面的几种。
- querySelector
- querySelectorAll
- getElementById
- getElementsByName
- getElementsByTagName
- getElementsByClassName
# 4.CSSDOM
document.styleSheets 获取文档中所有样式表
# 窗口 API
窗口API用于操作浏览器窗口的位置、尺寸等。
- moveTo(x, y) 窗口移动到屏幕的特定坐标;
- moveBy(x, y) 窗口移动特定距离;
- resizeTo(x, y) 改变窗口大小到特定尺寸;
- resizeBy(x, y) 改变窗口大小特定尺寸。
# 视口滚动API
可视区域(视口)滚动行为由window对象上的一组API控制,我们先来了解一下:
- scrollX 是视口的属性,表示X方向上的当前滚动距离,有别名 pageXOffset;
- scrollY 是视口的属性,表示Y方向上的当前滚动距离,有别名 pageYOffset;
- scroll(x, y) 使得页面滚动到特定的位置,有别名scrollTo,支持传入配置型参数 {top, left};
- scrollBy(x, y) 使得页面滚动特定的距离,支持传入配置型参数 {top, left}。 通过这些属性和方法,我们可以读取视口的滚动位置和操纵视口滚动。不过,要想监听视口滚动事件,我们需要在document对象上绑定事件监听函数:
document.addEventListener("scroll", function(event){
//......
})
# 全局尺寸信息
我们主要使用的是innerHeight、innerWidth和devicePixelRatio三个属性,因为我们前端开发工作只需要跟视口打交道,其它信息大概了解即可
获取盒子布局信息
- getClientRects();
- getBoundingClientRect()。
# 简单的编译原理
- 定义四则运算:产出四则运算的词法定义和语法定义。
- 词法分析:把输入的字符串流变成token。
- 语法分析:把token变成抽象语法树AST。
- 解释执行:后序遍历AST,执行得出结果。