JavaScript实现简单的日历效果

下面是具体的攻略。

1. 理清需求和思路

在实现日历效果时,我们需要注意以下几个点:

  • 展示一个月的日历,包含每一天的日期和星期几;
  • 给用户提供切换月份的功能;
  • 当天的日期需要特殊标识。

为了实现日历效果,我们需要先通过 JavaScript 获取到当前的年份和月份,然后计算出这个月有多少天,以及这个月的第一天是星期几。最后,我们通过循环渲染 HTML 标签来展现日历。

2. 获取当前时间并计算相关信息

获取当前日期和月份的 JavaScript 代码如下:

const now = new Date();
const year = now.getFullYear();  // 获取年份
const month = now.getMonth() + 1;  // 获取月份,注意月份是从0开始计算的,需要加1

接下来,我们需要计算出这个月有多少天:

const daysInMonth = new Date(year, month, 0).getDate();  // 获取该月天数

我们还需要获取该月的第一天是星期几。为了方便计算,我们可以先计算出该月的第一天的日期对象,然后通过 getDay() 方法获取具体是星期几:

const firstDayOfMonth = new Date(`${year}-${month}-01`);  // 获取该月第一天的日期对象
const firstDayOfWeek = firstDayOfMonth.getDay();  // 获取该月第一天是星期几,0代表星期天,1代表星期一,以此类推。

3. 渲染 HTML 标签

拿到了月份的天数和该月的第一天是星期几之后,我们可以按照一定的规律渲染 HTML 标签,展示日历。以下是一个示例代码:

const container = document.getElementById('calendar');  // 获取日历容器
let calendarHtml = '';

for (let i = 0; i < 7; i++) {
  // 输出星期几
  calendarHtml += '<div class="calendar-day calendar-header">';
  calendarHtml += ['日', '一', '二', '三', '四', '五', '六'][i];
  calendarHtml += '</div>';
}

for (let i = 0; i < 42; i++) {
  if (i % 7 == 0) {
    // 每个星期的第一天,开启一个新的行
    calendarHtml += '<div class="calendar-row">';
  }

  if (i < firstDayOfWeek || i >= firstDayOfWeek + daysInMonth) {
    // 日期不存在于该月份,用空白代替
    calendarHtml += '<div class="calendar-day"></div>';
  } else {
    const day = i - firstDayOfWeek + 1;
    const today = `${year}-${month}-${day}` === new Date().toISOString().substr(0, 10);

    calendarHtml += `<div class="calendar-day ${today ? 'today' : ''}">${day}</div>`;
  }

  if (i % 7 == 6) {
    // 每个星期的最后一天,结束当前行
    calendarHtml += '</div>';
  }
}

container.innerHTML = calendarHtml;  // 输出日历

以上代码将会按照如下方式渲染日历:

 Su Mo Tu We Th Fr Sa 
                   1 
  2  3  4  5  6  7  8 
  9 10 11 12 13 14 15 
 16 17 18 19 20 21 22 
 23 24 25 26 27 28 29 
 30 31

4. 添加切换月份的功能

为了方便用户查看不同月份的日历,我们可以添加切换月份的功能。以下是一个简单的示例:

const nextBtn = document.getElementById('next-btn');
const prevBtn = document.getElementById('prev-btn');

nextBtn.addEventListener('click', () => {
  const nextPageDate = new Date(`${year}-${month + 1}-1`);
  location.href = `?year=${nextPageDate.getFullYear()}&month=${nextPageDate.getMonth() + 1}`;
});

prevBtn.addEventListener('click', () => {
  const prevPageDate = new Date(`${year}-${month}-1`) - 24 * 60 * 60 * 1000;
  location.href = `?year=${prevPageDate.getFullYear()}&month=${prevPageDate.getMonth() + 1}`;
});

该示例代码会为日历中的 next-btnprev-btn 两个按钮添加事件监听器,当用户点击按钮时会跳转到上一个月或下一个月的日历页面。

5. 运行示例程序

以下是一个完整的示例程序,你可以直接运行并查看日历效果,也可以引用其中的代码来实现自己的需求。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>日历示例</title>
    <style>
      .calendar {
        display: flex;
        flex-wrap: wrap;
        width: 280px;
      }

      .calendar-header {
        flex: 1 0 0;
        text-align: center;
        color: #aaa;
        font-size: 16px;
        padding: 10px;
      }

      .calendar-day {
        flex: 1 0 0;
        text-align: center;
        font-size: 20px;
        padding: 10px;
      }

      .calendar-day.today {
        background: #eee;
        font-weight: bold;
      }

      .calendar-row {
        display: flex;
        flex-wrap: wrap;
      }

      button {
        margin: 10px;
        font-size: 18px;
        padding: 8px;
      }
    </style>
  </head>
  <body>
    <div class="calendar" id="calendar"></div>
    <div>
      <button id="prev-btn">上一个月</button>
      <button id="next-btn">下一个月</button>
    </div>
    <script>
      const queryParams = new URLSearchParams(window.location.search);
      const year = parseInt(queryParams.get('year')) || new Date().getFullYear();
      const month = parseInt(queryParams.get('month')) || new Date().getMonth() + 1;

      const daysInMonth = new Date(year, month, 0).getDate();
      const firstDayOfMonth = new Date(`${year}-${month}-01`);
      const firstDayOfWeek = firstDayOfMonth.getDay();

      const container = document.getElementById('calendar');
      let calendarHtml = '';

      for (let i = 0; i < 7; i++) {
        // 输出星期几
        calendarHtml += '<div class="calendar-day calendar-header">';
        calendarHtml += ['日', '一', '二', '三', '四', '五', '六'][i];
        calendarHtml += '</div>';
      }

      for (let i = 0; i < 42; i++) {
        if (i % 7 == 0) {
          // 每个星期的第一天,开启一个新的行
          calendarHtml += '<div class="calendar-row">';
        }

        if (i < firstDayOfWeek || i >= firstDayOfWeek + daysInMonth) {
          // 日期不存在于该月份,用空白代替
          calendarHtml += '<div class="calendar-day"></div>';
        } else {
          const day = i - firstDayOfWeek + 1;
          const today = `${year}-${month}-${day}` === new Date().toISOString().substr(0, 10);

          calendarHtml += `<div class="calendar-day ${today ? 'today' : ''}">${day}</div>`;
        }

        if (i % 7 == 6) {
          // 每个星期的最后一天,结束当前行
          calendarHtml += '</div>';
        }
      }

      container.innerHTML = calendarHtml;

      const nextBtn = document.getElementById('next-btn');
      const prevBtn = document.getElementById('prev-btn');

      nextBtn.addEventListener('click', () => {
        const nextPageDate = new Date(`${year}-${month + 1}-1`);
        location.href = `?year=${nextPageDate.getFullYear()}&month=${nextPageDate.getMonth() + 1}`;
      });

      prevBtn.addEventListener('click', () => {
        const prevPageDate = +new Date(`${year}-${month}-1`) - 24 * 60 * 60 * 1000;
        location.href = `?year=${new Date(prevPageDate).getFullYear()}&month=${new Date(prevPageDate).getMonth() + 1}`;
      });
    </script>
  </body>
