下載地址:http://res.layui.com/download/layer-v2.1.zip
我們提到的基礎參數主要指調用方法時用到的配置項,如:
layer.open({content: ''}),
layer.msg('', {time: 3})
,
其中的content和time即是基礎參數,以鍵值形式存在,基礎參數可合理應用於任何層類型中,您不需要所有都去配置,大多數都是可選的。而其中的
layer.open、
layer.msg、
就是內置方法。但我們通常還會在別的js文件中擴展一些層,
比如layer.prompt()
即是我們的擴展方法,擴展的js文件默認不會加載,通常需進行layer.config({extend: 'extend/layer.ext.js'})
后才可使用,而關於其中的extend下面也有講解。
基礎參數
type - 基本層類型
類型:Number,默認:0
layer提供了5種層類型。可傳入的值有:0
(信息框,默認)1
(頁面層)2
(iframe層)3
(加載層)4
(tips層)。 若你采用layer.open({type: 1})
方式調用,則type為必填項(信息框除外)
title - 標題
類型:String/Array/Boolean,默認:'信息'
title支持三種類型的值,若你傳入的是普通的字符串,如title :'我是標題'
,那么只會改變標題文本;若你還需要自定義標題區域樣式,那么你可以title: ['文本', 'font-size:18px;']
,數組第二項可以寫任意css樣式;如果你不想顯示標題欄,你可以title: false
content - 內容
類型:String/DOM/Array,默認:''
content可傳入的值是靈活多變的,不僅可以傳入普通的html內容,還可以指定DOM,更可以隨着type的不同而不同。譬如:
1 /!* 2 如果是頁面層 3 */ 4 layer.open({ 5 type: 1, 6 content: '傳入任意的文本或html' //這里content是一個普通的String 7 }); 8 layer.open({ 9 type: 1, 10 content: $('#id') //這里content是一個DOM 11 }); 12 //Ajax獲取 13 $.post('url', {}, function(str){ 14 layer.open({ 15 type: 1, 16 content: str //注意,如果str是object,那么需要字符拼接。 17 }); 18 }); 19 20 /!* 21 如果是iframe層 22 */ 23 layer.open({ 24 type: 2, 25 content: 'http://sentsin.com' //這里content是一個URL,如果你不想讓iframe出現滾動條,你還可以content: ['http://sentsin.com', 'no'] 26 }); 27 28 /!* 29 如果是用layer.open執行tips層 30 */ 31 layer.open({ 32 type: 4, 33 content: ['內容', '#id'] //數組第二項即吸附元素選擇器或者DOM 34 });
skin - 樣式類名
類型:String,默認:''
skin不僅允許你傳入layer內置的樣式class名,還可以傳入您自定義的class名。這是一個很好的切入點,意味着你可以借助skin輕松完成不同的風格定制。目前layer內置的skin有:layui-layer-lan
layui-layer-molv
,未來我們還會選擇性地內置更多,但更推薦您自己來定義。以下是一個自定義風格的簡單例子
1 //單個使用 2 layer.open({ 3 skin: 'demo-class' 4 }); 5 6 //全局使用。即所有彈出層都默認采用,但是單個配置skin的優先級更高 7 layer.config({ 8 skin: 'demo-class' 9 }) 10 11 //CSS 12 body .demo-class .layui-layer-title{background:#c00; color:#fff; border: none;} 13 body .demo-class .layui-layer-btn{border-top:1px solid #E9E7E7} 14 body .demo-class .layui-layer-btn a{background:#333;} 15 body .demo-class .layui-layer-btn .layui-layer-btn1{background:#999;} 16 … 17 加上body是為了保證優先級。你可以借助Chrome調試工具,定義更多樣式控制層更多的區域。
area - 寬高
類型:String/Array,默認:'auto'
在默認狀態下,layer是寬高都自適應的,但當你只想定義寬度時,你可以area: '500px'
,高度仍然是自適應的。當你寬高都要定義時,你可以area: ['500px', '300px']
offset - 坐標
類型:String/Array,默認:'auto'
默認垂直水平居中。但當你只想定義top時,你可以offset: '100px'
。當您top、left都要定義時,你可以offset: ['100px', '200px']
。除此之外,你還可以定義offset: 'rb'
,表示右下角。其它的特殊坐標,你可以自己計算賦值。
icon - 圖標。信息框和加載層的私有參數
類型:Number,默認:-1(信息框)/0(加載層)
信息框默認不顯示圖標。當你想顯示圖標時,默認皮膚可以傳入0-6
如果是加載層,可以傳入0-2
。如:
1 //eg1 2 layer.alert('酷斃了', {icon: 1}); 3 4 //eg2 5 layer.msg('不開心。。', {icon: 5}); 6 7 //eg3 8 layer.load(1); //風格1的加載
btn - 按鈕
類型:String/Array,默認:'確認'
信息框模式時,btn默認是一個確認按鈕,其它層類型則默認不顯示,加載層和tips層則無效。當您只想自定義一個按鈕時,你可以btn: '我知道了'
,當你要定義兩個按鈕時,你可以btn: ['yes', 'no']
。當然,你也可以定義更多按鈕,比如:btn: ['按鈕1', '按鈕2', '按鈕3', …]
,按鈕1和按鈕2的回調分別是yes和cancel,而從按鈕3開始,則回調為btn3: function(){},以此類推。如:
1 //eg1 2 layer.confirm('納尼?', { 3 btn: ['按鈕一', '按鈕二', '按鈕三'] //可以無限個按鈕 4 ,btn3: function(index, layero){ 5 //按鈕【按鈕三】的回調 6 } 7 }, function(index, layero){ 8 //按鈕【按鈕一】的回調 9 }, function(index){ 10 //按鈕【按鈕二】的回調 11 }); 12 13 //eg2 14 layer.open({ 15 content: 'test' 16 ,btn: ['按鈕一', '按鈕二', '按鈕三'] 17 ,yes: function(index, layero){ //或者使用btn1 18 //按鈕【按鈕一】的回調 19 },cancel: function(index){ //或者使用btn2 20 //按鈕【按鈕二】的回調 21 },btn3: function(index, layero){ 22 //按鈕【按鈕三】的回調 23 } 24 });
closeBtn - 關閉按鈕
類型:String/Boolean,默認:1
layer提供了兩種風格的關閉按鈕,可通過配置1
和2
來展示,如果不顯示,則closeBtn: 0
shade - 遮罩
類型:String/Array/Boolean,默認:0.3
即彈層外區域。默認是0.3透明度的黑色背景('#000')。如果你想定義別的顏色,可以shade: [0.8, '#393D49']
;如果你不想顯示遮罩,可以shade: 0
shadeClose - 是否點擊遮罩關閉
類型:Boolean,默認:false
如果你的shade是存在的,那么你可以設定shadeClose來控制點擊彈層外區域關閉。
time - 自動關閉所需毫秒
類型:Number,默認:0
默認不會自動關閉。當你想自動關閉時,可以time: 5000
,即代表5秒后自動關閉,注意單位是毫秒(1秒=1000毫秒)
shift - 動畫
類型:Number,默認:0
從1.9開始,我們的出場動畫全部采用CSS3。這意味着除了ie6-9,其它所有瀏覽器都是支持的。目前shift可支持的動畫類型有0-6
maxmin - 最大最小化。
類型:Boolean,默認:false
該參數值對type:1
和type:2
有效。默認不顯示最大小化按鈕。需要顯示配置maxmin: true
即可
fix - 固定
類型:Boolean,默認:true
即鼠標滾動時,層是否固定在可視區域。如果不想,設置fix: false
即可
scrollbar - 是否允許瀏覽器出現滾動條
類型:Boolean,默認:true
默認允許瀏覽器滾動,如果設定scrollbar: false
,則屏蔽
maxWidth - 最大寬度
類型:,默認:360
當area: 'auto'
時,maxWidth的設定才有效。
zIndex - 層疊順序
類型:,默認:19891014
一般用於解決和其它組件的層疊沖突。
move - 觸發拖動的元素
類型:String/DOM/Boolean,默認:'.layui-layer-title'
默認是觸發標題區域拖拽。如果你想單獨定義,指向元素的選擇器或者DOM即可。如move: '.mine-move'
。你還配置設定move: false
來禁止拖拽
moveType - 拖拽風格
類型:Number,默認:0
默認的拖拽風格正如你所見到的,會有個過度的透明框。但是如果你不喜歡,你可以設定moveType: 1
切換到傳統的拖拽模式
moveOut - 是否允許拖拽到窗口外
類型:Boolean,默認:false
默認只能在窗口內拖拽,如果你想讓拖到窗外,那么設定moveOut: true
即可
moveEnd - 拖動完畢后的回調方法
類型:Function,默認:null
默認不會觸發moveEnd,如果你需要,設定moveEnd: function(){}
即可。
tips - tips方向和顏色
類型:Number/Array,默認:2
tips層的私有參數。支持上
右
下
左
四個方向,通過1-4
進行方向設定。如tips: 3
則表示在元素的下面出現。有時你還可能會定義一些顏色,可以設定tips: [1, '#c00']
tipsMore - 是否允許多個tips
類型:Boolean,默認:false
允許多個意味着不會銷毀之前的tips層。通過tipsMore: true
開啟
success - 層彈出后的成功回調方法
類型:Function,默認:null
當你需要在層創建完畢時即執行一些語句,可以通過該回調。success會攜帶兩個參數,分別是當前層DOM
當前層索引
。如:
1 layer.open({ 2 content: '測試回調', 3 success: function(layero, index){ 4 console.log(layero, index); 5 } 6 });
yes - 確定按鈕回調方法
類型:Function,默認:null
該回調攜帶兩個參數,分別為當前層索引、當前層DOM對象。如:
1 layer.open({ 2 content: '測試回調', 3 yes: function(index, layero){ 4 //do something 5 layer.close(index); //如果設定了yes回調,需進行手工關閉 6 } 7 });
cancel - 取消和關閉按鈕觸發的回調
類型:Function,默認:null
該回調同樣只攜帶當前層索引一個參數,無需進行手工關閉。如果不想關閉,return false
即可,如 cancel: function(index){ return false; } 則不會關閉;
end - 層銷毀后觸發的回調
類型:Function,默認:null
無論是確認還是取消,只要層被銷毀了,end都會執行,不攜帶任何參數。
full/min/restore -分別代表最大化、最小化、還原 后觸發的回調
類型:Function,默認:null
攜帶一個參數,即當前層DOM
內置方法
layer.config(options) - 初始化全局配置
這是一個可以重要也可以不重要的方法,重要的是,它的權利真的很大,尤其是在模塊化加載layer時,你會發現你必須要用到它。它不僅可以配置一些諸如路徑、加載的模塊,甚至還可以決定整個彈層的默認參數。而說它不重要,是因為多數情況下,你會發現,你似乎不是那么十分需要它。但你真的需要認識一下這位伙計。
如果您是采用seajs
或者requirejs
加載layer,你需要執行該方法來完成初始化的配置。比如:
1 layer.config({ 2 path: '/res/layer/' //layer.js所在的目錄,可以是絕對目錄,也可以是相對目錄 3 }); 4 //這樣的話,layer就會去加載一些它所需要的配件,比如css等。 5 //當然,你即便不用seajs或者requirejs,也可以通過上述方式設定路徑
如果你是采用<script src="?a.js&layer.js">這種合並的方式引入layer,那么您需要在script標簽上加一個自定義屬性merge="true"。如:
1 <script src="?a.js&layer.js" merge="true"> 2 3 這樣的話,layer就不會去自動去獲取路徑,但你需要通過以下方式來完成初始化的配置 4 layer.config({ 5 path: '/res/layer/' //layer.js所在的目錄,可以是絕對目錄,也可以是相對目錄 6 });
但layer.config的作用遠不止上述這樣。它還可以配置layer的拓展模塊
,以及默認的基礎參數
,如:
1 layer.config({ 2 extend: 'extend/layer.ext.js', //注意,目錄是相對layer.js根目錄。如果加載多個,則 [a.js, b.js, …] 3 shift: 1, //默認動畫風格 4 skin: 'layui-layer-molv' //默認皮膚 5 … 6 }); 7 8 //除此之外,extend還允許你加載css。這對於layer的第三方皮膚有極大的幫助,如: 9 layer.config({ 10 extend: [ 11 'extend/layer.ext.js', 12 'skin/layer-ext-myskin/style.css' //layer-ext-myskin即是你拓展的皮膚文件 13 ] 14 }); 15 16 //擴展css的規范:您必須在你擴展中的css文件加上這段 17 html #layui_layer_skinlayer-ext-myskinstylecss{display:none; position: absolute; width:1989px;} 18 規則就是:html #layui_layer_skin{文件夾名}{文件名}css 19 skin名以文件夾名為標准。
layer.ready(path, callback) - 初始化就緒
由於我們的layer內置了輕量級加載器,所以你根本不需要單獨引入css等文件。但是加載總是需要過程的。當你在頁面一打開就要執行彈層時,layer.ready()會是一個不錯的幫手。它也可以做一些layer.config可以做的事,比如指向layer.js所在目錄。但是如果你已經通過layer.config配置了path,你在使用layer.ready時,是不需要path的,如:
1 //頁面一打開就執行彈層 2 layer.ready(function(){ 3 layer.msg('很高興一開場就見到你'); 4 });
layer.open(options) - 原始核心方法
基本上是露臉率最高的方法,不管是使用哪種方式創建層,都是走layer.open()
,創建任何類型的彈層都會返回一個當前層索引,上述的options即是基礎參數
,另外,該文檔統一采用options作為基礎參數的標識
例子:
1 var index = layer.open({ 2 content: 'test' 3 }); 4 //拿到的index是一個重要的憑據,它是諸如layer.close(index)等方法的必傳參數。
layer.alert(content, options, yes) - 普通信息框
它的彈出似乎顯得有些高調,一般用於對用戶造成比較強烈的關注,類似系統alert,但卻比alert更靈便。它的參數是自動向左補齊的。通過第二個參數,可以設定各種你所需要的基礎參數,但如果你不需要的話,直接寫回調即可。如
1 //eg1 2 layer.alert('只想簡單的提示'); 3 //eg2 4 layer.alert('加了個圖標', {icon: 1}); //這時如果你也還想執行yes回調,可以放在第三個參數中。 5 //eg3 6 layer.alert('有了回調', function(index){ 7 //do something 8 9 layer.close(index); 10 });
layer.confirm(content, options, yes, cancel) - 詢問框
類似系統confirm,但卻遠勝confirm,另外它不是和系統的confirm一樣阻塞
你需要把交互的語句放在回調體中。同樣的,它的參數也是自動補齊的。
1 //eg1 2 layer.confirm('is not?', {icon: 3, title:'提示'}, function(index){ 3 //do something 4 5 layer.close(index); 6 }); 7 //eg2 8 layer.confirm('is not?', function(index){ 9 //do something 10 11 layer.close(index); 12 });
layer.msg(content, options, end) - 提示框
我在源碼中有了相對較大的篇幅來定制了這個msg,目的是想將其打造成露臉率最高的提示框。而事實上我的確也在大量地使用它。因為它簡單,而且足夠得自覺,它不僅占據很少的面積,而且默認還會3秒后自動消失
所有這一切都決定了我對msg的愛。因此我賦予了她許多可能
在外形方面,它堅持簡陋的變化,在作用方面,他堅持零用戶操作。而且它的參數也是機會自動補齊的。
1 //eg1 2 layer.msg('只想弱弱提示'); 3 //eg2 4 layer.msg('有表情地提示', {icon: 6}); 5 //eg3 6 layer.msg('關閉后想做些什么', function(){ 7 //do something 8 }); 9 //eg 10 layer.msg('同上', { 11 icon: 1, 12 time: 2000 //2秒關閉(如果不配置,默認是3秒) 13 }, function(){ 14 //do something 15 });
layer.load(icon, options) - 加載層
type:3的深度定制。load並不需要你傳太多的參數,但如果你不喜歡默認的加載風格,你還有選擇空間。icon支持傳入0-2
如果是0,無需傳。另外特別注意一點:load默認是不會自動關閉的
,因為你一般會在ajax回調體中關閉它。
1 //eg1 2 var index = layer.load(); 3 //eg2 4 var index = layer.load(1); //換了種風格 5 //eg3 6 var index = layer.load(2, {time: 10*1000}); //又換了種風格,並且設定最長等待10秒 7 8 //關閉 9 layer.close(index);
layer.tips(content, follow, options) - tips層
type:4的深度定制。也是我本人比較喜歡的一個層類型,因為它擁有和msg一樣的低調和自覺,而且會智能定位
,即靈活地判斷它應該出現在哪邊。默認是在元素右邊彈出
1 //eg1 2 layer.tips('只想提示地精准些', '#id'); 3 //eg 2 4 $('#id').on('click', function(){ 5 var that = this; 6 layer.tips('只想提示地精准些', that); //在元素的事件回調體中,follow直接賦予this即可 7 }); 8 //eg 3 9 layer.tips('在上面', '#id', { 10 tips: 1 11 });
layer.close(index) - 關閉特定層
關於它似乎沒有太多介紹的必要,唯一讓你疑惑的,可能就是這個index
了吧
事實上它非常容易得到。
1 //當你想關閉當前頁的某個層時 2 var index = layer.open(); 3 var index = layer.alert(); 4 var index = layer.load(); 5 var index = layer.tips(); 6 //正如你看到的,每一種彈層調用方式,都會返回一個index 7 layer.close(index); //此時你只需要把獲得的index,輕輕地賦予layer.close即可 8 9 //當你在iframe頁面關閉自身時 10 var index = parent.layer.getFrameIndex(window.name); //先得到當前iframe層的索引 11 parent.layer.close(index); //再執行關閉
layer.closeAll(type) - 關閉所有層
如果你很懶,你不想去獲取index
你只想關閉。那么closeAll真的可以幫上你。如果你不指向層類型的話,它會銷毀掉當前頁所有的layer層。當然,如果你只想關閉某個類型的層,那么你可以
1 layer.closeAll(); //瘋狂模式,關閉所有層 2 layer.closeAll('dialog'); //關閉信息框 3 layer.closeAll('page'); //關閉所有頁面層 4 layer.closeAll('iframe'); //關閉所有的iframe層 5 layer.closeAll('loading'); //關閉加載層 6 layer.closeAll('tips'); //關閉所有的tips層
layer.style(index, cssStyle) - 重新定義層的樣式
cssStyle允許你傳入任意的css屬性
1 //重新給指定層設定width、top等 2 layer.style(index, { 3 width: '1000px', 4 top: '10px' 5 });
layer.title(title, index) - 改變層的標題
使用方式:layer.title('標題變了', index)
layer.getChildFrame(selector, index) - 獲取iframe頁的DOM
當你試圖在當前頁獲取iframe頁的DOM元素時,你可以用此方法。selector即iframe頁的選擇器
1 layer.open({ 2 type: 2, 3 content: 'test/iframe.html', 4 success: function(layero, index){ 5 var body = layer.getChildFrame('body', index); 6 var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe頁的窗口對象,執行iframe頁的方法:iframeWin.method(); 7 console.log(body.html()) //得到iframe頁的body內容 8 body.find('input').val('Hi,我是從父頁來的') 9 } 10 });
layer.getFrameIndex(windowName) - 獲取特定iframe層的索引
此方法一般用於在iframe頁關閉自身時用到。
1 //假設這是iframe頁 2 var index = parent.layer.getFrameIndex(window.name); //先得到當前iframe層的索引 3 parent.layer.close(index); //再執行關閉
layer.iframeAuto(index) - 指定iframe層自適應
調用該方法時,iframe層的高度會重新進行適應
layer.iframeSrc(index, url) - //重置特定iframe url
似乎不怎么常用的樣子。使用方式:layer.iframeSrc(index, 'http://sentsin.com')
layer.setTop(layero) -置頂當前窗口
非常強大的一個方法,雖然一般很少用。但是當你的頁面有很多很多layer窗口,你需要像Window窗體那樣,點擊某個窗口,該窗體就置頂在上面,那么setTop可以來輕松實現。它采用巧妙的邏輯,以使這種置頂的性能達到最優
1 //通過這種方式彈出的層,每當它被選擇,就會置頂。 2 layer.open({ 3 type: 2, 4 shade: false, 5 area: '500px', 6 maxmin: true, 7 content: 'http://www.layui.com', 8 zIndex: layer.zIndex, //重點1 9 success: function(layero){ 10 layer.setTop(layero); //重點2 11 } 12 });
layer.full()、layer.min()、layer.restore() - 手工執行最大小化
一般用於在自定義元素上觸發最大化、最小化和全屏。
擴展方法
請注意,擴展方法依賴於layer.ext.js,默認不會加載,必須進行以下配置才可使用:
1 layer.config({ 2 extend: 'extend/layer.ext.js' 3 });
layer.prompt(options, yes) - 輸入層
prompt的參數也是向前補齊的。options不僅可支持傳入基礎參數,還可以傳入prompt專用的屬性。當然,也可以不傳。yes攜帶value 表單值
index 索引
elem 表單元素
1 //prompt層新定制的成員如下 2 { 3 formType: 1, //輸入框類型,支持0(文本)默認1(密碼)2(多行文本) 4 value: '', //初始時的值,默認空字符 5 maxlength: 140, //可輸入文本的最大長度,默認500 6 } 7 8 //例子1 9 layer.prompt(function(value, index, elem){ 10 alert(value); //得到value 11 layer.close(index); 12 }); 13 //例子2 14 layer.prompt({ 15 formType: 2, 16 value: '初始值', 17 title: '請輸入值' 18 }, function(value, index, elem){ 19 alert(value); //得到value 20 layer.close(index); 21 });
layer.tab(options) - tab層
tab層只單獨定制了一個成員,即tab: []
,這個好像沒有什么可介紹的,簡單粗暴看例子
1 layer.tab({ 2 area: ['600px', '300px'], 3 tab: [{ 4 title: 'TAB1', 5 content: '內容1' 6 }, { 7 title: 'TAB2', 8 content: '內容2' 9 }, { 10 title: 'TAB3', 11 content: '內容3' 12 }] 13 });
layer.photos(options) - 相冊層
相冊層,也可以稱之為圖片查看器。它的出場動畫從layer內置的動畫類型中隨機展現。photos支持傳入json和直接讀取頁面圖片兩種方式。如果是json傳入,如下:
$.getJSON('/jquery/layer/test/photos.json', function(json){ layer.photos({ photos: json }); }); //而返回的json需嚴格按照如下格式: { "title": "", //相冊標題 "id": 123, //相冊id "start": 0, //初始顯示的圖片序號,默認0 "data": [ //相冊包含的圖片,數組格式 { "alt": "圖片名", "pid": 666, //圖片id "src": "", //原圖地址 "thumb": "" //縮略圖地址 } ] }
如果是直接從頁面中獲取圖片,那么需要指向圖片的父容器,並且你的img可以設定一些規定的屬性(但不是必須的)。
1 //HTML示例 2 <div id="layer-photos-demo" class="layer-photos-demo"> 3 <img layer-pid="圖片id,可以不寫" layer-src="大圖地址" src="縮略圖" alt="圖片名"> 4 <img layer-pid="圖片id,可以不寫" layer-src="大圖地址" src="縮略圖" alt="圖片名"> 5 </div> 6 7 //調用示例 8 layer.ready(function(){ //為了layer.ext.js加載完畢再執行 9 layer.photos({ 10 photos: '#layer-photos-demo' 11 }); 12 });
第二種方式的圖片查看器顯然更加簡單,因為無需像第一種那樣返回規定的json,但是他們還是有各自的應用場景的,你可以按照你的需求進行選擇。另外,photos還有個tab回調,切換圖片時觸發。
1 layer.photos({ 2 photos: json/選擇器, 3 tab: function(pic, layero){ 4 console.log(pic) //當前圖片的一些信息 5 } 6 });
合理地設定基礎參數,合理地選擇內置方法,合理地運用拓展方法,合理的心態,合理地閱讀,只要一切都在合理的前提下,你才會感知到layer許許多多令人愉悅的地方,她真的是否如你所願,取決於你對她了解的深遠。願layer能給你的web開發帶來一段美妙的旅程。相信這一版的API文檔,也會給你帶來全新的便捷。