JavaScript实现简单的日历效果

yizhihongxing

下面是具体的攻略。

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日

相关文章

  • JavaScript canvas实现文字时钟

    JavaScript的Canvas是一个非常强大的图像处理工具,它可以用来创建各种各样的特效,比如实现文字时钟。下面我将提供完整的实现攻略,希望能够对你有所帮助。 准备工作 在开始实现之前,需要准备以下工作: 在HTML中创建一个canvas标签,并指定合适的宽度和高度。 在JavaScript中获取该canvas标签,并获取其上下文。 设定需要显示的时间格…

    JavaScript 2023年5月27日
    00
  • js获取事件源及触发该事件的对象

    获取事件源对象和触发该事件的对象是 Javascript 事件处理的重要操作。下面,我将为大家分享完整的攻略。 获取事件源对象 事件源对象指的是触发该事件的元素或节点。通常,我们使用 event.target、event.srcElement 等属性来获取事件源对象。 event.target:事件发生时,事件的目标节点(最深嵌套的节点)。 event.sr…

    JavaScript 2023年6月10日
    00
  • JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)

    当我们需要在网页中展示当前日期时间的时候,可以使用JavaScript来获取当前日期时间,并以设定的格式进行展示。下面是获取当前日期时间的方法: 1. 使用Date对象的toLocaleString()方法获取当前日期时间 let now = new Date(); let year = now.getFullYear(); // 获取当前年份 let mo…

    JavaScript 2023年5月27日
    00
  • 原生JavaScript实现幻灯片效果

    下面我会详细讲解一下“原生JavaScript实现幻灯片效果”的完整攻略。 1. 确定需求 在开始编写代码之前,我们需要考虑一下实现幻灯片效果的具体需求,例如: 幻灯片的图片数量 幻灯片每张图片的宽高 幻灯片切换的方式 幻灯片的自动播放和手动控制 2. 示范HTML结构 接下来,我们先来示范一下实现幻灯片效果所需要的HTML结构。代码如下: <div …

    JavaScript 2023年6月10日
    00
  • js动态拼接正则表达式的两种方法

    JS动态拼接正则表达式的两种方法 在JS中,我们可以使用正则表达式对字符串进行匹配,尤其在一些需要对输入内容进行验证的场景下非常实用。但是,有些时候我们可能需要动态拼接正则表达式,以便更好地实现我们的业务逻辑,那么该如何操作呢?接下来,我们将介绍两种JS动态拼接正则表达式的方法。 使用RegExp构造函数 RegExp构造函数可以接受两个参数,一个是表示正则…

    JavaScript 2023年6月10日
    00
  • javascript实现用户点击数量统计

    针对“javascript实现用户点击数量统计”,给出详细的攻略如下: 1. 在HTML中使用JavaScript实现点击数统计 步骤1:在HTML中定义一个计数器 首先,在你的HTML文件中定义一个计数器,可以使用一个全局变量来存储它,例如: var count = 0; 这个计数器用来记录用户点击了多少次按钮。 步骤2:在HTML中添加一个按钮 然后,在…

    JavaScript 2023年6月11日
    00
  • JavaScript 对象字面量讲解

    下面是关于JavaScript对象字面量的全面讲解: JavaScript 对象字面量讲解 JavaScript 对象是一种复合数据类型,可以包含键值对,并且可以使用点语法进行访问。对象通常用于封装相关的数据和功能,并将它们组织在一起。 对象字面量是创建 JavaScript 对象最常用的方法之一。对象字面量是使用花括号({})定义对象,每个键值对之间使用冒…

    JavaScript 2023年5月27日
    00
  • 小程序云开发初探(小结)

    小程序云开发初探(小结) 本文主要介绍小程序云开发的基础知识和使用方法。小程序云开发是微信小程序提供的一项新功能,可以通过云数据库、云存储和云函数来快速搭建一个完整的小程序。 1. 云开发环境配置 要使用小程序云开发,需要在微信公众平台上创建小程序,并在小程序后台开启云开发。 注册微信小程序账号 登录小程序后台,点击“设置”-“开发设置”,在云开发中开启开发…

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