美文网首页张蕾的技术博客Web前端之路让前端飞
面试阿里、网易、滴滴前端碰到的问题2

面试阿里、网易、滴滴前端碰到的问题2

作者: cd72c1240b33 | 来源:发表于2017-06-12 12:34 被阅读955次

    继续 上一节:面试阿里、网易、滴滴前端碰到的问题1: http://www.jianshu.com/p/e593fbb36ab1

    CSS

    ** 对栅格的理解**
    一个栅格布局需要3部分组成——容器(container),行(row),列(column,也可称为栅),例如bootstrap中就包含了这三部分

    <div class="container-fluid">
      <div class="row">
              <div class="col-md-8">.col-md-8</div>
            <div class="col-md-4">.col-md-4</div>
      </div>
    </div>
    
    • 每一个“row”代表一行,而内部的“col-md-数字”代表一个单元格;
      Bootstrap把每一行分成12等份,“col-md-数字”中的“数字”从1-12中取,数字等于几,就占几份;
      合理的选择单元格的数字配置,再往单元格中添加我们想要的内容,这样一个栅格系统就完成了!
    • 可以用bootstrap的删格系统实现响应式开发

    .col-xs-  无论屏幕宽度如何,单元格都在一行,宽度按照百分比设置;试用于手机;
    .col-sm-  屏幕大于768px时,单元格在一行显示;屏幕小于768px时,独占一行;试用于平板;
    .col-md-  屏幕大于992px时,单元格在一行显示;屏幕小于992px时,独占一行;试用于桌面显示器;
    .col-lg-  屏幕大于1200px时,单元格在一行显示;屏幕小于1200px时,独占一行;适用于大型桌面显示器;

    (水平)居中有哪些实现方式

    • CSS实现水平和垂直居中
      要让DIV水平和垂直居中,必需知道该DIV得宽度和高度,然后设置位置为绝对位置,距离页面窗口左边框和上边框的距离设置为50%,这个50%就是指页面窗口的宽度和高度的50%,最后将该DIV分别左移和上移,左移和上移的大小就是该DIV宽度和高度的一半。
    • jQuery实现水平和垂直居中:一样的原理
    $(window).resize(function(){ 
         $(".mydiv").css({ 
             position: "absolute", 
             left: ($(window).width() - $(".mydiv").outerWidth())/2, 
            top: ($(window).height() - $(".mydiv").outerHeight())/2 
         });        
    }); 
    

    移动端1像素边框问题

    由于分辨率 DPI 的差异,高清手机屏上的 1px 实际上是由 2×2 个像素点来渲染,有的屏幕甚至用到了 3×3 个像素点;
    所以 border: 1px 在移动端会渲染为 2px 的边框;

    • 第一种:transform:scale
      使用伪类 :after 或者 :before 创建 1px 的边框,然后通过 media 适配不同的设备像素比,然后调整缩放比例,从而实现一像素边框
    • 这种办法的边框并不是真正的 border,而是高度或者宽度为 1px 的块状模型,所以这种办法不能做出圆角,一般都用来画分割线
    //首先用伪类创建边框
    .border-bottom{
        position: relative;
        border-top: none !important;
    }
    
    .border-bottom::after {
        content: " ";
        position: absolute;
        left: 0;
        bottom: 0;
        width: 100%;
        height: 1px;
        background-color: #e4e4e4;
        -webkit-transform-origin: left bottom;
        transform-origin: left bottom;
    }
    //然后通过媒体查询来适配
    /* 2倍屏 */
    @media only screen and (-webkit-min-device-pixel-ratio: 2.0) {
        .border-bottom::after {
            -webkit-transform: scaleY(0.5);
            transform: scaleY(0.5);
        }
    }
    
    /* 3倍屏 */
    @media only screen and (-webkit-min-device-pixel-ratio: 3.0) {
        .border-bottom::after {
            -webkit-transform: scaleY(0.33);
            transform: scaleY(0.33);
        }
    }
    
    • 第二种:viewport
      网页的内容都渲染在 viewport 上,所以设备像素比的差异,直接影响的也是 viewport 的大小;
      通过 js 获取到设备像素比,然后动态添加 <meta> 标签
    <script type="text/javascript">
       (function() {
           var scale = 1.0;
           if (window.devicePixelRatio === 2) {
               scale *= 0.5;
           }
           if (window.devicePixelRatio === 3) {
               scale *= 0.333333;
           }
           var text = '<meta name="viewport" content="initial-scale=' + scale + ', maximum-scale=' + scale +', minimum-scale=' + scale + ', width=device-width, user-scalable=no" />';
           document.write(text);       
        })();
    </script>
    

    JavaScript

    图片懒加载

    • 图片懒加载几步:
      • 把真正的图片地址存在自定义属性上
      • 当图片满足加载条件的时候,创建临时的img对象校验图片地址的正确性;
      • 地址正确,进入onload事件,把正确地址赋值src;不正确,进入onerr;
      • 注意性能优化:释放没用的临时图片对象

    实现页面加载进度条

    我的实现原理:记录下当前页面需要加载哪些图片和js;分别在每个加载js和图片的完成后,刷新一次进度条;

    num++;
    self.loadBar.css("width",num/loadData.length*100+"%");
    

    事件委托

    • 如果同一个容器中,有n多个元素都要发生某个行为,我们可以把这个行为委托给他们共同的父级; 事件委托是对事件冒泡的运用;
    • 作为的例子:
      • 删除留言
      • 多级菜单
      • 百度搜索等

    实现extend函数

    • 本质:对象的遍历和克隆

    为什么会有跨域的问题以及解决方式

    • 为什么会有跨域:简单地理解就是因为JavaScript同源策略的限制。
      如 a.com 下的js 无法和b.com 的js通信。这是浏览器为了安全而设定的策略;
    • 只有域名相同才不会有跨域的情况。
    • 常见的解决方案:
      • jsonp 跨域访问接口:需要后台提供jsonp接口
      • Access-Control-Allow-Origin
    //js部分
    $.ajax({  
        url: "http://192.168.2.229:8091/myTest/hellow/index",  
        type: "POST",  
        crossDomain: true,  
        dataType: "json",  
        success: function(result) {  
            alert(JSON.stringify(result));  
        },  
        error: function(xhr, status, error) {  
        alert(status);  
        }  
    });  
    //服务器端
    response.addHeader( "Access-Control-Allow-Origin", "http://192.168.2.229:8020" )  
    

    jsonp原理、postMessage原理

    相关文章

      网友评论

        本文标题:面试阿里、网易、滴滴前端碰到的问题2

        本文链接:https://www.haomeiwen.com/subject/avqlqxtx.html