基础知识
首先,需要知道new Date()这个参数的基本使用:
- 传入new Date(2017, 4, 20),的时候,由于月份的索引是从0-11的,所以,传入2017, 4, 20的时候,实际的显示的月份是2017年5月20日
- 月份和日期位会自动进位和退位,例如月份位小于0大于11,日期位等于小于0和大于本月日期数
- 拿到当月第一天是这样写的:new Date(year, month-1, 1)
- 拿到当月最后一天是这样写的:new Date(year, month, 0)
- .getDay()获取的的是这个日期的星期几,星期一~星期天对应[1, 2, 3, 4, 5, 6, 0]
其次,需要知道js的一些新的API:
- document.querySelector()获取的是CSS选择器,即传入的参数是’.exampleClass’或’.#exampleID’,需要将字符串传进去,获取的就是第一个匹配的class
- 如果想获取多个同class的CSS选择器,使用document.querySelectorAll
- $element.classList.add()可以添加class
- $element.classList.remove()可以移除特定class
- $element.dataset.xx可以访问到dom元素里自定义属性data-xx,返回的值就是xx
- 注意好编码习惯,例如一个dom元素起名就用$开头,如$wrapper
开发思路
日历中,首先需要知道这个月的第一天是星期几,这个月的最后一天的日期,上个月最后一天的日期。
这个日历中,是7*6行,用i做遍历。分析图如下图:
首先要分析上个月的日期,在这个月的日历中会显示多少个。这个月的1号是星期四,那么前面就有3个上个月的。所以上个月日期的数量是这个月第一天的星期-1
其次要计算出真实日期date(1是这个月第一天,那么0就是上个月的最后一天,-1就是上个月的倒数第二天)。公式:i - 上个月日期数 + 1
算完真实日期,那么要计算显示的日期,由于date等于0小于0就是说明上个月的,假设上个月最后一天是31号,date为0,倒数第二天是30号,date为-1,那么上个月显示的日期就是利用上个月的最后一天加上date的值(这里date为负数)
算完上个月的,就要算下个月的日期在这个月日历中显示的。可以看出,当真实日期date大于本月的最后一天的日期时,就说明后面的都是下个月的日期,那么显示的日期就是date减去这个月最后一天的日期
计算日期的代码:
datepicker.js
1 | (() => { |
渲染和事件行为代码:
main.js
1 | (() => { |
CSS代码:
style.css
1 | .ui-datepicker-wrapper { |
html使用方法:
先加载datepicker.js,然后加载main.js,在html里创建一个input元素,给这个input元素设置一个classname,然后传入这个css选择器:
1 | datepicker.init('.datepicker', 2017, 5); |
可以传入年月,这个是真实日期,不用修正,也可以不传
主要实现功能
- 点击元素打开datepicker
- 日历渲染
- 上下月切换
- 区分本月和不是本月的日期
- 高亮当天日期
- toolTip显示日期具体信息
- 点击日期输入
- 点击document收起datepicker