Layui日期组件laydate.js:时间选择器完整教程
【免费下载链接】layui 项目地址: https://gitcode.com/gh_mirrors/lay/layui
Layui日期组件(laydate.js)是Layui框架中一款功能强大的时间选择器,支持年、月、日、时、分、秒等多类型选择面板,广泛应用于各类Web表单中。本文将从基础使用到高级定制,全面讲解laydate.js的核心功能与实战技巧,帮助开发者快速掌握这款高效的日期选择解决方案。
组件概述与快速上手
组件定位与优势
laydate.js作为Layui框架的核心模块之一,采用原生JavaScript编写,无需依赖jQuery,具有轻量高效、配置灵活、UI美观等特点。其核心优势包括:
- 多类型选择:支持year/month/date/time/datetime五种基础选择模式
- 范围选择:提供左右面板联动的日期区间选择功能
- 主题定制:内置多种主题风格,支持自定义颜色方案
- 丰富回调:完整的生命周期事件,满足各类交互需求
- 性能优化:DOM操作最小化,初始化速度比同类组件提升30%
组件源码位于src/modules/laydate.js,官方文档可参考docs/laydate/index.md。
基础引入与初始化
使用laydate.js需先引入Layui框架,推荐使用国内CDN加速地址:
<!-- 引入Layui CSS -->
<link rel="stylesheet" href="https://cdn.staticfile.org/layui/2.9.10/css/layui.css">
<!-- 引入Layui JS -->
<script src="https://cdn.staticfile.org/layui/2.9.10/layui.js"></script>
<!-- 日期选择器容器 -->
<input type="text" id="test-laydate" class="layui-input">
<script>
// 初始化组件
layui.use(function(){
var laydate = layui.laydate;
// 基础配置
laydate.render({
elem: '#test-laydate', // 绑定元素
type: 'date', // 选择类型
format: 'yyyy-MM-dd' // 日期格式
});
});
</script>
上述代码将生成一个默认样式的日期选择器,点击输入框即可触发面板显示。完整的基础示例可查看examples/laydate.html。
核心功能详解
多类型选择面板
laydate.js提供五种基础选择类型,通过type属性配置:
| 类型值 | 面板组成 | 应用场景 |
|---|---|---|
| year | 年份列表 | 生日选择、年份筛选 |
| month | 年月选择 | 月度报表、会员周期 |
| date | 年月日选择 | 普通日期输入 |
| time | 时分秒选择 | 会议时间、倒计时设置 |
| datetime | 完整日期时间 | 日志记录、活动排期 |
// 时间选择器示例
laydate.render({
elem: '#time-select',
type: 'time',
format: 'HH:mm:ss',
theme: 'molv' // 使用墨绿主题
});
不同类型的面板展示效果可参考官方文档中的多类型选择器示例。
日期范围选择
范围选择功能通过range属性实现,支持三种配置方式:
- 布尔值模式:
range: true,使用默认"-"分隔符 - 字符串模式:
range: '~',自定义分隔符 - 数组模式:
range: ['#start-date', '#end-date'],分别绑定两个输入框
// 高级范围选择示例
laydate.render({
elem: '#range-select',
range: ['#start', '#end'], // 双输入框模式
rangeLinked: true, // 开启区间联动
min: -7, // 最小日期为7天前
max: 30, // 最大日期为30天后
done: function(value, start, end){
console.log('开始日期:', start);
console.log('结束日期:', end);
}
});
范围选择的完整演示可查看docs/laydate/index.md#demo-range。
日期格式化与解析
laydate.js提供灵活的日期格式化功能,通过format属性定义输出格式,支持的格式符包括:
| 格式符 | 描述 | 示例 |
|---|---|---|
| yyyy | 四位年份 | 2023 |
| y | 简化年份 | 23 |
| MM | 两位月份 | 09 |
| M | 简化月份 | 9 |
| dd | 两位日期 | 05 |
| d | 简化日期 | 5 |
| HH | 24小时制两位小时 | 14 |
| H | 24小时制简化小时 | 14 |
| mm | 两位分钟 | 08 |
| m | 简化分钟 | 8 |
| ss | 两位秒数 | 03 |
| s | 简化秒数 | 3 |
// 自定义格式示例
laydate.render({
elem: '#custom-format',
format: 'yyyy年MM月dd日 HH时mm分',
value: new Date(2023, 8, 5, 14, 8, 3) // 设置初始值
});
上述代码将输出"2023年09月05日 14时08分"格式的日期字符串。更多格式化技巧可参考自定义格式示例。
高级配置与定制
日期限制与禁用
通过min/max属性可限制可选日期范围,支持多种取值方式:
// 日期限制示例
laydate.render({
elem: '#date-limit',
min: '2023-01-01', // 固定最小日期
max: new Date(), // 最大日期为今天
disabledDate: function(date){
// 禁用周末
return date.getDay() === 0 || date.getDay() === 6;
},
disabledTime: function(date){
// 禁用非工作时间
return {
hours: [0,1,2,3,4,5,6,7,18,19,20,21,22,23]
};
}
});
更复杂的日期限制场景可参考限制可选日期示例。
主题定制与样式修改
laydate.js支持丰富的主题定制,通过theme属性实现:
- 内置主题:默认、molv(墨绿)、grid(格子)、circle(圆形)
- 颜色主题:直接传入颜色值,如
theme: '#FF5722' - 双色调主题:数组格式传入主色和辅色,如
theme: ['#16baaa', '#16b777']
// 自定义主题示例
laydate.render({
elem: '#custom-theme',
theme: ['#393D49', '#1E9FFF'], // 主色+辅色
calendar: true, // 显示节日
mark: {
'0-10-1': '国庆节', // 每年10月1日标记
'0-12-25': '圣诞节' // 每年12月25日标记
}
});
主题效果展示可参考自定义主题示例。
快捷选项配置
2.8+版本新增的shortcuts属性支持添加快捷选择栏:
// 快捷选项示例
laydate.render({
elem: '#with-shortcuts',
shortcuts: [
{text: '今天', value: new Date()},
{text: '昨天', value: function(){
var date = new Date();
date.setDate(date.getDate() - 1);
return date;
}},
{text: '近7天', value: function(){
var start = new Date();
start.setDate(start.getDate() - 6);
var end = new Date();
return [start, end]; // 范围选择需返回数组
}}
]
});
详细配置方法可参考快捷选项示例。
回调函数与事件处理
laydate.js提供完整的生命周期回调函数,满足各类交互需求:
主要回调函数
| 函数名 | 触发时机 | 参数说明 |
|---|---|---|
| ready | 面板打开时 | date: 初始日期对象 |
| change | 日期切换时 | value: 日期字符串, date: 日期对象, endDate: 结束日期对象(范围选择时) |
| done | 选择完成时 | 同上 |
| close | 面板关闭时 | 无参数 |
// 回调函数综合示例
laydate.render({
elem: '#callback-demo',
done: function(value, date, endDate){
// 选择完成后执行
layer.msg('选择结果: ' + value);
console.log('日期对象:', date);
if(endDate) console.log('结束日期:', endDate);
},
change: function(value, date){
// 日期变更时执行
console.log('变更后的日期:', value);
},
close: function(){
console.log('面板已关闭');
}
});
方法调用与实例操作
除了配置项,laydate.js还提供方法级别的操作接口:
// 获取实例并操作
var ins = laydate.render({
elem: '#operate-demo',
id: 'date-ins' // 必须指定id
});
// 外部调用示例
document.getElementById('btn-close').onclick = function(){
laydate.close('date-ins'); // 关闭面板
};
document.getElementById('btn-hint').onclick = function(){
laydate.hint('date-ins', { // 显示提示
content: '请选择有效的日期',
ms: 2000
});
};
完整的API文档可参考官方文档的API部分。
实战案例与最佳实践
常见场景解决方案
1. 生日选择器
laydate.render({
elem: '#birthday',
type: 'date',
format: 'yyyy-MM-dd',
max: new Date(), // 生日不能是未来日期
theme: 'grid',
done: function(value){
// 计算年龄
var birth = new Date(value);
var now = new Date();
var age = now.getFullYear() - birth.getFullYear();
if(now.getMonth() < birth.getMonth() ||
(now.getMonth() === birth.getMonth() && now.getDate() < birth.getDate())){
age--;
}
document.getElementById('age').value = age;
}
});
2. 活动时间选择
laydate.render({
elem: '#activity-time',
type: 'datetime',
range: true,
min: new Date(),
theme: '#FF5722',
shortcuts: [
{text: '一天', value: function(){
var start = new Date();
var end = new Date();
end.setDate(end.getDate() + 1);
return [start, end];
}},
{text: '三天', value: function(){
var start = new Date();
var end = new Date();
end.setDate(end.getDate() + 3);
return [start, end];
}},
{text: '一周', value: function(){
var start = new Date();
var end = new Date();
end.setDate(end.getDate() + 7);
return [start, end];
}}
]
});
性能优化建议
- 批量渲染:对于多个同类型日期选择器,使用类选择器批量渲染
// 批量渲染示例
laydate.render({
elem: '.batch-date', // 类选择器
type: 'date',
format: 'yyyy-MM-dd'
});
- 事件委托:动态生成的元素使用事件委托方式初始化
// 事件委托示例
layui.use(function(){
var laydate = layui.laydate;
// 委托给父容器
document.getElementById('dynamic-container').addEventListener('click', function(e){
var target = e.target;
if(target.classList.contains('dynamic-date')){
laydate.render({
elem: target,
type: 'date',
trigger: 'click' // 触发事件
});
}
});
});
- 静态定位:在弹窗中使用时,设置
position: 'fixed'避免滚动问题
// 弹窗中使用示例
laydate.render({
elem: '#modal-date',
position: 'fixed', // 固定定位
zIndex: 100000 // 提高层级
});
常见问题与解决方案
样式冲突问题
若页面中其他CSS影响laydate样式,可通过以下方式解决:
- 提高选择器优先级:在自定义CSS中使用更具体的选择器
- 重置样式:在面板容器上添加自定义class,并重写样式
- 使用iframe隔离:极端情况下可将日期选择器放入iframe中
日期格式转换
laydate返回的日期字符串如需转换为其他格式,可使用Layui的util工具:
// 日期格式转换示例
var util = layui.util;
var dateStr = '2023-09-05';
var timestamp = util.strToTime(dateStr); // 转换为时间戳
var formatStr = util.toDateString(timestamp, 'yyyy年MM月dd日'); // 转换为中文格式
移动端适配
laydate.js已内置移动端适配,但仍需注意:
- 触发区域:在小屏设备上适当增大触发元素尺寸
- 弹出位置:设置
position: 'fixed'确保在移动设备上正常显示 - 简化面板:移动端可适当减少不必要的功能,如隐藏快捷栏
总结与扩展阅读
laydate.js作为一款成熟的日期选择组件,凭借其丰富的功能和灵活的配置,能够满足大多数Web项目的日期选择需求。通过本文的介绍,相信开发者已经掌握了其核心用法和高级技巧。
扩展学习资源
- 官方文档:docs/laydate/index.md
- 示例代码:examples/laydate.html
- API参考:docs/laydate/index.md#api
- 源码研究:src/modules/laydate.js
版本更新日志
laydate.js持续迭代优化,重要版本更新包括:
- 2.7+:新增close方法、position属性增强
- 2.8+:新增shortcuts快捷栏、shade遮罩、多主题数组配置
- 2.9+:新增disabledDate/disabledTime回调、cellRender自定义单元格
建议开发者定期关注官方更新,以便使用最新特性和修复已知问题。
通过合理利用laydate.js的各项功能,能够为用户提供流畅直观的日期选择体验,同时大幅减少开发工作量。希望本文能成为开发者使用laydate.js的实用指南。
【免费下载链接】layui 项目地址: https://gitcode.com/gh_mirrors/lay/layui
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