</html>

运行以上代码,你会看到一个基于 JavaScript 实现的简单日历效果。你可以通过左右箭头按钮来切换月份,也可以通过修改 URL 参数直接跳转到指定月份的日历。

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

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

相关文章

  • jquery ajax post提交数据乱码

    下面是详细的攻略: 一、问题描述 当使用 jQuery 的 AJAX 功能来提交表单数据时,有时会出现提交的中文乱码的问题。问题表现为:在后台处理接收到的数据的时候,中文字符会被解析为乱码,这给我们的开发和调试带来了不必要的麻烦。 二、问题分析 出现该问题的原因是因为,提交数据时如果没有指定编码方式,浏览器会使用当前页面的默认编码方式,而当前页面的编码方式不…

    JavaScript 2023年5月19日
    00
  • js事件监听器用法实例详解

    下面是“js事件监听器用法实例详解”的攻略: 什么是事件监听器? 事件监听器(Event Listener)是一种常用的 JavaScript 技术,它用来监听特定元素(如 DOM 元素)上的特定事件(如单击、滚动、鼠标移动、键盘按键等),并在事件发生时触发执行指定的回调函数。这种技术可以实现 Web 页面上的交互效果,比如:按钮单击后弹出框、下拉菜单、图片…

    JavaScript 2023年6月10日
    00
  • javascript实现获取指定精度的上传文件的大小简单实例

    本文将详细讲解如何使用JavaScript来获取指定精度的上传文件大小,并提供两个简单实例。 一、前言 在进行文件上传操作时,我们需要获取所上传文件的大小。但是,通常文件大小的数据单位都是以字节(Byte),而不是以KB、MB、GB等常用单位显示,这就需要我们在获取文件大小时,对其进行一定的转换和格式化。本文将向大家介绍一种获取文件大小的简单实现方法。 二、…

    JavaScript 2023年5月27日
    00
  • JavaScript通过Date-Mask将日期转换成字符串的方法

    当我们需要将JS中的日期对象转换成字符串时,我们可以使用Date-Mask库。下面是详细的步骤。 1. 引入Date-Mask库 首先,在HTML文件中引入Date-Mask库,可以通过以下的代码将库引入到页面中: <script src="https://cdnjs.cloudflare.com/ajax/libs/date-mask/2.…

    JavaScript 2023年6月10日
    00
  • JS新手入门数组处理的实用方法汇总

    JS新手入门数组处理的实用方法汇总 在JavaScript中,数组处理是一项非常关键的技能。本文将为初学者介绍一些数组处理的实用方法,让你快速掌握并应用在实际项目中。 forEach()方法 forEach()方法可以遍历数组中的每一个元素,并对其进行操作。 var arr = [1, 2, 3, 4, 5]; arr.forEach(function(el…

    JavaScript 2023年5月27日
    00
  • 获取URL地址中的文件名和参数的javascript代码

    获取URL地址中的文件名和参数是前端开发中常见的需求,通过Javascript代码可以轻松实现此操作。下面是一份完整的攻略。 步骤一:获取URL地址 首先需要获取当前页面的URL地址,可以使用Javascript中window对象的location属性来实现,代码如下: var currentUrl = window.location.href; 此处的cu…

    JavaScript 2023年5月27日
    00
  • js获取上传文件大小示例代码

    当用户需要在网站上上传文件时,我们可能需要进行文件大小的限制。JavaScript可以通过文件对象(File对象)来获取上传文件的大小。 具体步骤如下: 获取文件对象 首先,在HTML表单中添加一个文件输入框,使用JavaScript获取该输入框对应的文件对象。例如: <input type="file" id="file…

    JavaScript 2023年5月27日
    00
  • js判断登陆用户名及密码是否为空的简单实例

    下面我将为您详细讲解“js判断登陆用户名及密码是否为空的简单实例”的完整攻略。 前置知识 在实现本例中,需要您掌握以下基础知识: HTML基础语法 JavaScript基础语法 表单基本操作 实现步骤 1. 创建表单 首先,我们需要在HTML代码中创建一个表单,用于用户输入用户名和密码: <form id="login-form"&…

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