原生js实现日历效果

原生js实现日历效果

实现日历效果,需要完成以下几个步骤:

  • 获取年月数据
  • 绘制日历框架
  • 填充日期数据
  • 绑定事件

1. 获取年月数据

通过Date()获取当前时间信息,包括年、月、日等信息。

const currentDate = new Date();
let currentYear = currentDate.getFullYear();
let currentMonth = currentDate.getMonth() + 1;

2. 绘制日历框架

通过HTML元素绘制出日历框架,包括日历头和日期框架。

const calendarWrapper = document.querySelector('.calendar-wrapper'); // 获取容器元素
const calendarHTML = `
  <div class="calendar-header">
    <span class="prev-year-btn">&lt;&lt;</span>
    <span class="prev-month-btn">&lt;</span>
    <span class="calendar-title">${currentYear}年${currentMonth}月</span>
    <span class="next-month-btn">&gt;</span>
    <span class="next-year-btn">&gt;&gt;</span>
  </div>
  <ul class="calendar-content"></ul>
`;
calendarWrapper.innerHTML = calendarHTML;  // 将html代码写入容器元素中

3. 填充日期数据

获取当前月份的第一天,以及当前月份的总天数。

const firstDay = new Date(currentYear, currentMonth - 1, 1).getDay();
const totalDays = new Date(currentYear, currentMonth, 0).getDate();

根据firstDay,在日历框架中绘制出相应数量的空白日期占位符。

let contentHTML = '';
for (let i = 0; i < firstDay; i++) {
  contentHTML += '<li class="calendar-item"></li>';
}

根据totalDays,绘制出当前月份的日期信息。

for (let i = 1; i <= totalDays; i++) {
  contentHTML += `
    <li class="calendar-item">${i}</li>
  `;
}

将绘制好的日期填充到日历框架中。

const calendarContent = calendarWrapper.querySelector('.calendar-content');
calendarContent.innerHTML = contentHTML;

4. 绑定事件

为日历头的翻页按钮绑定点击事件,通过更新currentYearcurrentMonth并重新绘制出日历框架来完成月份的翻页功能。

const prevYearBtn = calendarWrapper.querySelector('.prev-year-btn');
const prevMonthBtn = calendarWrapper.querySelector('.prev-month-btn');
const nextMonthBtn = calendarWrapper.querySelector('.next-month-btn');
const nextYearBtn = calendarWrapper.querySelector('.next-year-btn');

prevMonthBtn.addEventListener('click', () => {
  currentMonth--;
  if (currentMonth <= 0) {
    currentMonth = 12;
    currentYear--;
  }
  renderCalendar();
});

nextMonthBtn.addEventListener('click', () => {
  currentMonth++;
  if (currentMonth > 12) {
    currentMonth = 1;
    currentYear++;
  }
  renderCalendar();
});

prevYearBtn.addEventListener('click', () => {
  currentYear--;
  renderCalendar();
});

nextYearBtn.addEventListener('click', () => {
  currentYear++;
  renderCalendar();
});

完整代码示例:https://codepen.io/zjazj/pen/XVJwQj

另外,还可以通过moment.js库来优化日期时间处理:https://momentjs.com/

示例2:https://codepen.io/robin-dai/pen/LLdJJa

以上两个示例都使用了原生js实现日历效果,前者是通过HTML+CSS+JS方式实现,后者是通过js渲染日历框架和填充数据的方式实现。其中,第一个示例更注重外观和样式,第二个示例更注重代码逻辑和灵活性。

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

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

相关文章

  • JavaScript中的对象的extensible属性介绍

    JavaScript中的对象有一个extensible属性,它控制对象是否可以添加新的属性。如果一个对象的extensible属性被设置为false,那么它就不能添加新的属性了,一旦试图添加就会导致错误。这一特性在某些时候是非常有用的,例如需要保护一个对象不被其他代码修改时。 判断对象是否可扩展 可以使用Object.isExtensible(obj)方法来…

    JavaScript 2023年5月27日
    00
  • script标签的 charset 属性使用说明

    当我们在网页中引入外部脚本文件时,我们通常会使用script标签。在这个标签中,我们可以使用charset属性来指定这个外部脚本文件的字符编码类型。 什么是编码类型 在HTML中使用的字符编码类型主要有两种:ASCII编码和Unicode编码。ASCII编码是一个7位编码,只能表示128种字符;而Unicode编码是一个用于文字符号的数字编码,它支持全球市场…

    JavaScript 2023年5月20日
    00
  • JS 面向对象的5钟写法

    下面我来详细讲解一下“JS 面向对象的5种写法”的完整攻略。 前言 在JavaScript中,常用的面向对象的写法有5种,分别是原型链、Class、工厂模式、构造函数和混合模式。下面我们来分别介绍这五种写法。 1. 原型链 在JavaScript中,每个对象都有一个原型(也就是一个或者多个prototype)。使用原型链实现的继承是通过将一个类型的实例设置为…

    JavaScript 2023年5月27日
    00
  • JavaScript遍历对象的七种方法汇总

    当我们需要操作 JavaScript 对象的属性时,遍历对象是非常必要的。本文总结了JavaScript遍历对象的七种方法。下面进行详细讲解: 方法一:for…in 使用 for…in 循环对象的属性。 const person = { name: ‘John’, age: 30, gender: ‘male’ } for (let property…

    JavaScript 2023年5月27日
    00
  • Bootstrap实现前端登录页面带验证码功能完整示例

    你好,关于Bootstrap实现前端登录页面带验证码功能完整示例的具体实现方法,以下是完整攻略: 1. 准备工作 引入相关CDN库 在 head 标签中引入相关CDN库: “`html “` 注意:以上只是使用的一个CDN源,你也可以使用自己的CDN源或者是本地引入库。 编写HTML布局 “`html Bootstrap登录验证码实例 邮箱地址 我们永…

    JavaScript 2023年6月10日
    00
  • 老生常谈JavaScript 函数表达式

    JavaScript 函数表达式是一种将函数作为值进行赋值或传递的方式。 函数表达式的语法 函数表达式的语法格式为:变量名 = function() {} 其中,变量名可以接受任何有效的 JavaScript 变量名。而函数表达式的主体内容则放在花括号中,可以包含任何有效的 JavaScript 语句和表达式。 下面是一个简单的例子: var func = …

    JavaScript 2023年6月11日
    00
  • 从零开始学习Node.js系列教程四:多页面实现的数学运算示例

    以下是“从零开始学习Node.js系列教程四:多页面实现的数学运算示例”的完整攻略: 第一部分:前置准备 在开始学习本教程前,请确保您已经具备以下知识和软件环境: 熟练掌握HTML、CSS和JavaScript等前端技术 熟练掌握Node.js开发环境和npm包管理工具 了解Node.js的http模块和路由(Route)的基本用法 第二部分:项目结构 首先…

    JavaScript 2023年5月28日
    00
  • 详解JS中定时器setInterval和setTImeout的this指向问题

    下面我将用Markdown语言,来给大家分享一篇关于JS中setInterval和setTimeout的this指向问题的详解攻略。 一、问题描述 在使用setInterval或setTimeout的时候,我们经常会遇到this指向问题,导致定时器中的代码无法访问到原始对象中的属性和方法。 二、原因分析 在JS中,setInterval或setTimeout…

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