JS实现简易日历效果

下面是详细讲解JS实现简易日历效果的完整攻略。

1.准备工作

在开始之前,我们需要准备以下工作:

  • 一个HTML文件,用于展示日历
  • 一个CSS文件,用于美化页面
  • 一个JS文件,用于实现日历功能

2.HTML结构

我们需要在HTML中添加以下结构:

<div class="calendar">
  <div class="header">
    <div class="month-picker">
      <a href="#" id="prev-month">&lt;</a>

      <span id="current-month-year"></span>

      <a href="#" id="next-month">&gt;</a>
    </div>
  </div>

  <div class="weekdays">
    <div>Sun</div>
    <div>Mon</div>
    <div>Tue</div>
    <div>Wed</div>
    <div>Thu</div>
    <div>Fri</div>
    <div>Sat</div>
  </div>

  <div class="days"></div>
</div>

这个结构包含了一个日历的完整内容,我们需要在接下来的CSS样式中定义这些元素的样式。

3.CSS样式

在CSS样式中,我们需要定义以下内容:

  • 整个日历的样式
  • 头部月份选择器的样式
  • 星期几的样式
  • 日历日期的样式

示例代码:

.calendar {
  width: 300px;
  margin: 0 auto;
  font-family: sans-serif;
}

.calendar .header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  background-color: #d0d0d0;
  padding: 10px;
  border-top-left-radius: 5px;
  border-top-right-radius: 5px;
}

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

.calendar .month-picker a {
  text-decoration: none;
  color: #333;
  font-size: 24px;
  margin: 5px;
  cursor: pointer;
}

.calendar .month-picker span {
  font-size: 20px;
}

.calendar .weekdays {
  display: flex;
  justify-content: space-between;
  background-color: #f0f0f0;
  padding: 10px;
  border-bottom-left-radius: 5px;
  border-bottom-right-radius: 5px;
}

.calendar .weekdays div {
  font-size: 14px;
  font-weight: bold;
}

.calendar .days {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  padding: 10px;
}

.calendar .days div {
  width: calc(100% / 7);
  text-align: center;
  margin-bottom: 5px;
  font-size: 14px;
  cursor: pointer;
}

.calendar .days .today {
  background-color: #f0f0f0;
}

.calendar .days .selected {
  background-color: #009688;
  color: #fff;
}

以上示例代码定义了日历的样式,包括头部、星期几和日期的样式,接下来我们需要在JS文件中实现日历的功能。

4.JS实现

在JS文件中,我们需要实现以下功能:

  • 获取当月的日期列表,包括上月和下月的日期
  • 渲染日期列表到页面上
  • 实现上一个月/下一个月的按钮功能
  • 实现点击某一天日期的功能
  • 显示当前选中的日期

示例代码:

