JS实现简易日历效果

下面是详细讲解JS实现简易日历效果的完整攻略。

1.准备工作

在开始之前,我们需要准备以下工作:

  • 一个HTML文件,用于展示日历
  • 一个CSS文件,用于美化页面
  • 一个JS文件,用于实现日历功能

2.HTML结构

我们需要在HTML中添加以下结构:

<div class="calendar">
  <div class="header">
    <div class="month-picker">
      <a href="#" id="prev-month">&lt;</a>

      <span id="current-month-year"></span>

      <a href="#" id="next-month">&gt;</a>
    </div>
  </div>

  <div class="weekdays">
    <div>Sun</div>
    <div>Mon</div>
    <div>Tue</div>
    <div>Wed</div>
    <div>Thu</div>
    <div>Fri</div>
    <div>Sat</div>
  </div>

  <div class="days"></div>
</div>

这个结构包含了一个日历的完整内容,我们需要在接下来的CSS样式中定义这些元素的样式。

3.CSS样式

在CSS样式中,我们需要定义以下内容:

  • 整个日历的样式
  • 头部月份选择器的样式
  • 星期几的样式
  • 日历日期的样式

示例代码:

.calendar {
  width: 300px;
  margin: 0 auto;
  font-family: sans-serif;
}

.calendar .header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  background-color: #d0d0d0;
  padding: 10px;
  border-top-left-radius: 5px;
  border-top-right-radius: 5px;
}

.calendar .month-picker {
  display: flex;
  align-items: center;
}

.calendar .month-picker a {
  text-decoration: none;
  color: #333;
  font-size: 24px;
  margin: 5px;
  cursor: pointer;
}

.calendar .month-picker span {
  font-size: 20px;
}

.calendar .weekdays {
  display: flex;
  justify-content: space-between;
  background-color: #f0f0f0;
  padding: 10px;
  border-bottom-left-radius: 5px;
  border-bottom-right-radius: 5px;
}

.calendar .weekdays div {
  font-size: 14px;
  font-weight: bold;
}

.calendar .days {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  padding: 10px;
}

.calendar .days div {
  width: calc(100% / 7);
  text-align: center;
  margin-bottom: 5px;
  font-size: 14px;
  cursor: pointer;
}

.calendar .days .today {
  background-color: #f0f0f0;
}

.calendar .days .selected {
  background-color: #009688;
  color: #fff;
}

以上示例代码定义了日历的样式,包括头部、星期几和日期的样式,接下来我们需要在JS文件中实现日历的功能。

4.JS实现

在JS文件中,我们需要实现以下功能:

  • 获取当月的日期列表,包括上月和下月的日期
  • 渲染日期列表到页面上
  • 实现上一个月/下一个月的按钮功能
  • 实现点击某一天日期的功能
  • 显示当前选中的日期

示例代码:

