如你所見,layDate 在 layui 2.0 的版本中迎來一次重生。無論曾經(jīng)它給你帶來過多么糟糕的體驗(yàn),從今往后,所有的舊坑都將彌合。全面重寫的 layDate 包含了大量的更新,其中主要以:年選擇器、年月選擇器、日期選擇器、時(shí)間選擇器、日期時(shí)間選擇器 五種類型的選擇方式為基本核心,并且均支持范圍選擇(即雙控件)。內(nèi)置強(qiáng)勁的自定義日期格式解析和合法校正機(jī)制,含中文版和國際版,主題簡(jiǎn)約卻又不失靈活多樣。由于內(nèi)部采用的是零依賴的原生 JavaScript 編寫,因此又可作為獨(dú)立組件使用。毫無疑問,這是 layui 的虔心之作。
模塊加載名稱:laydate,獨(dú)立版本:http://www.layui.com/laydate/
和 layer 一樣,你可以在 layui 中使用 layDate,也可直接使用 layDate 獨(dú)立版,請(qǐng)按照你的實(shí)際需求來選擇。
場(chǎng)景 | 用前準(zhǔn)備 | 調(diào)用方式 |
---|---|---|
1. 在 layui 模塊中使用 | 下載 layui 后,引入layui.css和layui.js即可 | 通過layui.use('laydate', callback)加載模塊后,再調(diào)用方法 |
2. 作為獨(dú)立組件使用 | 去 layDate 獨(dú)立版本官網(wǎng)下載組件包,引入 laydate.js 即可 | 直接調(diào)用方法使用 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>layDate快速使用</title> <link rel="stylesheet" href="/static/build/layui.css" media="all"> </head> <body> <div class="layui-inline"> <!-- 注意:這一層元素并不是必須的 --> <input type="text" class="layui-input" id="test1"> </div> <script src="/static/build/layui.js"></script> <script> layui.use('laydate', function(){ var laydate = layui.laydate; //執(zhí)行一個(gè)laydate實(shí)例 laydate.render({ elem: '#test1' //指定元素 }); }); </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>使用 layDate 獨(dú)立版</title> </head> <body> <input type="text" id="test1"> <script src="laydate.js"></script> <script> //執(zhí)行一個(gè)laydate實(shí)例 laydate.render({ elem: '#test1' //指定元素 }); </script> </body> </html>
除了在組件加載方式有一些小小的不同,其它都完全類似
通過核心方法:laydate.render(options) 來設(shè)置基礎(chǔ)參數(shù),也可以通過方法:laydate.set(options) 來設(shè)定全局基礎(chǔ)參數(shù).
類型:String/DOM,默認(rèn)值:無
必填項(xiàng),用于綁定執(zhí)行日期渲染的元素,值一般為選擇器,或DOM對(duì)象
laydate.render({ elem: '#test' //或 elem: document.getElementById('test')、elem: lay('#test') 等 });
類型:String,默認(rèn)值:date
用于單獨(dú)提供不同的選擇器類型,可選值如下表:
type可選值 | 名稱 | 用途 |
---|---|---|
year | 年選擇器 | 只提供年列表選擇 |
month | 年月選擇器 | 只提供年、月選擇 |
date | 日期選擇器 | 可選擇:年、月、日。type默認(rèn)值,一般可不填 |
time | 時(shí)間選擇器 | 只提供時(shí)、分、秒選擇 |
datetime | 日期時(shí)間選擇器 | 可選擇:年、月、日、時(shí)、分、秒 |
//年選擇器 laydate.render({ elem: '#test' ,type: 'year' }); //年月選擇器 laydate.render({ elem: '#test' ,type: 'month' }); //日期選擇器 laydate.render({ elem: '#test' //,type: 'date' //默認(rèn),可不填 }); //時(shí)間選擇器 laydate.render({ elem: '#test' ,type: 'time' }); //日期時(shí)間選擇器 laydate.render({ elem: '#test' ,type: 'datetime' });
類型:Boolean/String/Array,默認(rèn)值:false
如果設(shè)置 true,將默認(rèn)采用 “ - ” 分割。 你也可以直接設(shè)置 分割字符。五種選擇器類型均支持左右面板的范圍選擇。
//日期范圍選擇 laydate.render({ elem: '#test' ,range: true //或 range: '~' 來自定義分割字符 }); //日期時(shí)間范圍選擇 laydate.render({ elem: '#test' ,type: 'datetime' ,range: true }); //時(shí)間范圍選擇 laydate.render({ elem: '#test' ,type: 'time' ,range: true }); //年范圍選擇 laydate.render({ elem: '#test' ,type: 'year' ,range: true }); //年月范圍選擇 laydate.render({ elem: '#test' ,type: 'month' ,range: true });
如果您要將開始時(shí)間和結(jié)束時(shí)間分開,那么還可以將 range 參數(shù)設(shè)置為數(shù)組,如:
<div class="layui-form-item"> <div class="layui-inline"> <label class="layui-form-label">日期范圍</label> <div class="layui-inline" id="test-range"> <div class="layui-input-inline"> <input type="text" id="startDate" class="layui-input" placeholder="開始日期"> </div> <div class="layui-form-mid">-</div> <div class="layui-input-inline"> <input type="text" id="endDate" class="layui-input" placeholder="結(jié)束日期"> </div> </div> </div> </div> <script> laydate.render({ elem: '#test-range' //開始時(shí)間和結(jié)束時(shí)間所在 input 框的父選擇器 //設(shè)置開始日期、日期日期的 input 選擇器 ,range: ['#startDate', '#endDate'] //數(shù)組格式為 layui 2.6.6 開始新增 }); </script>
類型:String,默認(rèn)值:yyyy-MM-dd
通過日期時(shí)間各自的格式符和長(zhǎng)度,來設(shè)定一個(gè)你所需要的日期格式。layDate 支持的格式如下:
格式符 | 說明 |
---|---|
yyyy | 年份,至少四位數(shù)。如果不足四位,則前面補(bǔ)零 |
y | 年份,不限制位數(shù),即不管年份多少位,前面均不補(bǔ)零 |
MM | 月份,至少兩位數(shù)。如果不足兩位,則前面補(bǔ)零。 |
M | 月份,允許一位數(shù)。 |
dd | 日期,至少兩位數(shù)。如果不足兩位,則前面補(bǔ)零。 |
d | 日期,允許一位數(shù)。 |
HH | 小時(shí),至少兩位數(shù)。如果不足兩位,則前面補(bǔ)零。 |
H | 小時(shí),允許一位數(shù)。 |
mm | 分鐘,至少兩位數(shù)。如果不足兩位,則前面補(bǔ)零。 |
m | 分鐘,允許一位數(shù)。 |
ss | 秒數(shù),至少兩位數(shù)。如果不足兩位,則前面補(bǔ)零。 |
s | 秒數(shù),允許一位數(shù)。 |
通過上述不同的格式符組合成一段日期時(shí)間字符串,可任意排版,如下所示:
格式 | 示例值 |
---|---|
yyyy-MM-dd HH:mm:ss | 2017-08-18 20:08:08 |
yyyy年MM月dd日 HH時(shí)mm分ss秒 | 2017年08月18日 20時(shí)08分08秒 |
yyyyMMdd | 20170818 |
dd/MM/yyyy | 18/08/2017 |
yyyy年M月 | 2017年8月 |
M月d日 | 8月18日 |
北京時(shí)間:HH點(diǎn)mm分 | 北京時(shí)間:20點(diǎn)08分 |
yyyy年的M月某天晚上,大概H點(diǎn) | 2017年的8月某天晚上,大概20點(diǎn) |
//自定義日期格式 laydate.render({ elem: '#test' ,format: 'yyyy年MM月dd日' //可任意組合 });
類型:String,默認(rèn)值:new Date()
支持傳入符合format參數(shù)設(shè)定的日期格式字符,或者 new Date()
//傳入符合format格式的字符給初始值 laydate.render({ elem: '#test' ,value: '2018-08-18' //必須遵循format參數(shù)設(shè)定的格式 }); //傳入Date對(duì)象給初始值 laydate.render({ elem: '#test' ,value: new Date(1534766888000) //參數(shù)即為:2018-08-20 20:08:08 的時(shí)間戳 });
類型:Boolean,默認(rèn)值:true
用于控制是否自動(dòng)向元素填充初始值(需配合 value 參數(shù)使用)
laydate.render({ elem: '#test' ,value: '2017-09-10' ,isInitValue: false //是否允許填充初始值,默認(rèn)為 true });
注意:該參數(shù)為 layui 2.3.0 新增。
類型:Boolean,默認(rèn)值:true
用于控制是否顯示當(dāng)前結(jié)果的預(yù)覽(type 為 datetime 時(shí)不開啟)
laydate.render({ elem: '#test' ,isPreview: false //禁用面板左下角選擇值的預(yù)覽,默認(rèn) true });
注意:該參數(shù)為 layui 2.6.6 新增。
類型:string,默認(rèn)值:min: '1900-1-1'、max: '2099-12-31'
設(shè)定有限范圍內(nèi)的日期或時(shí)間值,不在范圍內(nèi)的將不可選中。這兩個(gè)參數(shù)的賦值非常靈活,主要有以下幾種情況:
1. | 如果值為字符類型,則:年月日必須用 -(中劃線)分割、時(shí)分秒必須用 :(半角冒號(hào))號(hào)分割。這里并非遵循 format 設(shè)定的格式 |
2. | 如果值為整數(shù)類型,且數(shù)字<86400000,則數(shù)字代表天數(shù),如:min: -7,即代表最小日期在7天前,正數(shù)代表若干天后 |
3. | 如果值為整數(shù)類型,且數(shù)字 ≥ 86400000,則數(shù)字代表時(shí)間戳,如:max: 4073558400000,即代表最大日期在:公元3000年1月1日 |
//日期有效范圍只限定在:2017年 laydate.render({ elem: '#test' ,min: '2017-1-1' ,max: '2017-12-31' }); //日期有效范圍限定在:過去一周到未來一周 laydate.render({ elem: '#test' ,min: -7 //7天前 ,max: 7 //7天后 }); //日期時(shí)間有效范圍的設(shè)定: laydate.render({ elem: '#test' ,type: 'datetime' ,min: '2017-8-11 12:30:00' ,max: '2017-8-18 12:30:00' }); //時(shí)間有效范圍設(shè)定在: 上午九點(diǎn)半到下午五點(diǎn)半 laydate.render({ elem: '#test' ,type: 'time' ,min: '09:30:00' ,max: '17:30:00' });
毫不保留地說,min和max參數(shù)是兩個(gè)非常強(qiáng)大的存在,合理運(yùn)用,可幫助用戶在日期與時(shí)間的選擇上帶來更為友好的約束與體驗(yàn)。
類型:String,默認(rèn)值:focus,如果綁定的元素非輸入框,則默認(rèn)事件為:click
//自定義事件 laydate.render({ elem: '#test' ,trigger: 'click' //采用click彈出 });
類型:Boolean,默認(rèn)值:false
如果設(shè)置: true,則控件默認(rèn)顯示在綁定元素的區(qū)域。通常用于外部事件調(diào)用控件,如:
//默認(rèn)顯示 laydate.render({ elem: '#test' ,show: true //直接顯示 }); //外部事件調(diào)用 lay('#test1').on('click', function(e){ //假設(shè) test1 是一個(gè)按鈕 laydate.render({ elem: '#test' ,show: true //直接顯示 ,closeStop: '#test1' //這里代表的意思是:點(diǎn)擊 test1 所在元素阻止關(guān)閉事件冒泡。如果不設(shè)定,則無法彈出控件 }); });
類型:String,默認(rèn)值:absolute
用于設(shè)定控件的定位方式,有以下三種可選值:
position 可選值 | 說明 |
---|---|
abolute | 絕對(duì)定位,始終吸附在綁定元素周圍。默認(rèn)值 |
fixed | 固定定位,初始吸附在綁定元素周圍,不隨瀏覽器滾動(dòng)條所左右。一般用于在固定定位的彈層中使用。 |
static |
靜態(tài)定位,控件將直接嵌套在指定容器中。
注意:請(qǐng)勿與 show 參數(shù)的概念搞混淆。show為 true 時(shí),控件仍然是采用絕對(duì)或固定定位。而這里是直接嵌套顯示 |
下面是一個(gè)直接嵌套顯示的例子:
【HTML】 <span id="testView"></span> <div id="test2"></div> 【JS】: //嵌套在指定容器中 laydate.render({ elem: '#test2' ,position: 'static' ,change: function(value, date){ //監(jiān)聽日期被切換 lay('#testView').html(value); } });
類型:Number,默認(rèn)值:66666666
一般用于解決與其它元素的互相被遮掩的問題。如果 position 參數(shù)設(shè)為 static 時(shí),該參數(shù)無效。
//設(shè)定控件的層疊順序 laydate.render({ elem: '#test' ,zIndex: 99999999 });
類型:Boolean,默認(rèn)值:true
如果設(shè)置 false,將不會(huì)顯示控件的底部欄區(qū)域
//不顯示底部欄 laydate.render({ elem: '#test' ,showBottom: false });
類型:Array,默認(rèn)值:['clear', 'now', 'confirm']
右下角顯示的按鈕,會(huì)按照數(shù)組順序排列,內(nèi)置可識(shí)別的值有:clear、now、confirm
//只顯示清空和確認(rèn) laydate.render({ elem: '#test' ,btns: ['clear', 'confirm'] });
類型:String,默認(rèn)值:cn
我們內(nèi)置了兩種語言版本:cn(中文版)、en(國際版,即英文版)。這里并沒有開放自定義文字,是為了避免繁瑣的配置。
//國際版 laydate.render({ elem: '#test' ,lang: 'en' });
類型:String,默認(rèn)值:default
我們內(nèi)置了多種主題,theme的可選值有:default(默認(rèn)簡(jiǎn)約)、molv(墨綠背景)、#顏色值(自定義顏色背景)、grid(格子主題)
//墨綠背景主題 laydate.render({ elem: '#test' ,theme: 'molv' }); //自定義背景色主題 - 非常實(shí)用 laydate.render({ elem: '#test' ,theme: '#393D49' }); //格子主題 laydate.render({ elem: '#test' ,theme: 'grid' });
另外,你還可以傳入其它字符,如:theme: 'xxx',那么控件將會(huì)多出一個(gè) class="laydate-theme-xxx" 的CSS類,以便于你單獨(dú)定制主題。
類型:Boolean,默認(rèn)值:false
我們內(nèi)置了一些我國通用的公歷重要節(jié)日,通過設(shè)置 true 來開啟。國際版不會(huì)顯示。
//允許顯示公歷節(jié)日 laydate.render({ elem: '#test' ,calendar: true });
類型:Object,默認(rèn)值:無
calendar 參數(shù)所代表的公歷節(jié)日更多情況下是一個(gè)擺設(shè)。因此,我們還需要自定義標(biāo)注重要日子,比如結(jié)婚紀(jì)念日?日程等?它分為以下兩種:
標(biāo)注 | 格式 | 說明 |
---|---|---|
每年的日期 | {'0-9-18': '國恥'} | 0 即代表每一年 |
每月的日期 | {'0-0-15': '中旬'} | 0-0 即代表每年每月(layui 2.1.1/layDate 5.0.4 新增) |
特定的日期 | {'2017-8-21': '發(fā)布') | - |
可同時(shí)設(shè)定多個(gè),如:
//標(biāo)注重要日子 var ins1 = laydate.render({ elem: '#test' ,mark: { '0-10-14': '生日' ,'0-12-31': '跨年' //每年12月31日 ,'0-0-10': '工資' //每個(gè)月10號(hào) ,'2017-8-15': '' //具體日期 ,'2017-8-20': '預(yù)發(fā)' //如果為空字符,則默認(rèn)顯示數(shù)字+徽章 ,'2017-8-21': '發(fā)布' } ,done: function(value, date){ if(date.year === 2017 && date.month === 8 && date.date === 15){ //點(diǎn)擊2017年8月15日,彈出提示語 ins1.hint('中國人民抗日戰(zhàn)爭(zhēng)勝利72周年'); } } });
非常實(shí)用的存在,是時(shí)候利用它制作你的日程表了。
控件在打開時(shí)觸發(fā),回調(diào)返回一個(gè)參數(shù):初始的日期時(shí)間對(duì)象
laydate.render({ elem: '#test' ,ready: function(date){ console.log(date); //得到初始的日期時(shí)間對(duì)象:{year: 2017, month: 8, date: 18, hours: 0, minutes: 0, seconds: 0} } });
年月日時(shí)間被切換時(shí)都會(huì)觸發(fā)。回調(diào)返回三個(gè)參數(shù),分別代表:生成的值、日期時(shí)間對(duì)象、結(jié)束的日期時(shí)間對(duì)象
laydate.render({ elem: '#test' ,change: function(value, date, endDate){ console.log(value); //得到日期生成的值,如:2017-08-18 console.log(date); //得到日期時(shí)間對(duì)象:{year: 2017, month: 8, date: 18, hours: 0, minutes: 0, seconds: 0} console.log(endDate); //得結(jié)束的日期時(shí)間對(duì)象,開啟范圍選擇(range: true)才會(huì)返回。對(duì)象成員同上。 } });
點(diǎn)擊日期、清空、現(xiàn)在、確定均會(huì)觸發(fā)?;卣{(diào)返回三個(gè)參數(shù),分別代表:生成的值、日期時(shí)間對(duì)象、結(jié)束的日期時(shí)間對(duì)象
laydate.render({ elem: '#test' ,done: function(value, date, endDate){ console.log(value); //得到日期生成的值,如:2017-08-18 console.log(date); //得到日期時(shí)間對(duì)象:{year: 2017, month: 8, date: 18, hours: 0, minutes: 0, seconds: 0} console.log(endDate); //得結(jié)束的日期時(shí)間對(duì)象,開啟范圍選擇(range: true)才會(huì)返回。對(duì)象成員同上。 } });
事實(shí)上,執(zhí)行核心方法 laydate.render(options) 會(huì)返回一個(gè)當(dāng)前實(shí)例對(duì)象。其中包含一些成員屬性和方法,比如:hint方法
var ins1 = laydate.render({ elem: '#test' ,change: function(value, date, endDate){ ins1.hint(value); //在控件上彈出value值 } });
如果你不是采用 layui 或者普通 script 標(biāo)簽方式加載的 laydate.js,而是采用 requirejs 等其它方式引用 laydate,那么你需要設(shè)置基礎(chǔ)路徑,以便 laydate.css 完成加載。
laydate.path = '/static/xxx/'; //laydate.js 所在目錄 //配置好路徑后,再調(diào)用 laydate.render(options);
除上述之外,如果您采用的是獨(dú)立的 laydate,那么你還可以在動(dòng)態(tài)加載 laydate
之前預(yù)先定義一個(gè)我們約定好的全局對(duì)象:
<script> var LAYUI_GLOBAL = { laydate_dir: '/res/laydate/' //laydate 所在目錄(laydate 5.3.0 開始新增) }; </script>
提示 1:上述只針對(duì)獨(dú)立版 laydate,其 LAYUI_GLOBAL 設(shè)定的 laydate_dir 優(yōu)先級(jí)高于 laydate.path;
提示 2:如果是 layui 加載的 laydate,可以無視上述所有的目錄設(shè)定。前置工作都會(huì)在 layui 內(nèi)部完成。
方法名 | 備注 |
---|---|
laydate.getEndDate(month, year) |
獲取指定年月的最后一天,month默認(rèn)為當(dāng)前月,year默認(rèn)為當(dāng)前年。如:
var endDate1 = laydate.getEndDate(10); //得到31 var endDate2 = laydate.getEndDate(2, 2080); //得到29 |
layDate最早發(fā)布于2014年6月,但當(dāng)時(shí)只迭代了一個(gè)版本,就再也沒有更新。而時(shí)至今日,作為 layui 2.0 的核心組成之一,layDate 再度強(qiáng)勢(shì)復(fù)活,不禁讓人感慨萬千!layDate曾被我定義為:“最失敗的一個(gè)組件”,被我無情擱置了整整三年?,F(xiàn)在,是時(shí)候卸下這個(gè)標(biāo)簽了。
layui - 在每一個(gè)細(xì)節(jié)中,用心與你溝通