一、border-box模式
offsetWidth = width
clientWidth = width - border - scrollBar
注:
- Width:盒子css属性定义的宽度
- Border:盒子边框的大小
- scrollBar:盒子滚动条的宽度,默认17px
信息流页面是从上往下push渲染的。开始只有头部一些信息加载,此时页面高度有限,没有滚动条;然后,更多内容显示,滚动条出现,占据可用宽度,margin: 0 auto主体元素自然会做偏移——跳动产生。
1 | .wrap-outer { |
100vw相对于浏览器的window.innerWidth,是浏览器的内部宽度,注意,滚动条宽度也计算在内!
100%是可用宽度,是不含滚动条的宽度。
1 | .wrap-outer { |
由 ECMA-262 定义的 ECMAScript 与 Web 浏览器没有依赖关系。实际上,这门语言本身并不包含输 入和输出定义。ECMA-262 定义的只是这门语言的基础,而在此基础之上可以构建更完善的脚本语言。
ECMAScript规定了这 门语言的下列组成部分:
ECMAScript 就是对实现该标准规定的各个方面内容的语言的描述。JavaScript 实现了 ECMAScript, Adobe ActionScript 同样也实现了 ECMAScript。
我们常见的 Web 浏览器只是 ECMAScript 实现可能的宿主环境之一。宿主环境不仅提供基本的 ECMAScript 实现,同时也会提供该语言的扩展,以便语言与环境之间对接交互。而这些扩展——如 DOM,则利用 ECMAScript 的核心类型和语法提供更多更具体的功能,以便实现针对环境的操作。其他 宿主环境包括 Node(一种服务端 JavaScript 平台)和 Adobe Flash。
一个完整的 JavaScript 实现应该由下列三 个不同的部分组成
每一个执行环境都关联了一个变量对象(variable Object)或者活动对象(activation object)。环境中定义的所有变量和函数都保存在这个对象中。每个函数运行时都会产生一个执行环境。活动对象是一种特殊的变量对象。
全局执行环境关联的是变量对象,函数执行环境关联的是活动对象。可以将执行环境看作是一个对象:
1 | EC = { |
当一个函数被调用时,函数执行环境就被压入一个环境栈中。而在函数执行之后,栈将该函数执行环境弹出,把控制权交给之前的执行环境。 举个例子:
1 | let scope = "global"; |
上面代码执行情况演示:
当某个函数第一次被调用时,就会创建一个执行环境(execution context)以及相应的作用域链,并把作用域链赋值给一个特殊的内部属性([scope])。然后使用this,arguments和其他命名参数的值来初始化函数的活动对象(activation object)。当前执行环境的变量对象始终在作用域链的第0位。
以上面的代码为例,当第一次调用fn1()时的作用域链如下图所示:
(因为fn2()还没有被调用,所以没有fn2的执行环境)
可以看到fn1活动对象里并没有scope变量,于是沿着作用域链(scope chain)向后寻找,结果在全局变量对象里找到了scope,所以就返回全局变量对象里的scope值。
1 | window.onerror = function(message, source, lineno, colno, error) { ... } |
函数参数:
若该函数返回true,则阻止执行默认事件处理函数。
1 | window.addEventListener('error', function(event) { ... }) |
**ErrorEvent 类型的event包含有关事件和错误的所有信息。
1 | window.onerror = function(msg, url, lineNo, columnNo, error) { |
描述了元素的内容应该如何与元素的直接父元素和元素的背景混合。
1 | mix-blend-mode: normal; //正常 |