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日

相关文章

  • JavaScript Reduce使用详解

    JavaScript Reduce使用详解 在JavaScript中,数组的reduce方法可以让我们使用自定义的函数将数组中的所有元素汇总为一个值,该值既可以是一个数字,也可以是一个对象或数组。 reduce方法的语法 reduce方法的语法如下: array.reduce(callback[, initialValue]) 其中,参数callback为一…

    JavaScript 2023年5月27日
    00
  • Android内存泄漏导致原因深入探究

    Android内存泄漏导致原因深入探究 什么是内存泄漏 内存泄漏指无用的对象仍然存在于内存中,导致可用内存减少,最终影响应用的性能和稳定性。 内存泄漏的原因 静态变量 静态变量被声明为全局变量,即便在Activity销毁后仍然存在于内存中,占用了可用内存。如果在静态变量中存储了Activity对象,这些对象将无法释放,导致内存泄漏。 public class…

    JavaScript 2023年6月10日
    00
  • js实现移动端图片滑块验证功能

    下面详细讲解“js实现移动端图片滑块验证功能”的完整攻略,包括以下三个步骤: 1.准备工作: 在HTML文件中定义一个div用于显示图片,一个canvas用于实现滑块,以及一个按钮用于提交验证结果。 <div id="image-box"></div> <canvas id="canvas&quot…

    JavaScript 2023年6月10日
    00
  • python爬虫之验证码篇3-滑动验证码识别技术

    Python爬虫之验证码篇3-滑动验证码识别技术 本篇文章将带领大家学习如何使用Python进行滑动验证码识别技术,让我们能够愉快地完成爬虫任务,无需被恼人的滑动验证码阻挡。 前置技能 在学习本篇文章之前,您需要学会以下技能: Python基础知识 Python爬虫入门基础 了解验证码的基本原理 滑动验证码介绍 滑动验证码通常由一张包含有缺口的图片以及一个滑…

    JavaScript 2023年6月11日
    00
  • 使用JavaScript动态设置样式实现代码及演示动画

    使用JavaScript动态设置样式可以让我们实现更加灵活的页面样式效果,具体步骤如下: 选取元素 首先,我们需要选取需要设置样式的元素,可以使用document.querySelector、document.querySelectorAll等DOM方法来选取元素。例如: const element = document.querySelector(‘.bo…

    JavaScript 2023年6月10日
    00
  • js中判断数字\字母\中文的正则表达式 (实例)

    请看下面的完整攻略: js中判断数字\字母\中文的正则表达式 (实例) 正则表达式(Regular Expression),简称正则,是一种由字符和特殊符号(元字符)组成的序列,用于匹配和处理字符串。在JavaScript中,我们可以使用正则表达式来判断字符串中是否包含数字、字母或中文。 判断字符串是否为数字的正则表达式 /^[0-9]+$/ 该正则表达式表…

    JavaScript 2023年6月10日
    00
  • JavaScript中计时器requestAnimationFrame、setTimeout、setInterval、setImmediate的使用和区别

    在JavaScript中,我们经常使用requestAnimationFrame、setTimeout、setInterval和setImmediate来控制代码的执行时机。它们各有特点和适用场景: 1. requestAnimationFrame: requestAnimationFrame主要用于浏览器动画渲染。这个函数允许你在下一次浏览器重绘前调用一个…

    JavaScript 2023年4月18日
    00
  • js实现时间显示几天前、几小时前或者几分钟前的方法集锦

    实现时间显示几天前、几小时前或者几分钟前的方法,在前端开发中是比较常见的需求之一,下面我们来讲解一下相关的实现技巧和方法。 方法一:利用Moment.js库实现 Moment.js是一个便捷的日期处理类库,可以帮助我们轻松地完成日期和时间的格式化、解析和计算等操作。在基于Moment.js库实现的时间显示几天前、几小时前或者几分钟前的方法中,我们可以使用其巨…

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