前端面试的葵花宝典

打算三月中旬开始找一份合适的工作,现在开始整理些面试题,也是顺便对于自己知识系统的整理

css部分

(1)css3选择器

子元素选择器:> 、 nth-child(n)、nth-of-type(n)
>比较常见,用于选择当前标签的所有子元素
:nth-of-type为什么要叫:nth-of-type?因为它是以"type"来区分的,
也就是说:ele:nth-of-type(n)是指父元素下第n个ele元素,
而ele:nth-child(n)是指父元素下第n个元素且这个元素为ele
复制代码

nth-child(n)、nth-of-type(n)区别这里附上一个小例子: 代码如下:


    "demo">

    zero

  • one
  • two
上面这个例子,li:nth-child(2)选择的是
  • one
  • 节点 ,而 li:nth-of-type(2)则选择的是
  • two
  • 节点 复制代码

    兄弟选择器:+和~

    +用于选择当前标签后面一个同级元素

    li:nth-child(2) + li{}   //选择第二个元素之后的一个同级元素
    复制代码

    ~用于选择当前标签后面的所有同级元素

    li:nth-child(2) ~ li{}   //选择第二个元素之后所有的同级元素
    复制代码

    (2)盒子垂直水平居中

    定位

    1.盒子宽高已知,position:absolute;left:50%;top:50%;margin-left:-自身一半的宽度;margin-top:-自身一半的高度
    2.盒子宽高未知,position:absolute;left:0;top:0;right:0;bottom:0;margin:auto
    复制代码

    table-cell布局

    父级
     display:table-cell;vertical-align:middle;子级 margin 0 auto;
    复制代码

    定位 + transform;适用于盒子宽高不定

     position:relative/absolute;left:50%;top:50%; transform: translate(-50%, -50%); 注意这里启动了3D硬件加速哦 会增加耗电量的 
    复制代码

    flex布局

    父级:
       display: flex;align-items: center;justify-content: center;
    
    复制代码

    浏览器问题

    1.同源策略与跨域

    首先介绍下浏览器的策略
    ● 端口相同
    ● 域名相同
    ● 协议相同
    复制代码

    按照阮老师的说法,目前,如果非同源,共有三种行为受到限制。

    Cookie、LocalStorage 和 IndexDB 无法读取。
    Dom无法获取
    Ajax请求
    如何实现跨域,在有些必要的场合突破这些限制呢
    复制代码

    AJAX请求的跨域

    针对AJAX请求,有两种跨域方式

    • JSONP 只支持get请求,不支持post请求;兼容性较好

    • CORS 支持所有请求;不兼容老旧浏览器

    jsonp跨域

    jsonp是利用script标签可以跨域访问资源的特性,在页面动态插入script标签,向服务器发出数据请求,服务器接到请求后将数据放在一个指定名字的回调函数中传回

    function addScriptTag(src) {
      var script = document.createElement('script');
      script.setAttribute("type","text/javascript");
      script.src = src;
      document.body.appendChild(script);
    }
    
    window.onload = function () {
      addScriptTag('http://example.com/ip?callback=foo');
    }
    
    function foo(data) {
      console.log('Your public IP address is: ' + data.ip);
    };
    复制代码

    cors跨域 cors请求的局限就小很多了,它是一个W3C标准,允许向跨源服务器,发起XMLHttpRequest请求。支持IE10及其以上。

    整个CORS通信过程,都是浏览器自动完成,不需要用户参与。

    对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

    因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信

    js方面

    1.数组的排序算法-冒泡排序

    思想:冒泡排序思想:每一次对比相邻两个数据的大小,小的排在前面,如果前面的数比后面的大就交换这两个数的位置 要实现上述规则需要用到两层for循环,外层从第一个数到倒数第二个数,内层从外层的后面一个数到最后一个数

    var times=0;  
    var bubbleSort=function(arr){  
        for(var i=0;ifor(var j=i+1;jif(arr[i]>arr[j]){//如果前面的数据比后面的大就交换  
                    var temp=arr[i];  
                    arr[i]=arr[j];  
                    arr[j]=temp;  
                }  
            console.log("第"+(++times)+"次排序后:"+arr);  
            }  
        }   
        return arr;  
    }  
    console.log("The result is:"+bubbleSort(arr));  
    复制代码

    项目问题:

    这个是最重要的感觉每次回答的都不好;实际项目中遇到的问题;

    1.滚动穿透问题

    滚动穿透是指在移动端当有fixed遮罩背景和弹出层时,在屏幕上滑动能够滑动背景下面的内容,原因click事件的300毫秒延迟造成的

    解决方案:position:fixed
    body.modal-open{
        position:fixed;
        width:100%;
    }
    复制代码

    这种方式同样会当弹出层弹出时滚动条会丢失,所以还需要是使用js来保存滚动条的位置,在关闭弹出层时将滚动条还原

    var ModalHelper = (function(bodyCls){
        var scrollTop;//在闭包中定义一个用来保存滚动条的变量
        return {
            afterOpen:function(){//在弹出之后记录保存滚动条的位置,并且给body添加,modal-open
                scrollTop = document.scrollingElement.scrollTop;
                document.body.classList.add(bodyCls);
                document.body.style.top = -scrollTop + 'px'
            },
            beforeClose:function(){//关闭时将,modal-open一处并还原之前保存的位置
                document.body.classList.remove(bodyCls);
                document.scrollingElement.scrollTop = scrollTop;
            }
        }
    })('modal-open')
    复制代码
    移动端输入框被键盘挡住问题

    由于页面没有滑动到底部: 解决方案如下

    setTimeout(function(){
        document.body.scrollTop = document.body.scrollHeight;
    },300);
    复制代码

    未完待续。。。。。等面试回来再补充

    你可能感兴趣的:(前端面试的葵花宝典)