美文网首页工作生活
知识点(二)

知识点(二)

作者: 送你一堆小心心 | 来源:发表于2019-07-03 17:48 被阅读0次

    1. css实现图片自适应宽高

        .img {
              width: 100%;
              height: auto;
         }
    

    2.讲 flex,手写出 flex 常用的属性,并且讲出作用

    flex 是 flexible box的缩写,意为:'弹性布局',用来为盒状模型提供最大的灵活性。
    主要属性分布如下:

    • flex-direction => 决定项目的排列方向

          .box {
                display: flex;
                flex-direction: row (方向为水平方向,从左起)  
                                row-reverse(方向为水平方向,从右起)
                                column(方向为垂直方向,从上起)
                                column-reverse(方向为垂直方向,从下起)
          }
      
    • flex-wrap => 定义如果一条轴线放不下,如何换行

           .box {
                  diaplay: flex;
                  flex-wrap: nowrap(默认,不换行)
                             wrap(换行,第一行在上面)
                             wrap-reverse(换行,第一行在下面)
            }
      
    • justify-content => 定义轴线上的水平对齐方式

          .box {
                display: flex;
                justify-content: flex-start(默认值,左对齐)
                                 flex-end(右对齐)
                                 center(居中)
                                 space-between(两端对齐,且item中间距离相等)
                                 space-around(每个item两侧距离相等,相邻item间隙比距边框大一倍)
          }
      
    • align-items => 定义轴线上的垂直对齐方式

          .box {
                display: flex;
                align-items:  flex-start(默认值,左对齐)
                              flex-end(右对齐)
                              center(居中)
                              baseline(垂直居中)
                              stretch(如果item未设置高度和auto,将占满整个容器的高度)
          }
      

    3.BFC是什么?怎么生成BFC?BFC有什么作用?

    BFC是block format content ,意思是块级格式化上下文,它是一个独立渲染的区域,只有block-level box参与,并且规定了内部的block-level box布局,并且与这个区域内好无关系

    • 当父目录的
      float属性不为none
      position为absolute或者fixed
      display:inline-block,table-cell,table-caption,flex,inline-flex
      overflow不为visible
      都会生成BFC

    作用 -- 清除浮动


    image.png

    作用 -- 防止垂直margin重叠(折叠)


    image.png

    4.项目里面的前端鉴权是怎么实现的?

    具体分析看这个https://blog.csdn.net/wang839305939/article/details/78713124/

    • HTTP Basic Authentication
    • session-cookie
    • Token验证
    • OAuth(开放权限)

    5. vue的虚拟dom是怎么回事?

    虚拟dom可以理解为保存了一棵dom树被渲染之前所包含的所有信息,而这些信息可以通过对象的形式一直保存在内存中,并通过JavaScript的操作进行维护。

    • 第一步:通过树的形式保存旧的dom信息,这些信息可能在页面第一次加载的时候被渲染到浏览器端中,但仍是通过虚拟dom的方式创建的
    • 第二步:检测到数据更新,需要更新dom,先在JavaScript中将需要修改的节点全部修改完成。
    • 第三步:将最终生成的虚拟dom更新到视图中去

    6. vue 双向绑定讲一讲

    https://www.cnblogs.com/zhouyideboke/p/9626804.html这个讲的非常的好

    7. 手写函数防抖和函数节流

    函数节流和函数防抖都是优化高频率执行js代码的一种手段

    • 函数节流是指一定时间内js方法只跑一次。比如人的眼睛,就是在一定的时间内只眨一次。
    • 函数防抖是指频繁触发的情况下,只有足够的空闲时间,才执行代码一次。比如,坐公交,在一定时间内,乘客陆续刷卡,就不会开车,但是一旦别人刷卡,公交就开车。

    函数节流,以滚动事件为例

        var canRun = true // 初始值是已经空闲
        document.getElementById('throttle').onscroll = function () {
            if (!canRun) {
                return; // 判断是否已经空闲,如果在执行中,直接return
            }
            canRun = false
            setTimeout(function(){
                  console.log('函数节流')
                  canRun = true
            },300)
        }
    

    函数防抖

        var timer = false
        document.getElementById9('debouce').onscroll = function(){
              clearTimeout(timer) // 清除未执行的代码,重置会初始化状态
              timer = setTimeout(function(){
                    console.log('函数防抖')
              },300)
        }
    

    8. load、DOMContentLoaded 事件的触发顺序

    load事件:页面资源全部载入(js,css,图片加载完成)出发
    ready事件:原生无ready,只有(等同于)DOMContentLoaded事件。是在dom加载完成后触发,此时引用的资源未必已加载完成。
    所以,DOMContentLoaded事件一定在load之前。

    9. 图片懒加载的实现过程

    • 原理
      先将img标签的src标签链接设为同一张图片(比如空白图片),然后给img标签设置自定义的属性(比如data-src),然后将真正的图片地址存储在data-src中,当js监听到该图片元素进入可视窗口时,将自定义属性的地址存储在src属性中,达到懒加载的效果。

    • 优点
      这样做能防止页面一次性向服务器发送大量请求,导致服务器响应慢,页面卡顿崩溃等。

        // 一开始没有滚动的时候,出现在视窗中的图片也会加载
        start()
      
        // 当页面开始滚动的时候,遍历图片,如果图片出现在视窗中,就加载图片
        var clock; // 函数节流
        $(window).on('scroll', function(){
             if (clock) {
                  clearTimeout(clock)
              }
             clock = setTimeOut(function(){
                start()
             },200)
        })
        function start(){
              $('.container img').not('[data-isLoading]').each(function(){
                    if (isShow($this)){
                          loadImg($this)
                    }
              })
        }
        // 判断图片是否出现在视窗的函数
        function isShow($node){
              return $node.offset().top <= $(window).height()+$(window).scrollTop()
        }
        // 加载图片的函数,把自定义属性data-src存储的真正的图片地址,赋值给src
        function loadImg($img){
            $img.attr('src', $img.attr('data-src'))
            // 已经加载的图片,设置一个属性,值为1,作为标识
            // 这样处理滚动的时候只遍历哪儿些还没有加载的图片
            $img.attr('data-isLoading',1)
        }
      

    10. vue-lazyloader的原理,手写伪代码

    image.png
    • 原理简述
      (1) vue-lazyload是通过指令的方式实现的,定义的指令是v-lazy指令
      (2) 指定被bind时会创建一个listener,并将其添加到listener queue里面,并且搜索target dom节点,为其注册dom事件(如scroll事件)
      (3) 上面的dom事件回调中,会遍历listener queue里的listener,判断此listener绑定的dom是否处于页面中perload的位置,如果处于则加载异步加载当前图片的资源。
      (4) 同事listener会在当前图片加载的loading,loaded,error三种状态触发当前dom渲染的函数,分别渲染三种状态下dom的内容。

    11. url的组成

    image.png

    12. css实现瀑布流布局

    • 方法一:css3的Multi-columns.


      image.png

      css实现如下:

          .masonry {
                column-count: 5; // 分成5列
                column-gap: 0; // 列之间的间隔
          }
          .item {
                break-inside: avoid; // 为了控制文本块分解成单独的列
                box-sizing: border-box;
                padding: 10px
          }
      
    • 方法二: flex
      css实现如下:

            .masonry{
              display: flex;
              flex-direction: row
            }
            .item{
              display: flex;
              flex-direction: column;
              width:calc(100% / 3)
            }
      

    13. 深拷贝和浅拷贝

    • 浅拷贝

      var obj = { a:1, arr: [2,3] };
      var shallowObj = shallowCopy(obj);
      function shallowCopy(src) {
       var dst = {};
        for (var prop in src) {
        if (src.hasOwnProperty(prop)) {
            dst[prop] = src[prop];
          }
        }
        return dst;
      }
      
    • 深拷贝

      var people = {
           name:'xxx',
              friends:['people1','people2','peopple3'],
              info:{
                    phone:'133xxxxxxxx',
                   age:'18',
                    sex:'man'
              }   
      }
      function deepCopy(p, c) {
            var c = c || {};
            for (var i in p) {
                  if (typeof p[i] === 'object') {
                        c[i] = (p[i].constructor === Array) ? [] : {};
                        deepCopy(p[i], c[i]);
                  } else {
                        c[i] = p[I];
                  }            
            }
            return c;
      }      
      var person = deepCopy(people);
      

    14. 同源策略以及jsonp解决跨域

    同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

    它的核心就在于它认为自任何站点装载的信赖内容是不安全的。当被浏览器半信半疑的脚本运行在沙箱时,它们应该只被允许访问来自同一站点的资源,而不是那些来自其它站点可能怀有恶意的资源。

    • JSONP 跨域

    由于 script 标签不受浏览器同源策略的影响,允许跨域引用资源。因此可以通过动态创建 script 标签,然后利用 src 属性进行跨域,这也就是 JSONP 跨域的基本原理。

    直接通过下面的例子来说明 JSONP 实现跨域的流程:

      // 1. 定义一个 回调函数 handleResponse 用来接收返回的数据
      function handleResponse(data) {
          console.log(data);
      };
    
      // 2. 动态创建一个 script 标签,并且告诉后端回调函数名叫 handleResponse
      var body = document.getElementsByTagName('body')[0];
      var script = document.gerElement('script');
      script.src = 'http://www.laixiangran.cn/json?callback=handleResponse';
      body.appendChild(script);
    
      // 3. 通过 script.src 请求 `http://www.laixiangran.cn/json?              callback=handleResponse`,
      // 4. 后端能够识别这样的 URL 格式并处理该请求,然后返回       handleResponse({"name": "laixiangran"}) 给浏览器
      // 5. 浏览器在接收到 handleResponse({"name": "laixiangran"}) 之后立即执行 ,也就是执行 handleResponse 方法,获得后端返回的数据,这样就完成一次跨域请求了。
    

    15. 讲解MVVM

    • Vue.js的数据驱动就是通过MVVM这种框架来实现的。MVVM框架主要包含3个部分:model、view和 viewmodel。
    • Model:指的是数据部分,对应到前端相当于javascript对象
    • View:指的是视图部分,对应前端相当于dom
    • Viewmodel:就是连接视图与数据的中间件通讯

    数据(Model)和视图(View)是不能直接通讯的,而是需要通过ViewModel来实现双方的通讯。当数据变化的时候,viewModel能够监听到这种变化,并及时的通知view做出修改。同样的,当页面有事件触发时,viewMOdel也能够监听到事件,并通知model进行响应。Viewmodel就相当于一个观察者,监控着双方的动作,并及时通知对方进行相应的操作。

    相关文章

      网友评论

        本文标题:知识点(二)

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