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日

相关文章

  • JS编程小常识很有用

    JS编程小常识是指在JavaScript编程中,常用到的一些小技巧和注意事项。这些小常识可以帮助开发者以更高效、安全、健壮的方式编写JavaScript代码。下面是一个完整的攻略,包括示例说明 1. 变量声明 使用const和let来声明变量,而不是使用var。 使用const对于不会被重新赋值的变量,使用let对于可能被重新赋值的变量。 不要使用全局变量,…

    JavaScript 2023年6月10日
    00
  • JavaScript实现的简单加密解密操作示例

    JavaScript实现的简单加密解密操作示例,主要是基于对字符串进行加密和解密操作。下面是该操作的完整攻略: 标题 在你的 markdown 文本中,使用 # 符号来标记不同级别的标题,如下所示: # 一级标题 ## 二级标题 ### 三级标题 加密和解密函数的编写 我们需要编写加密和解密函数,分别实现对字符串的加密和解密操作。下面是一个简单的实例: //…

    JavaScript 2023年5月19日
    00
  • JSON 客户端和服务器端的格式转换

    JSON(JavaScript 对象表示法)是一种轻量级数据交换格式,通常用于客户端与服务器端进行数据传输。在客户端和服务器端之间进行数据传输时,常常需要进行 JSON 格式的转换。接下来,我将为您提供一份详细的 JSON 客户端和服务器端的格式转换攻略。 JSON 格式转换 在进行 JSON 格式转换之前,我们首先需要了解两种形式的数据表示方法: JSON…

    JavaScript 2023年5月27日
    00
  • 各浏览器对document.getElementById等方法的实现差异解析

    各浏览器对 document.getElementById() 等方法的实现差异是指不同的浏览器厂商对该方法的实现细节有所不同,导致在不同的浏览器中可能会出现不同的行为,从而给前端开发带来一些麻烦和不兼容问题。 具体来说,document.getElementById() 是 Document 对象的一个方法,作用是通过元素 ID 查找并返回对应的元素。虽然…

    JavaScript 2023年6月10日
    00
  • Vue3.x最小原型系统讲解

    下面我会详细讲解“Vue3.x最小原型系统讲解”的完整攻略。 前言 作为前端开发工程师,我们经常需要使用Vue.js来开发项目。Vue.js是一个轻量级、简洁、易于学习和上手的MVVM框架,它的最新版本Vue3.x相较于Vue2.x,做出了很多优化和改进,比如更快的渲染速度、更小的体积和更好的代码组织能力。但是Vue3.x也带来了一些新概念和新的API,这对…

    JavaScript 2023年6月11日
    00
  • 原生JavaScrpit中异步请求Ajax实现方法

    原生JavaScript中异步请求Ajax实现方法 什么是Ajax Ajax(Asynchronous JavaScript and XML)表示一种创建快速动态网页的技术,可以在不重新加载整个页面的情况下更新部分内容。通过Ajax,可以在网页中使用JavaScript实现异步数据请求和数据处理,从而提高用户体验效果。 原生JavaScript实现Ajax请…

    JavaScript 2023年6月11日
    00
  • 《javascript设计模式》学习笔记二:Javascript面向对象程序设计继承用法分析

    《javascript设计模式》学习笔记二:Javascript面向对象程序设计继承用法分析 一、前言 在Javascript中,对象继承有着重要的作用。深入学习Javascript的面向对象的程序设计,掌握继承用法,对于编写复杂的Javascript程序非常有用,本文将介绍Javascript中常用的继承方法和技巧。 二、原型链继承 原型链继承是Javas…

    JavaScript 2023年5月27日
    00
  • 获取客户端电脑日期时间js代码(jquery)

    获取客户端电脑日期时间的js代码可以通过javascript的内置Date对象或者第三方库jquery来实现。下面我将详细介绍两种获取客户端电脑日期时间的js代码。 使用Date对象获取电脑日期时间 javascript内置Date对象提供了获取电脑日期时间的方法。可以通过以下代码实现: var now = new Date(); var year = no…

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