var calendar = {
  today: new Date(),
  currentMonth: null,
  currentDate: null,
  days: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  months: [
    "January", "February", "March", "April",
    "May", "June", "July", "August",
    "September", "October", "November", "December"
  ],

  // 初始化
  init: function() {
    this.currentMonth = this.today.getMonth();
    this.currentDate = this.today.getDate();
    this.renderCalendar();

    document.getElementById("prev-month").addEventListener("click", function() {
      calendar.prevMonth();
    });

    document.getElementById("next-month").addEventListener("click", function() {
      calendar.nextMonth();
    });
  },

  // 获取当月日期列表
  getMonthData: function() {
    var monthData = [];

    // 获取当月第一天和最后一天
    var firstDay = new Date(this.today.getFullYear(), this.currentMonth, 1);
    var lastDay = new Date(this.today.getFullYear(), this.currentMonth + 1, 0);

    // 获取上个月最后几天
    for (var i = firstDay.getDay() - 1; i >= 0; i--) {
      var date = new Date(this.today.getFullYear(), this.currentMonth, -i);
      monthData.push({
        date: date,
        day: date.getDate(),
        prevMonth: true
      });
    }

    // 获取当月日期
    for (var i = 1; i <= lastDay.getDate(); i++) {
      var date = new Date(this.today.getFullYear(), this.currentMonth, i);
      monthData.push({
        date: date,
        day: i,
        thisMonth: true
      });
    }

    // 获取下个月最前几天
    var nextMonthDaysCount = 42 - monthData.length;
    for (var i = 1; i <= nextMonthDaysCount; i++) {
      var date = new Date(this.today.getFullYear(), this.currentMonth + 1, i);
      monthData.push({
        date: date,
        day: i,
        nextMonth: true
      });
    }

    return monthData;
  },

  // 渲染日期列表
  renderCalendar: function() {
    var monthData = this.getMonthData();

    // 渲染月份和年份
    document.getElementById("current-month-year").innerHTML = this.months[this.currentMonth] + " " + this.today.getFullYear();

    // 渲染每一天日期
    var daysHtml = "";
    for (var i = 0; i < monthData.length; i++) {
      var day = monthData[i];

      if (day.prevMonth) {
        daysHtml += "<div class='prev-month date'>" + day.day + "</div>";
      } else if (day.thisMonth) {
        daysHtml += "<div class='date'>" + day.day + "</div>";
      } else if (day.nextMonth) {
        daysHtml += "<div class='next-month date'>" + day.day + "</div>";
      }
    }

    document.querySelector(".days").innerHTML = daysHtml;

    // 添加点击某一天日期的功能
    var datesList = document.querySelectorAll(".date");
    for (var i = 0; i < datesList.length; i++) {
      datesList[i].addEventListener("click", function() {
        calendar.selectDate(this);
      });
    }

    // 显示当前选中的日期
    var selectedDate = document.querySelector(".selected");
    if (selectedDate) {
      selectedDate.classList.remove("selected");
    }

    for (var i = 0; i < datesList.length; i++) {
      if (datesList[i].getAttribute("data-date") == this.today.getFullYear() + "-" + (this.currentMonth + 1) + "-" + this.currentDate) {
        datesList[i].classList.add("selected");
      }
    }
  },

  // 上一个月
  prevMonth: function() {
    this.currentMonth--;

    if (this.currentMonth < 0) {
      this.currentMonth = 11;
      this.today.setFullYear(this.today.getFullYear() - 1);
    }

    this.renderCalendar();
  },

  // 下一个月
  nextMonth: function() {
    this.currentMonth++;

    if (this.currentMonth > 11) {
      this.currentMonth = 0;
      this.today.setFullYear(this.today.getFullYear() + 1);
    }

    this.renderCalendar();
  },

  // 选择日期
  selectDate: function(element) {
    var date = element.getAttribute("data-date");
    var dateArray = date.split("-");
    this.today = new Date(dateArray[0], dateArray[1] - 1, dateArray[2]);
    this.currentMonth = this.today.getMonth();
    this.currentDate = this.today.getDate();

    this.renderCalendar();
  }
};

calendar.init();

这段代码实现了整个日历的逻辑,包括获取当月日期列表、渲染日期列表、上一个月/下一个月的按钮功能、点击日期的功能和显示当前选中的日期。

5.示例说明

示例1

我们可以把上述代码复制到单独的HTML、CSS、JS文件中,并在浏览器中打开HTML文件,就可以看到一个简单的日历。

示例2

如果我们想在一个现有的网页中添加日历,可以把上述代码添加到现有网页的JS文件中,并调用init()函数来初始化日历。

<!DOCTYPE html>
<html>
<head>
  <title>示例网页</title>
  <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
  <div class="container">
    <h1>示例网页</h1>
    <div class="calendar"></div>
  </div>

  <script type="text/javascript" src="calendar.js"></script>
  <script type="text/javascript">
    var calendarContainer = document.querySelector(".calendar");
    calendarContainer.innerHTML = calendar.init();
  </script>
</body>
</html>

这段代码先将日历容器添加到HTML中,然后在JS中调用init()函数来初始化日历,最后将日历渲染到容器中。

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

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

