js实现简单日历效果

实现一个简单日历效果的方式有很多种,我这里介绍一种使用原生JavaScript实现的方法。

步骤一:HTML结构

首先,在HTML中创建一个包含日历的div,结构如下:

<div id="calendar">
  <div class="header">
    <span class="left" id="prevMonth">&#10094;</span>
    <span class="month-year" id="monthYear"></span>
    <span class="right" id="nextMonth">&#10095;</span>
  </div>
  <div class="weekdays">
    <span>Sun</span>
    <span>Mon</span>
    <span>Tue</span>
    <span>Wed</span>
    <span>Thu</span>
    <span>Fri</span>
    <span>Sat</span>
  </div>
  <div class="days" id="days"></div>
</div>

步骤二:CSS样式

为了让日历看起来更加好看,我们需要添加一些CSS样式:

#calendar {
  width: 240px;
  border: 1px solid #ccc;
  border-radius: 5px;
  background-color: #fff;
  font-size: 16px;
  text-align: center;
}

.header {
  display: flex;
  justify-content: space-between;
  padding: 10px;
  font-weight: bold;
}

.weekdays {
  display: flex;
  justify-content: space-around;
  margin-bottom: 10px;
  background-color: #eee;
}

.weekdays span {
  width: 30px;
  height: 30px;
  line-height: 30px;
}

.days {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  grid-gap: 5px;
  padding: 5px;
}

步骤三:JavaScript代码

接下来,在JavaScript中编写代码来生成日历:

const calendarDays = document.getElementById('days');
const calendarMonthYear = document.getElementById('monthYear');
const prevMonthBtn = document.getElementById('prevMonth');
const nextMonthBtn = document.getElementById('nextMonth');

let currentDate = new Date();

prevMonthBtn.addEventListener('click', () => {
  currentDate.setMonth(currentDate.getMonth() - 1);
  updateCalendar();
});

nextMonthBtn.addEventListener('click', () => {
  currentDate.setMonth(currentDate.getMonth() + 1);
  updateCalendar();
});

function updateCalendar() {
  const year = currentDate.getFullYear();
  const month = currentDate.getMonth();

  const daysInMonth = new Date(year, month + 1, 0).getDate();

  const firstDayOfMonth = new Date(year, month, 1).getDay();
  const lastDayOfMonth = new Date(year, month, daysInMonth).getDay();

  let day = 1;

  let calendarDaysHTML = ``;

  for (let i = 0; i < 6; i++) {
    let rowHTML = ``;

    for (let j = 0; j < 7; j++) {
      if (i === 0 && j < firstDayOfMonth) {
        rowHTML += `<div class="day inactive"></div>`;
      } else if (day > daysInMonth) {
        rowHTML += `<div class="day inactive"></div>`;
      } else {
        rowHTML += `<div class="day active">${day}</div>`;
        day++;
      }
    }
    calendarDaysHTML += rowHTML;
  }

  calendarDays.innerHTML = calendarDaysHTML;
  calendarMonthYear.innerHTML = `${year}年${month + 1}月`;
}

updateCalendar();

我们在这个代码中做了如下的事情:

  1. 获取HTML元素,例如日历的div、月份和日期显示的元素等。
  2. 创建一个变量来存储当前日期,初始值为当天日期。
  3. 添加事件监听器,当用户点击“上一个月”或“下一个月”按钮时,更新当前日期。
  4. 定义一个函数来生成日历,函数会使用当前日期来计算这个月有多少天、这个月的第一天和最后一天是星期几等信息,并根据这些信息来生成日历表格。
  5. 调用updateCalendar函数来生成日历表格,并将日历显示出来。

下面提供两个示例:

  • 示例一:根据用户输入的年月来显示对应的日历
const yearInput = document.getElementById('yearInput');
const monthInput = document.getElementById('monthInput');
const showCalendarBtn = document.getElementById('showCalendarBtn');

showCalendarBtn.addEventListener('click', () => {
  const year = parseInt(yearInput.value);
  const month = parseInt(monthInput.value) - 1;

  if (isNaN(year) || isNaN(month)) {
    alert('请输入正确的年份和月份!');
    return;
  }

  currentDate = new Date(year, month, 1);
  updateCalendar();
});

这段代码会先获取用户输入的年份和月份,然后当用户点击“显示日历”按钮时,将当前日期设置为用户输入的年月的第一天,并调用updateCalendar函数来显示对应的日历。

  • 示例二:为当前日期所处的月份增加一个标识