var calendar = {
  today: new Date(),
  currentMonth: null,
  currentDate: null,
  days: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  months: [
    "January", "February", "March", "April",
    "May", "June", "July", "August",
    "September", "October", "November", "December"
  ],

  // 初始化
  init: function() {
    this.currentMonth = this.today.getMonth();
    this.currentDate = this.today.getDate();
    this.renderCalendar();

    document.getElementById("prev-month").addEventListener("click", function() {
      calendar.prevMonth();
    });

    document.getElementById("next-month").addEventListener("click", function() {
      calendar.nextMonth();
    });
  },

  // 获取当月日期列表
  getMonthData: function() {
    var monthData = [];

    // 获取当月第一天和最后一天
    var firstDay = new Date(this.today.getFullYear(), this.currentMonth, 1);
    var lastDay = new Date(this.today.getFullYear(), this.currentMonth + 1, 0);

    // 获取上个月最后几天
    for (var i = firstDay.getDay() - 1; i >= 0; i--) {
      var date = new Date(this.today.getFullYear(), this.currentMonth, -i);
      monthData.push({
        date: date,
        day: date.getDate(),
        prevMonth: true
      });
    }

    // 获取当月日期
    for (var i = 1; i <= lastDay.getDate(); i++) {
      var date = new Date(this.today.getFullYear(), this.currentMonth, i);
      monthData.push({
        date: date,
        day: i,
        thisMonth: true
      });
    }

    // 获取下个月最前几天
    var nextMonthDaysCount = 42 - monthData.length;
    for (var i = 1; i <= nextMonthDaysCount; i++) {
      var date = new Date(this.today.getFullYear(), this.currentMonth + 1, i);
      monthData.push({
        date: date,
        day: i,
        nextMonth: true
      });
    }

    return monthData;
  },

  // 渲染日期列表
  renderCalendar: function() {
    var monthData = this.getMonthData();

    // 渲染月份和年份
    document.getElementById("current-month-year").innerHTML = this.months[this.currentMonth] + " " + this.today.getFullYear();

    // 渲染每一天日期
    var daysHtml = "";
    for (var i = 0; i < monthData.length; i++) {
      var day = monthData[i];

      if (day.prevMonth) {
        daysHtml += "<div class='prev-month date'>" + day.day + "</div>";
      } else if (day.thisMonth) {
        daysHtml += "<div class='date'>" + day.day + "</div>";
      } else if (day.nextMonth) {
        daysHtml += "<div class='next-month date'>" + day.day + "</div>";
      }
    }

    document.querySelector(".days").innerHTML = daysHtml;

    // 添加点击某一天日期的功能
    var datesList = document.querySelectorAll(".date");
    for (var i = 0; i < datesList.length; i++) {
      datesList[i].addEventListener("click", function() {
        calendar.selectDate(this);
      });
    }

    // 显示当前选中的日期
    var selectedDate = document.querySelector(".selected");
    if (selectedDate) {
      selectedDate.classList.remove("selected");
    }

    for (var i = 0; i < datesList.length; i++) {
      if (datesList[i].getAttribute("data-date") == this.today.getFullYear() + "-" + (this.currentMonth + 1) + "-" + this.currentDate) {
        datesList[i].classList.add("selected");
      }
    }
  },

  // 上一个月
  prevMonth: function() {
    this.currentMonth--;

    if (this.currentMonth < 0) {
      this.currentMonth = 11;
      this.today.setFullYear(this.today.getFullYear() - 1);
    }

    this.renderCalendar();
  },

  // 下一个月
  nextMonth: function() {
    this.currentMonth++;

    if (this.currentMonth > 11) {
      this.currentMonth = 0;
      this.today.setFullYear(this.today.getFullYear() + 1);
    }

    this.renderCalendar();
  },

  // 选择日期
  selectDate: function(element) {
    var date = element.getAttribute("data-date");
    var dateArray = date.split("-");
    this.today = new Date(dateArray[0], dateArray[1] - 1, dateArray[2]);
    this.currentMonth = this.today.getMonth();
    this.currentDate = this.today.getDate();

    this.renderCalendar();
  }
};

calendar.init();

这段代码实现了整个日历的逻辑,包括获取当月日期列表、渲染日期列表、上一个月/下一个月的按钮功能、点击日期的功能和显示当前选中的日期。

5.示例说明

示例1

我们可以把上述代码复制到单独的HTML、CSS、JS文件中,并在浏览器中打开HTML文件,就可以看到一个简单的日历。

示例2

如果我们想在一个现有的网页中添加日历,可以把上述代码添加到现有网页的JS文件中,并调用init()函数来初始化日历。

<!DOCTYPE html>
<html>
<head>
  <title>示例网页</title>
  <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
  <div class="container">
    <h1>示例网页</h1>
    <div class="calendar"></div>
  </div>

  <script type="text/javascript" src="calendar.js"></script>
  <script type="text/javascript">
    var calendarContainer = document.querySelector(".calendar");
    calendarContainer.innerHTML = calendar.init();
  </script>
</body>
</html>