相关文章

  • vue3项目中使用tinymce的方法

    下面是vue3项目中使用tinymce编辑器的完整攻略: 安装tinymce 首先,在终端中通过npm包管理器安装tinymce: npm install tinymce –save 引入tinymce 在需要使用的组件中引入tinymce的js文件: <template> <div> <textarea id="e…

    JavaScript 2023年6月11日
    00
  • JS比较两个时间大小的简单示例代码

    JS比较两个时间大小可以通过将时间字符串转换为时间戳,然后将时间戳进行比较来实现。下面是实现的具体步骤: 第一步:将时间字符串转换为时间戳 使用JavaScript内置的Date对象可以将时间字符串转换为时间戳,方法是调用getTime()函数,它将返回当前日期对象表示的时间与UTC时间1970年1月1日午夜之间相差的毫秒数。 示例代码: let dateS…

    JavaScript 2023年5月27日
    00
  • vue中路由跳转的方式有哪些你知道吗

    当我们使用Vue.js来构建单页面应用程序时,路由跳转是不可避免的。Vue.js提供了多种方式来实现路由跳转,下面是其中几种常用的方式: 1. 基于vue-router的声明式导航 为了使用vue-router,我们首先需要将其安装到我们的应用程序中,并且创建一个router实例,来管理我们的路由。然后,我们可以在Vue组件中使用声明式导航来实现路由跳转。 …

    JavaScript 2023年6月11日
    00
  • 深入理解JavaScript函数参数(推荐)

    深入理解JavaScript函数参数(推荐) 在JavaScript中,函数参数是一个重要的概念,函数的可用性和实用性很大程度上依赖于参数。在本文中,我们将介绍JavaScript函数参数的各种方面,包括: 位置参数 默认参数 剩余参数 命名参数 参数解构 位置参数 位置参数是函数定义中的参数,它们的值由调用函数时传递的参数值确定。例如: function …

    JavaScript 2023年5月27日
    00
  • javascript URL编码和解码使用说明

    Javascript URL编码和解码使用说明 在Javascript编程中,url编码和解码是常见的操作。URL编码指将url中的特殊字符进行转义,以便于传输和处理;而URL解码则是将转义后的特殊字符还原回原来的字符。本文将详细介绍Javascript中URL编码和解码的使用方法。 URL编码 Javascript中URL编码通过encodeURIComp…

    JavaScript 2023年5月19日
    00
  • js技巧–转义符”\”的妙用

    来讲讲JavaScript中转义符“\”的妙用吧。 转义符的作用 在JavaScript中,转义符“\”可以在特定情况下表示一些特殊字符或者让某些字符变得有特殊意义。例如,我们可以使用转义符将一些内容输出在HTML中的标签中。 转义符实现HTML中标签的插入 比如说,我们有一个网站,需要在页面上显示如下这段文字: <p>This is a par…

    JavaScript 2023年5月28日
    00
  • 再谈javascript注入 黑客必备!

    再谈 JavaScript 注入 黑客必备! 什么是 JavaScript 注入 JavaScript 注入是指通过在网页中插入恶意代码来实现攻击的一种手段。JavaScript 是一种广泛使用的客户端脚本语言,可以控制网页的行为并与服务器端进行交互。黑客可以通过 JavaScript 注入技术将恶意代码注入到网页中,从而控制网页的行为并实现攻击。 Java…

    JavaScript 2023年5月28日
    00
  • js+css实现增加表单可用性之提示文字

    这里给出JS和CSS实现增加表单可用性之提示文字的完整攻略。 攻略详解 概述 表单是我们日常工作和生活中不可或缺的一部分,为了方便用户填写表单时可以更加清晰明了地知道每个输入框的作用,我们需要在表单中添加提示文字。在这里,我们可以通过JS和CSS的组合,为表单添加提示文字,并且在用户输入时自动隐藏。 实现步骤 首先,在HTML代码中为表单添加一个CSS类名,…

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