日历控件

这个日历控件可以灵活的应用到pc/wap站,可以选择下拉加载更多月份/点击左右按钮切换上月下月/可以固定的显示json数据中相应的月份

html

<div class="calendar-con">
					<div class="calendar">
						<div class="calendar-btn">
							<a class="leftbtn" href="javascript:;"></a>
							<h3></h3>
							<a class="rightbtn" href="javascript:;"></a>
						</div>
						<ol class="title">
							<li>日</li>
							<li>一</li>
							<li>二</li>
							<li>三</li>
							<li>四</li>
							<li>五</li>
							<li>六</li>
						</ol>
						<div class="content">

						</div>
					</div>
				</div>

  css

.calendar {
	margin: 0 20px;
	 calc(100% - 40px);
}

.calendar .title {
	display: flex;
}

.calendar .title li {
	flex: 1;
	height: 40px;
	line-height: 40px;
}

.calendar .list ul {
	display: flex;
	flex-wrap: wrap;
}

.calendar .list ul li {
	text-align: center;
	height: 40px;
	font-size: 14px;
	color: #000;
	text-decoration: initial;
	letter-spacing: 0.6px;
	border-radius: 50%;
	 calc(100%/ 7);
	position: relative;
	cursor: pointer;
	line-height: 40px;
	 40px;
	margin-right: 16px;
}
.calendar .list ul li:nth-child(7n){
	margin-right: 0;
}
.calendar .list ul li:nth-child(7n),
.calendar .list ul li:nth-child(7n+1),
.calendar .title ol li:nth-child(7n),
.calendar .title ol li:nth-child(7n+1) {
	color: #DDA526;
}

