日历插件演示

by lxjwlt

HTML

<div class="calendar">
    <h3 class="calendar__title">April 2014</h3>
    <a href="#" class="calendar__prev-button"></a>
    <a href="#" class="calendar__next-button"></a>
    <ul class="calendar__week-title-block">
        <li class="calendar__week-title">Sun</li>
        <li class="calendar__week-title">Mon</li>
        <li class="calendar__week-title">Tue</li>
        <li class="calendar__week-title">Wed</li>
        <li class="calendar__week-title">Thu</li>
        <li class="calendar__week-title">Fri</li>
        <li class="calendar__week-title">Sat</li>
    </ul>
    <ul class="calendar__day-block"></ul>
</div>

CSS

.calendar {
  width: 270px;
  margin: auto;
  position: relative;
}

.calendar__title {
  padding: 8px;
  font-size: 14px;
  text-align: center;
  border-bottom: 2px solid #e0e0e0;
}

.calendar__prev-button {
  display: block;
  width: 0px;
  height: 0px;
  border-style: dashed;
  border-color: transparent;
  border-width: 6px;
  border-right-color: #686868;
  border-right-style: solid;
  position: absolute;
  left: 0;
  top: 14px;
}

.calendar__next-button {
  display: block;
  width: 0px;
  height: 0px;
  border-style: dashed;
  border-color: transparent;
  border-width: 6px;
  border-left-color: #686868;
  border-left-style: solid;
  position: absolute;
  right: 0;
  top: 14px;
}

.calendar__week-title {
    font-size: 12px;
}

.calendar__week-title, .calendar__day {
  width: 13%;
  float: left;
  color: #868686;
  margin-left: 1.5%;
  text-align: center;
}

.calendar__week-title:first-child, .calendar__day:first-child {
  margin-left: 0;
}

.calendar__day {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  margin-bottom: 1.5%;
  border: 1px solid #e0e0e0;
  font-size: 18px;
  text-align: center;
  color: #868686;
  font-weight: bold;
}

.calendar__day:nth-child(7n+1) {
  margin-left: 0;
}

.calendar__day:nth-child(7n) {
  background-color: #00a2d1;
}

.calendar__day--first {
  color: #000;
}

.calendar__day--first ~ .calendar__day {
  color: #000;
}

.calendar__day--last ~ .calendar__day {
  color: #868686;
}

JavaScript

$.fn.createCalendar = function () {
    
    // 返回一个对象,包含:
    // - 日期数组
    // - 该月第一天 在数组中的索引值
    // - 该月最后一天 在数组中的索引值
    var getMonthInfo = function (year, month) {
        
        var arr = [],
            
            // 该月份的天数
            totalDays = new Date(year, month + 1, 0).getDate(),
            
            // 前一个月份的天数
            lastTotalDays = new Date(year, month, 0).getDate(),
            
            // 该月1日的星期
            weekDay = new Date(year, month, 1).getDay(),
            
            len = 42,
            i, num;
        
        if (weekDay === 0) weekDay = 7;
        
        // 填充前一个月的日期
        for (i = weekDay - 1, num = lastTotalDays; i >= 0; i--, num--) {
            arr[i] = num;
        }
        
        // 填充该月及下一月的日期
        for (i = weekDay, num = 1; i < 42; i++, num++) {
            arr[i] = num > totalDays ? num - totalDays : num;
        }
        
        return {
            dayArr: arr,
            firstDay: weekDay,
            lastDay: weekDay + totalDays - 1
        };
        
    };
    
    var getDayHTML = function (arr, first, last) {
        var str = '',
            elem, i, len;
        
        for (i = 0, len = arr.length; i < len; i++) {
            str += '<li>' + arr[i] + '</li>';
        }
        
        elem = $(str);
        
        // 分配类名
        elem.addClass('calendar__day')
        .eq(first)
        .addClass('calendar__day--first')
        .end()
        .eq(last)
        .addClass('calendar__day--last');
        
        
        return elem;
    };
    
    return this.each(function () {
        var $me = $(this),
            currentTime = new Date(),
            currentYear = currentTime.getFullYear(),
            currentMonth = currentTime.getMonth();
        
        $me
        // 绘制
        .on('draw.calendar', function (e, year, month) {
            var $this = $(this),
                obj = getMonthInfo(year, month),
                str = getDayHTML(obj.dayArr, obj.firstDay,...