这段代码先将日历容器添加到HTML中,然后在JS中调用init()函数来初始化日历,最后将日历渲染到容器中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现简易日历效果 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • javascript的惯性运动实现代码实例

    下面是“JavaScript的惯性运动实现代码实例”的完整攻略。 理解惯性运动 在开始编写代码实现惯性运动之前,我们需要先理解惯性运动的概念。 所谓惯性运动,指的是对象在受到外力作用后,由于惯性而产生的运动。比如说,当你用力向前推一个物体,它并不会立刻静止,而会先快速运动一段时间,然后逐渐减缓,最终停下来。 我们可以通过数学公式来描述物体的运动状态,其中包括…

    JavaScript 2023年6月11日
    00
  • JavaScript Event事件学习第一章 Event介绍

    JavaScript Event事件学习第一章 Event介绍 什么是Event? Event(事件)是指在HTML文档中发生的交互性质的动作,例如单击某个元素、按下键盘上的某个键以及页面的滚动等。在JavaScript中,Event被认为是一种用户活动,它可以被捕获,处理和响应。 Event包含哪些信息? 当Event发生时,会携带一个Event对象,其中…

    JavaScript 2023年6月11日
    00
  • Bootstrap表单组件教程详解

    Bootstrap表单组件教程详解 Bootstrap是目前最为流行的前端框架之一,它提供了大量的样式和组件的封装,其中表单组件是网站开发中不可或缺的一部分。本文将为大家详细讲解Bootstrap表单组件的使用方法和常见问题。 基础表单组件 Bootstrap提供了包括输入框、单选框、复选框、下拉框等多种常用表单组件。 输入框 普通输入框 <div c…

    JavaScript 2023年6月10日
    00
  • 五段实用的js高级技巧

    五段实用的js高级技巧 在这里,我将分享五个实用的javascript高级技巧,这些技巧可以帮助你优化你的代码,并且更加高效的使用javascript。 技巧一:使用闭包来封装变量 当我们写javascript代码时,会发现变量作用域模糊不清,变量的值很容易被意外更改。为了解决这个问题,可以使用闭包来封装变量。闭包是一个函数,它可以访问它所创建的函数的变量。…

    JavaScript 2023年5月18日
    00
  • 客户端 使用XML DOM加载json数据的方法

    客户端使用XML DOM加载JSON数据的方法可以分为以下几个步骤: 通过XMLHttpRequest对象发起网络请求,获取JSON数据; 将JSON数据转换为字符串,再使用DOMParser对象解析成XML格式; 通过XML DOM操作获取需要的数据。 下面是一个示例代码,通过XMLHttpRequest获取JSON数据并转换为XML格式: // 创建XM…

    JavaScript 2023年5月27日
    00
  • HTML中的pre-load 和 pre-fetch

    当浏览器加载网页时,通常会遵循一个默认的流程,先加载 HTML、CSS 和 JavaScript,然后再加载图片、音频、视频等资源。这个默认的流程可能会导致网页加载速度变慢,用户体验不佳。因此,可以使用一些技术来优化网页加载的速度,其中之一就是按需加载。 按需加载是指根据用户实际需要,动态地加载资源,而不是一次性加载所有资源。这样可以减少页面加载时间,提高用…

    JavaScript 2023年4月17日
    00
  • 在JavaScript中使用对数Math.log()方法的教程

    下面是使用对数 Math.log() 方法的教程及示例说明: 使用对数 Math.log() 方法的教程 1. 什么是对数? 对数是数学中重要的概念之一,指数学中某个数(底数)与另一个数(真数)之间的关系式。换句话说,就是求某个底数下的某个真数的幂的指数是多少。 例如,如果要求以2为底数的8的对数,可以表示为2^x=8,那么对数x就是3,即log2(8)=3…

    JavaScript 2023年6月10日
    00
  • Javascript Date setUTCMilliseconds() 方法

    以下是关于JavaScript Date对象的setUTCMilliseconds()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setUTCMilliseconds()方法 JavaScript的setUTCMilliseconds()方法设置对象UTC毫秒部分。该方法接受一个整数,表示要设置的UTC毫秒数。如果该参数超出了Ja…

    JavaScript 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部