js+css实现一个原生中性日历效果代码

代码语言:html

所属分类:其他

代码描述:js+css实现一个原生中性日历效果代码,可切换月份、年份。

代码标签: js css 原生 中性 日历

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
    * {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

:root {
  --primary-color: #2495f5;
  --br: 8px;
  --bs: 5px 5px 5px #e0e0e6, -5px -5px 5px #fff;
  --bs-inset: 5px 5px 5px #e0e0e6 inset, -5px -5px 5px #fff inset;
}

.container {
  width: 100vw;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #edf0f5;
}
.calendar-wrap {
  display: flex;
  flex-direction: column;
  padding: 15px;
  border-radius: var(--br);
  background-color: #edf0f5;
  box-shadow: var(--bs);
  cursor: pointer;
}

.calendar-header {
  display: flex;
  align-items: center;
}

.date-show {
  font-size: 20px;
  color: var(--primary-color);
  margin: 0 50px;
  font-weight: 600;
}

.btn {
  width: 45px;
  height: 45px;
  border-radius: var(--br);
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #edf0f5;
  box-shadow: var(--bs);
}

.btn:hover {
  box-shadow: var(--bs-inset);
}

.btn.iconfont {
  font-size: 18px;
  color: var(--primary-color);
  font-weight: bold;
}

.pre-month {
  margin-right: auto;
  margin-left: 10px;
}

.next-month {
  margin-left: auto;
  margin-right: 10px;
}
.table-wrap {
  margin-top: 10px;
  /* 设置单元格之间的间隔 */
  border-spacing: 15px;
}

.table-wrap th {
  width: 50px;
  height: 50px;
  background-color: var(--primary-color);
  border-radius: var(--br);
  box-shadow: var(--bs);
  color: #fff;
  border: 2px solid #edf1f4;
}

.table-wrap td {
  font-weight: 500;
  font-size: 1.25rem;
  width: 50px;
  height: 50px;
  /* 水平居中文本 */
  text-align: center;
  /* 垂直居中内容 */
  vertical-align: middle;
  background-color: #edf1f4;
  border-radius: var(--br);
  box-shadow: var(--bs);
  color: #777;
}

/* 双类名增加权重 */
.table-wrap td.active.active {
  border: 2px solid #edf1f4;
  background-color: var(--primary-color);
  color: #fff;
  box-shadow: var(--bs);
}

.table-wrap td:hover {
  box-shadow: var(--bs-inset);
}

.table-wrap td.not-month {
  color: #ccc;
  box-shadow: var(--bs);
}
</style>
<link rel="stylesheet" href="https://at.alicdn.com/t/c/font_3918133_k2xnhhtzck.css">

</head>

<body>
  <div class="container">
    <div class="calendar-wrap">
      <div class="calendar-header">
        <div class="btn pre-year iconfont icon-left-arrows"></div>
        <div class="btn pre-month iconfont icon-left-arrow"></div>
        <div class="date-show"></div>
        <div class="btn next-month iconfont icon-right-arrow"></div>
        <div class="btn next-year iconfont icon-right-arrows"></div>
      </div>
      <table class="table-wrap">
        <thead>
        </thead>
        <tbody>
        </tbody>
      </table>
    </div>
  </div>
  <script >
      /**
 * 获取指定月份的日历数据
 * @author coderjc <coderjc@qq.com>
 * @param {Number} year 年份(默认当前年份)
 * @param {Number} month 月份(默认当前月份)
 * @returns {Array} 返回一个指定月份的日历数组
 * @example
 * getCalendar(2023, 8) // 返回2023年8月的日历数组
 */
function getCalendar(year, month) {
	// 创建 date 对象实例
	const date = new Date()

	// 月份从 0 开始
	date.setFullYear(year)
	date.setMonth(month - 1)

	// 设置当月的第一天-即将日期设置为 1 号
	date.setDate(1)

	// 通过设置当月的第一天可以获取当前月的 1 号是周几
	const firstDay = date.getDay()

	// 获取当前月份的最大天数
	let curMaxMonthDays = getMaxDaysInMonth(year, month)

	// 获取上月的最大天数
	//  - 如果月份为1,则获取的上月天数为年份-1,月份12
	let preMonthDays = undefined
	if (month === 1) {
		preMonthDays = getMaxDaysInMonth(year - 1, 12)
	}
	// 否则正常获取
	else {
		preMonthDays = getMaxDaysInMonth(year, month - 1)
	}

	// 定义月数组
	const monthList = []

	// 本月初始天数值
	let count = 0

	// 下月初始天数值
	let nextCount = 0

	// 生成每月日历
	for (let i = 0; i < 6; i++) {
		// 生成每周的数据
		const weekList = new Array(7)
		monthList.push(weekList)
		// 当 i 为 0 表示是第一周的情况
		if (i === 0) {
			for (let j = firstDay; j < weekList.length; j++) {
				// 已知本月的第一天是周几,即可确定第一周的具体日期
				weekList[j] = {
					stage: 'cur',
					y: year,
					m: month,
					d: ++count
				}
			}
		}
		// 其余的也进行填值
		else {
			for (let j = 0; j < weekList.length; j++) {
				// 已知本月的第一天是周几,即可确定第一周的具体日期
				count++
				// 当这个天数超出本月最大天数的时候就填充下个月的天数
				if (count > curMaxMonthDays) {
					// 当月份数等于12时表示为下一年,则年份+1,月份重置为1
					if (month === 12) {
						weekList[j] = {
							stage: 'next',
							y: year + 1,
							m: 1,
							d: ++nextCount
						}
					}
					// 否则只执行月份+1
					else {
						weekList[j] = {
							stage: 'next',
							y: year,
							m: month + 1,
							d: ++nextCount
						}
					}
				}
				// 否则表示属于当前月
				else {
					weekList[j] = {
						stage: 'cur',
						y: year,
						m: month,
						d: count
					}
				}
			}
		}
	}

	// 填充第一周缺失的日期-即上月的末尾日期
	for (let i = firstDay - 1; i >= 0; i--) {
		let data = null
		// 如果当前月为1,则个月的填充数据年份需要-1,月份改为12
		if (month === 1) {
			data = {
				stage: 'pre',
				y: year - 1,
				m: 12,
				d: preMonthDays--
			}
		} else {
			data = {
				stage: 'pre',
				y: y.........完整代码请登录后点击上方下载按钮下载查看

网友评论0