2020-05-09

# 2020-05-09
# [html] 浏览器是如何解析html的? #

## 1.浏览器如何解析HTML ##

    渲染引擎的基本工作流程
    1.解析HTML构建DOM书
    2.渲染树的构建
    3.渲染树的布局
    4.绘制渲染树

    渲染引擎会解析HTML文档,并把标签转换成内容树中的DOM节点,会解析style元素和外部文件的样式数据。
    样式数据和HTML中的显示控制将共同创建--渲染树renderObject。
    渲染引擎会在处理后续内容的同时把处理过的局部内容先展示出来,而不是等到所有HTML都被解析完才创建并渲染树。
    
    不同的浏览器由于内核不同,整个渲染流程大同小异。

    * 开始解析
    解析器通常把工作分给两个组件——分词程序负责把输入切分成合法符号序列,解析程序负责按照句法规则分析文档结构和构建句法树。
    词法分析器知道如何过滤像空格,换行之类的无关字符。
    解析分为两个部分:分词与构建树。它把输入解析成符号序列。
    在HTML中的开始标签、结束标签、属性名称和属性值。分词器识别这些符号并将其送入树构建者,然后继续分析处理下一个符号,直到输入结束。    

## 2.浏览器如何解析css ##

    css的选择器都是全局的,好处是代码重用率高、可以把css文件合并、拆分;坏处是css写法特别灵活,容易形成紧耦合。
    
    实际上css选择器的读取顺序是从右向左。例如:
    #molly div.haha span{color:#f00}
    浏览器从右向左读取选择器,先找到span然后顺着往上找到class为haha的div,然后再找到id为molly的div的元素。
    成功匹配则加入结果集,如果直到根元素html都没有匹配,则不会再遍历这条路径,从下一个span开始重复这个过程。
    整个过程会形成一条符合规则的索引树,树由上至下的规则中从右向左的一个个选择匹配的节点。

2020-05-09

    如果从左向右的顺序读取,在执行到左边的分支后发现没有相对应标签匹配,则会回溯到上一个节点再继续遍历,直到找到或者没有相匹配的标签才结束。
    如果有100个甚至1000个分支的时候会消耗很多性能。
    反之从右向左查找极大的缩小的查找范围从而提高了性能。这就解释了为什么id选择器大于类选择器,类选择器大于元素选择器。

## 3.浏览器如何解析js ##

    浏览器中有一个 js解析器 的工具来解析js代码。我们关注其中的2个步骤:
    1.js预解析
    解析器会找到js中的所有变量、函数、参数,进行函数提升(优先)和变量提升,
    并把var声明的变量赋值为未定义undefined,将函数取出来称为一个函数块,然后放到仓库当中。
    2.逐行解析代码
    由上向下,由左向右,然后去和仓库进行匹配。
    <script>
        alert(a);    //function a(){alert(4)} 函数提升优先于变量提升
        var a = 1;
        alert(a);    //1
        function a(){alert(2)}
        alert(a);    //1
        var a = 3;
        alert(a);    //3
        function a(){alert(4)}
        alert(a);    //3
    </script>
    
    作用域:能够进行读写操作的一个区域。
    <script>
        var a = 1;
        function fn(){
            alert(a);    //1
            a = 2;
        }
        fn();
        alert(a);    //2
    </script>
    稍加修改后。。。。。。
    <script>
        var a = 1;
        function fn(a){
            alert(a);    //undefeated
            a = 2;
        }
        fn();
        alert(a);    //1
    </script>
    继续修改。。。。。。
    <script>
        var a = 1;
        function fn(a){
            alert(a);    //1
            a = 2;
        }
        fn(a);
        alert(a);    //1
    </script>

# [css] 使用css写一个红绿灯交替的动画效果 #
    主要借助与:@keyframes标签 创建动画从一个css样式设定到另一个样式,指定动画进程百分比,每个百分比会自己形成一个变化的阶段,阶段完成会有短暂停留。
    
    <body>
        <div class="wrap">
            <div class="traffic-light"></div>
        </div>
    </body>
    .traffic-light::after { 
    /* 简介写法: 绑定元素;动画时间5s;速度曲线linear;延时0s;播放次数infinite;是否下一次动作逆向,默认normal,逆向可设置为alternate */
        animation: traffic-light 5s linear 0s infinite; // 必须定义的animation
        -webkit-animation: traffic-light 5s linear 0s infinite; /* Safari and Chrome */
    }
    @keyframes traffic-light,
    @-webkit-keyframes traffic-light /* Safari and Chrome */    
     {
        from {
            background: transparent; /* 黄灯 */
            box-shadow:
                -85px 0 0 0 transparent,/* 红灯 */
                85px 0 0 0 transparent,/* 绿灯 */
                -85px 0 15px 0 transparent,/* 红灯光影 */
                0px 0 15px 0 transparent,/* 黄灯光影 */
                85px 0 15px 0 transparent; /* 绿灯光影 */
        } 

        50% {
            background: rgb(231, 183, 78); /* 黄灯 */
            box-shadow:
                -85px 0 0 0 transparent,/* 红灯 */
                85px 0 0 0 transparent, /* 绿灯 */
                -85px 0 15px 0 transparent, /* 红灯光影 */
                0px 0 15px 0 rgb(231, 183, 78), /* 黄灯光影 */
                85px 0 15px 0 transparent;/* 绿灯光影 */
        } 

        to {
            background: transparent; /* 黄灯 */
            box-shadow:
                -85px 0 0 0 transparent,/* 红灯 */
                85px 0 0 0 transparent,/* 绿灯 */
                -85px 0 15px 0 transparent,/* 红灯光影 */
                0px 0 15px 0 transparent,/* 黄灯光影 */
                85px 0 15px 0 transparent;/* 绿灯光影 */
        }
    }
        

 

# [js] 写一个获取非行间样式的方法 #

    行间样式:行间样式就是写在标签体内的样式:如,<div style="color:red"></div>,在这里color样式就是行间样式。
    非行间样式:非行间样式就是指不是写在标签体内的style属性的样式。如<style>....</style>内的定义的样式或引用的外部css文件都是非行间样式。
    
    1.非行间样式的获取 存在兼容问题,非IE浏览器和IE8及以下
    //非IE获取方式
     window.getComputedStyle(atrr).ele;// atrr为目标元素;ele为要获取的样式
    //IE8及以下获取方式
    (attr).currentStyle.ele;

    如何使用:
    if(getComputedStyle){
            window.getComputedStyle(attr).ele
    }else{
        (attr).currenStyle.ele
    }
    //写成一行==========================
    window.getComputedStyle ?window.getComputedStyle(attr).ele:(attr).currenStyle.ele;
    
    2.行间样式的获取
    attr.style.ele;//例如: document.getElementById("myDiv").style.color;
    window.innerHeight; //浏览器高度
    window.innerWidht; //浏览器宽度
        
# [软技能] 你认为企业内部协同工具最重要的功能是什么? #

    对于任何OA软件来说,能不能发挥作用,并不是取决于软件本身,而是取决于如何使用。
    协同工具主要帮助我们解决的问题基本:
    1.提升工作效率
    2.规范业务操作
    3.挖掘业务价值
    但是,这三者之间是相互矛盾的,引入协同工具时应该注重平衡性。