function updateCalendar() {
  const year = currentDate.getFullYear();
  const month = currentDate.getMonth();

  const daysInMonth = new Date(year, month + 1, 0).getDate();

  const firstDayOfMonth = new Date(year, month, 1).getDay();
  const lastDayOfMonth = new Date(year, month, daysInMonth).getDay();

  let day = 1;

  let calendarDaysHTML = ``;

  for (let i = 0; i < 6; i++) {
    let rowHTML = ``;

    for (let j = 0; j < 7; j++) {
      if (i === 0 && j < firstDayOfMonth) {
        rowHTML += `<div class="day inactive"></div>`;
      } else if (day > daysInMonth) {
        rowHTML += `<div class="day inactive"></div>`;
      } else {
        const currentDateObj = new Date();

        if (year === currentDateObj.getFullYear() && month === currentDateObj.getMonth() && day === currentDateObj.getDate()) {
          rowHTML += `<div class="day active today">${day}</div>`;
        } else {
          rowHTML += `<div class="day active">${day}</div>`;
        }

        day++;
      }
    }
    calendarDaysHTML += rowHTML;
  }

  calendarDays.innerHTML = calendarDaysHTML;
  calendarMonthYear.innerHTML = `${year}年${month + 1}月`;
}

在这个示例中,我们创建了一个currentDateObj对象来表示当前日期,然后在生成日历的过程中,当某一天是当前日期所处的月份的一部分时,我们为这一天的div元素添加一个“today”类,从而给这个日期增加了一个标识。

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

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

相关文章

  • JS实现的对象去重功能示例

    下面我将详细讲解JS实现的对象去重功能示例的完整攻略。首先,我们需要了解什么是对象去重功能。 什么是对象去重功能? 在JS中,我们经常会遇到需要对一个对象数组进行去重的需求。对象去重功能是指将一个包含多个对象的数组转换为另一个不包含重复对象的数组,去除掉数组中重复的对象。 如何实现对象去重功能? 一般情况下,我们可以通过遍历数组,对每个对象的某个属性进行比较…

    JavaScript 2023年5月27日
    00
  • asp javascript在线管理

    下面我将为您详细讲解“ASP Javascript在线管理”的攻略。 什么是“ASP Javascript在线管理”? “ASP Javascript在线管理”是一种基于ASP(Active Server Pages)技术和Javascript脚本语言实现的在线管理系统。它可以让用户通过网页界面对服务器上的文件进行管理和操作,比如上传文件、创建文件夹、删除文…

    JavaScript 2023年6月10日
    00
  • Navigator sendBeacon页面关闭也能发送请求方法示例

    Navigator.sendBeacon()是一个异步方法,用于在浏览器后台向服务器发送小量数据。通常,该方法在页面关闭时使用,以确保在离开页面前将相关数据传输到服务器。该方法可以将数据发送到服务器,即使页面已关闭或卸载。 下面是使用sendBeacon()方法的完整攻略: 1. 定义数据 定义要传递的数据。可以使用FormData或JSON等格式。 con…

    JavaScript 2023年6月11日
    00
  • elementUI select组件value值注意事项详解

    下面我就为大家详细介绍一下关于 ElementUI Select 组件 value 值的注意事项。 问题出现情况 在使用 ElementUI Select 组件的时候,由于其拥有多种选择模式,可能会出现一些 value 值的问题。当我们使用可搜索的 select 时,会发现在搜索后选中某个选项后,value 值并不是我们所想要的值,而是一个对应着索引的数值。…

    JavaScript 2023年6月10日
    00
  • 关于element ui中el-cascader的使用方式

    下面就是对于关于Element UI中el-cascader的使用方式的详细讲解攻略: 1. 概述 el-cascader是一种级联选择器,它可以让用户选择特定的数据。el-cascader支持输入、筛选和异步加载选项,它可以很方便的呈现层级关系。本文将从以下几个方面详细讲解el-cascader的使用方式: el-cascader的安装 el-cascad…

    JavaScript 2023年6月10日
    00
  • JavaScript的Function详细

    JavaScript的Function详细攻略 什么是函数 函数是一段能够完成特定任务的可重复使用的代码。它们可以接受输入和返回输出。 在JavaScript中,函数是一等公民,这意味着它们被认为是值,并且可以作为参数传递给其他函数或由其他函数返回。 函数定义如下所示: function functionName(parameter1, parameter2…

    JavaScript 2023年5月18日
    00
  • javascript学习笔记(一) 在html中使用javascript

    关于“javascript学习笔记(一) 在html中使用javascript”的完整攻略,可以分为以下几个部分: 一、为什么要在html中使用javascript 在传统的网页设计中,html主要负责网页的结构和内容,而样式和特效则需要使用css和jquery等技术实现。而javascript则是一门非常重要的网页编程语言,其功能强大,可以实现很多与用户交…

    JavaScript 2023年6月10日
    00
  • JSONObject与JSONArray使用方法解析

    JSONObject与JSONArray使用方法解析 在Java开发中,我们经常需要操作JSON格式数据,而Java提供了两个类来操作JSON数据,分别是JSONObject和JSONArray。 JSONObject JSONObject是JSON的对象表示法,在Java中,我们可以使用JSONObject来构建一个JSON对象。 创建JSONObject…

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