layer源碼解析(一)

因為發現公司的項目里基本全都用了layer,手機端的都用的是layer for mobile,所以本人本著積極探索的態度就去看源碼啦,文檔使用實在是簡單的不要不要的,對于大家的開發中提升用戶交互體驗真的很方便,沒錢去支持它,只能安利一波,雖然我安利也一點用都沒有。。。

先說最近學習的XMind畫腦圖,現在用著不熟練,但已經覺得真的對理清思路簡直是神器,也有免費版和專業版,再度給大家安利一波。

一 介紹和基本使用

  1. layer for mobile是非常簡單的,它將PC端的幾種類型選擇還有樣式選擇都刪去了,只保留了最核心的函數layer.open({opt}),然后利用豐富的參數來實現開發者想要的基本的 交互彈窗。
  2. 簡單說下三個典型例子
layer.open({
     content:'我是一個詢問框',
     btn:'好了,我知道了'
})
基本詢問框
layer.open({
    content:"我是來提示你的",
    skin:"msg",
    time:2
})
提示彈窗
layer.open({
    type:2
})
有個遮罩層的加載動畫

二.源碼的構造

源碼解構

講真,用腦圖是真心爽

簡單來說呢,就是分三部,第一步就是做一些配置,拿傳進來的參數做一些初始化,第二步就是核心,定義一個Layer對象,里面有兩個方法,一個用來輸出視圖(view),也就是Html代碼,一個用來給上面綁定事件(action),第三補就是加一個css的link啊,然后把Layer對象封裝一些方法,然后暴露給window,這樣開發者就可以隨意使用啦,貌似基本做插件都是這樣,所以要總結總結,自己以后開發寫組件的時候也可以這樣,然后組件也可以拿出來給別人隨意用啦~~~

三.配置部分分析

  1. 基本方法簡化
var doc = document, 
    query = 'querySelectorAll', 
    claname = 'getElementsByClassName', 
    S = function(s){
      return doc[query](s);
    };

這個很簡單粗暴,后面想調用document.querySelectorAll的時候寫成doc.query就好了,調用document.getElementsByClassName直接用定義了的S方法。

  1. 定義默認配置config
//默認配置
var config = {
  type: 0
  //是否顯示遮罩層
  ,shade: true
  //是否點擊遮罩時關閉層
  ,shadeClose: true
  //fixed固定層的位置,默認true
  ,fixed: true
  //默認動畫類型
  ,anim: 'scale' 
};
  1. ready對象,用來做初始化的工作,兼任的干一下點擊事件綁定的工作
//用戶自定義屬性初始化,包括title,time,btn等默認為空的
var ready = {
  extend: function(obj){
    var newobj = JSON.parse(JSON.stringify(config));
    for(var i in obj){
      newobj[i] = obj[i];
    }
    return newobj;
  }, 
  timer: {}, end: {}
};
//點觸事件,傳進來函數執行
ready.touch = function(elem, fn){
  elem.addEventListener('click', function(e){
    fn.call(this, e);
  }, false);
};

四.核心對象Layer

  1. Layer的定義.png

    做了兩件事情,一個是初始化配置,一個是調用view()

  2. view


    視圖.png

    首先是創建一個el,然后后面一步步的根據config來配置el.innerHTML里要添加的字符串,所以最后一步就是將所有判斷走完后返回的字符串拼接起來。

  //最終連接dom結構
  //shade為string,則是顯示,并自定義樣式,所以加上一個div
  layerbox.innerHTML = (config.shade ? '<div '+ (typeof config.shade === 'string' ? 'style="'+ config.shade +'"' : '') +' class="layui-m-layershade"></div>' : '')
  +'<div class="layui-m-layermain" '+ (!config.fixed ? 'style="position:static;"' : '') +'>'
    +'<div class="layui-m-layersection">'
      +'<div class="layui-m-layerchild '+ (config.skin ? 'layui-m-layer-' + config.skin + ' ' : '') + (config.className ? config.className : '') + ' ' + (config.anim ? 'layui-m-anim-' + config.anim : '') +'" ' + ( config.style ? 'style="'+config.style+'"' : '' ) +'>'
        + title
        +'<div class="layui-m-layercont">'+ config.content +'</div>'
        + button
      +'</div>'
    +'</div>'
  +'</div>';

在el內部拼接完成后就是將其appendChild給相應的dom,然后調用action();
3.action()

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • type - 基本層類型 類型:Number,默認:0layer提供了5種層類型。可傳入的值有:0(信息框,默認)...
    hopevow閱讀 16,848評論 5 2
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,951評論 6 342
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 長度測量是最基礎的測量,是后面所有帶刻度的測量工具的基礎。比如鐘表、彈簧測力計、量筒、溫度計、電流表、電壓表等等等...
    孔雀東南飛飛閱讀 1,418評論 0 4