.calendar .list ul li.active {
	background-image: linear-gradient(82deg, #0675e6 0%, #021b7a 100%);
    color: #fff;
}

.calendar .calendar-btn {
	margin-top: 10px;
	height: 54px;
	display: flex;
	justify-content: space-between;
	align-items: center;
}

.calendar .calendar-btn a {
	 54px;
	height: 54px;
}

.calendar .calendar-btn a.leftbtn {
	background: url(../src/images/Path@2x.png) no-repeat center;
	background-size: 8px;
}

.calendar .calendar-btn a.rightbtn {
	background: url(../src/images/PathCopy@2x.png) no-repeat center;
	background-size: 8px;
}

.calendar .calendar-btn h3 {
	font-size: 25px;
	font-family: Impact;
	color: #666;
}

.calendar .list ul li.disabled {
	color: #dedede;
}

.calendar .list ul li.active {
	background-image: linear-gradient(82deg, #0675e6 0%, #021b7a 100%);
	color: #fff;
}

.calendar .list ul li.closure {
	color: #999;
}

.calendar .list ul li.closure i {
	font-style: normal;
	font-size: .16rem;
	color: #999;
	position: absolute;
	 100%;
	display: block;
	height: .22rem;
	bottom: .32rem;
}

  js

function calendar(obj) {
	var myDate = new Date(); //获取当前日期
	var newDate = myDate.getDate(); //今天几号
	var newDay = myDate.getDay(); //今天周几
	var newMonth = myDate.getMonth(); // 这是几月
	var newFullYear = myDate.getFullYear(); // 这是哪年

	var obj = obj;
	var dateArr = [];
	console.log(obj)
	obj.map((item) => {
		dateArr.push(new Date(item.date))
	})

	var maxDate = new Date(Math.max.apply(null, dateArr)); //数据中最大的日期(月)
	var maxMonth = maxDate.getMonth() + 1;
	var maxYear = maxDate.getFullYear();

	var minDate = new Date(Math.min.apply(null, dateArr)); //数据中最小的日期(月)
	var minMonth = minDate.getMonth() + 1;
	var minYear = minDate.getFullYear();

	var monthMaxNum = maxMonth - newMonth + (maxYear - newFullYear) * 12; //最多
	var monthMinNum = newMonth - minMonth + (newFullYear - minYear) * 12 + 1; //最少

	function calendarCon(newYears, newMonths) {

		var oldDate = new Date(newYears, newMonths);
		var calendarList;
		oldDate.setMonth(newMonths);
		oldDate.setDate(0);
		var newDayNum = oldDate.getDate(0); //获取天数

		oldDate.setDate(1);
		var emptyAll = oldDate.getDay(); //获取每月空白数量	

		if(newMonth == 0) {
			newYears -= 1;
		}
		newMonths = newMonths == 0 ? 12 : newMonths;
		newMonths = newMonths > 9 ? newMonths : '0' + newMonths;

		calendarList = '<div class="list">';
		//		calendarList += '<h3>' + newYears + '日' + newMonths + '月</h3>';
		calendarList += '<ul>';
		if(emptyAll > 0) {
			for(var j = 0; j < emptyAll; j++) {
				calendarList += ('<li></li>');
			}
		}

		//判断是否是这个月
		if((myDate.getMonth() + 1) == newMonths && myDate.getFullYear() == newYears) {
			for(var i = 1; i <= newDayNum; i++) {
				var days = i > 9 ? i : '0' + i;
				if(i < newDate) { // 今日以前
					calendarList += ('<li _date="' + newYears + '-' + newMonths + '-' + days + '" class="disabled">' + days + '</li>');
				} else if(i == newDate) { //今日
					calendarList += ('<li _date="' + newYears + '-' + newMonths + '-' + days + '"  class="disabled">' + days + '</li>');
				} else { //今日以后
					calendarList += ('<li _date="' + newYears + '-' + newMonths + '-' + days + '" class="disabled">' + days + '</li>');
				}
			}
		} else {
			for(var i = 1; i <= newDayNum; i++) {
				var days = i > 9 ? i : '0' + i;
				calendarList += ('<li _date="' + newYears + '-' + newMonths + '-' + days + '" class="disabled" >' + days + '</li>');
			}
		}

		calendarList += '</ul>' +
			'</div>';
		$(".calendar .calendar-btn h3").html(newYears + "," + newMonths)
		return calendarList;
	};

	//滚动加载更多
	//	$(".calendar .content").on("resize scroll", function() {
	//		var windowHeight = $(".calendar .content").height(); //当前窗口的高度             
	//		var scrollTop = $(".calendar .content").scrollTop(); //当前滚动条从上往下滚动的距离            
	//		var docHeight = $(".calendar .content .list").height() * $(".calendar .content .list").length; //当前文档的高度 
	//		//console.log(scrollTop, windowHeight, docHeight);
	//		//换句话说:(滚动条滚动的距离 + 窗口的高度 = 文档的高度)  这个是基本的公式  
	//		if((scrollTop + windowHeight - 20) >= docHeight) {
	//			monthNum++;
	//
	//			//月超12,年加1,月归0;
	//			for(var i = 0; i < monthNum; i++) {
	//				newMonth++
	//				if(newMonth > 11) {
	//					newMonth = 0;
	//					newFullYear += 1;
	//				}
	//				$(".calendar .content").append(calendarCon(newFullYear, newMonth))
	//			}
	//		}
	//	}); 
	var monthAllNum = monthMaxNum + monthMinNum;
	$(".calendar .calendar-btn a").click(function() {
		if($(this).hasClass('rightbtn')) {

			monthMaxNum--;
			monthMinNum++;

			if(monthMinNum >= monthAllNum) {
				monthMinNum = monthAllNum;
			}
			if(monthMaxNum <= 0) {
				monthMaxNum = 1;
				return false
			}
			newMonth++;
		} else if($(this).hasClass('leftbtn')) {
			monthMinNum--;
			monthMaxNum++;

			if(monthMaxNum >= monthAllNum) {
				monthMaxNum = monthAllNum;
			}
			if(monthMinNum <= 0) {
				monthMinNum = 1;
				return false
			}
			newMonth--;
		}
		console.log(newMonth)

		if(newMonth > 11) {
			newMonth = 0;
			newFullYear += 1;
		} else if(newMonth <= 0) {
			newMonth = 12;
			newFullYear -= 1;
		}
		$(".calendar .content").empty();
		$(".calendar .content").append(calendarCon(newFullYear, newMonth))
		_optionalDate()

	})
	//月超12,年加1,月归0;
	for(var i = 0; i < 1; i++) {
		newMonth++
		if(newMonth > 11) {
			newMonth = 0;
			newFullYear += 1;
		}
		$(".calendar .content").append(calendarCon(newFullYear, newMonth));

	}

	function _optionalDate() {
		$(".calendar .list ul li").each(function() {
			var _this = $(this);
			var _date = _this.attr('_date');
			obj.map((item) => {
				//console.log(item.date)
				//console.log(_date , item.date)
				if(_date == item.date) {
					if(!item.open) {
						_this.attr('class', 'closure');
						_this.append('<i>' + item.show + '</i>')
					} else {
						_this.attr('class', '');
					}

				}
			})
		})
	}
	_optionalDate();
	$(".calendar").on('click', ' .list ul li', function() {
		if(!$(this).hasClass('disabled') && !$(this).hasClass('closure') && $(this).html() != '') {
			$(this).addClass('active').siblings().removeClass('active');
		}
	})

}

 json

[
  {
    "date": "2018-08-08",
    "open": true,
    "show": ""
  },
  {
    "date": "2019-08-09",
    "open": false,
    "show": "闭馆"
  },
  {
    "date": "2019-08-10",
    "open": true,
    "show": ""
  },
  {
    "date": "2019-08-11",
    "open": true,
    "show": ""
  },
  {
    "date": "2019-08-12",
    "open": true,
    "show": ""
  },
  {
    "date": "2019-08-13",
    "open": true,
    "show": ""
  },
  {
    "date": "2019-08-14",
    "open": true,
    "show": ""
  },
  {
    "date": "2019-08-15",
    "open": true,
    "show": ""
  },
  {
    "date": "2019-08-16",
    "open": false,
    "show": "闭馆"
  },
  {
    "date": "2019-11-17",
    "open": true,
    "show": ""
  }
]

  

原文地址:https://www.cnblogs.com/yjgbk/p/11359086.html