HTML+CSS+JavaScript实现简单日历效果

yizhihongxing

为了让大家更好地理解如何使用HTML、CSS、JavaScript实现简单的日历效果,我将会提供一份详细的攻略。具体过程如下:

第一步:HTML代码

日历的基础是HTML代码,需要我们创建一个像如下的结构:

<div class="calendar">
  <div class="header">
    <button class="prev">&lt;</button>
    <span class="date">February 2021</span>
    <button class="next">&gt;</button>
  </div>
  <table>
    <tr>
      <th>Sun</th>
      <th>Mon</th>
      <th>Tue</th>
      <th>Wed</th>
      <th>Thu</th>
      <th>Fri</th>
      <th>Sat</th>
    </tr>
    <tr>
      <td class="prev-month">31</td>
      <td class="prev-month">1</td>
      <td class="prev-month">2</td>
      <td class="prev-month">3</td>
      <td class="prev-month">4</td>
      <td class="prev-month">5</td>
      <td class="prev-month">6</td>
    </tr>
    <!-- ......... -->
  </table>
</div>

这里的HTML结构包含一个日历 div 的主体和表头。主体包含一个标题 div 和一个 table 作为具体的日历。在这个 table 中,每个 td 表示一个日期,而每个 tr 则表示一个星期。

第二步:CSS的样式

我们需要在CSS样式中加入如下的代码:

.calendar {
  margin: 20px auto;
  font-family: Arial, sans-serif;
  border: 1px solid grey;
  box-shadow: 2px 2px 6px rgba(0,0,0,0.1);
  width: 300px;
  background-color: white;
}

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 2px 5px;
  background-color: #201e1f;
  color: white;
}

table {
  width: 100%;
  border-collapse: collapse;
}

th {
  padding: 5px;
  text-align: center;
}

td {
  height: 25px;
  text-align: center;
  border: 1px solid grey;
  padding: 5px;
}

.prev-month {
  color: grey;
}

.next-month {
  color: grey;
}

这段代码定义了整个日历的外观,包括颜色和表格的样式。

第三步:JavaScript的实现

我们需要加入一些JavaScript代码来完成日历的交互功能。具体实现可以分为三个部分:

  1. 获取当前月份的完整数据,并渲染到日历中去。
var date = new Date();
var today = date.getDate();
var month = date.getMonth();
var year = date.getFullYear();

var months = [
  "January",
  "February",
  "March",
  "April",
  "May",
  "June",
  "July",
  "August",
  "September",
  "October",
  "November",
  "December"
];

var monthAndYear = document.querySelector(".date");
monthAndYear.innerHTML = months[month] + " " + year;
  1. 给向前和向后按钮添加事件监听器,并更新日历。
document.querySelector(".prev").addEventListener("click", function () {
  month--;
  if (month < 0) {
    year--;
    month = 11;
  }
  showCalendar(month, year);
});

document.querySelector(".next").addEventListener("click", function () {
  month++;
  if (month > 11) {
    year++;
    month = 0;
  }
  showCalendar(month, year);
});
  1. 根据当前月份和年份在日历中展示正确的日期。
function showCalendar(month, year) {
  var firstDay = new Date(year, month, 1);
  var lastDay = new Date(year, month + 1, 0);
  var startingDay = firstDay.getDay();
  var monthLength = lastDay.getDate();

  var monthAndYear = document.querySelector(".date");
  monthAndYear.innerHTML = months[month] + " " + year;

  var calendar = document.querySelector("table tbody");

  calendar.innerHTML = "";

  var date = 1;
  for (var i = 0; i < 6; i++) {
    var row = document.createElement("tr");

    for (var j = 0; j < 7; j++) {
      if (i === 0 && j < startingDay) {
        var cell = document.createElement("td");
        cell.classList.add("prev-month");
        cell.innerHTML = "";
        row.appendChild(cell);
      } else if (date > monthLength) {
        break;
      } else {
        var cell = document.createElement("td");
        cell.innerHTML = date;
        if (date === today && year === new Date().getFullYear() && month === new Date().getMonth()) {
          cell.classList.add("current-day");
        }
        row.appendChild(cell);
        date++;
      }
    }

    calendar.appendChild(row);

    // Code for removing last row if it's empty
    var lastRowEmptyCells = row.querySelectorAll(":empty");
    if (lastRowEmptyCells.length === 7) {
      row.remove();
    }
  }
}

showCalendar(month, year);

整段代码的作用是获取当前日期、月份和年份,渲染月份和年份到标题上,并根据这些数据在日历中展示正确的日期。

示例说明

这是一个基础的日历效果实现,但我们还可以更进一步地添加更多的功能,比如点击日期后展示详情信息等等。这里是一个完整实现日历效果的代码示例:

<!DOCTYPE html>
<html>
  <head>
    <title>Calendar</title>
    <style>
      .calendar {
        margin: 20px auto;
        font-family: Arial, sans-serif;
        border: 1px solid grey;
        box-shadow: 2px 2px 6px rgba(0,0,0,0.1);
        width: 300px;
        background-color: white;
      }

      .header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 2px 5px;
        background-color: #201e1f;
        color: white;
      }

      table {
        width: 100%;
        border-collapse: collapse;
      }

      th {
        padding: 5px;
        text-align: center;
      }

      td {
        height: 25px;
        text-align: center;
        border: 1px solid grey;
        padding: 5px;
      }

      .prev-month {
        color: grey;
      }

      .next-month {
        color: grey;
      }

      .current-day {
        background-color: #201e1f;
        color: white;
      }
    </style>
  </head>
  <body>
    <div class="calendar">
      <div class="header">
        <button class="prev">&lt;</button>
        <span class="date"></span>
        <button class="next">&gt;</button>
      </div>
      <table>
        <thead>
          <tr>
            <th>Sun</th>
            <th>Mon</th>
            <th>Tue</th>
            <th>Wed</th>
            <th>Thu</th>
            <th>Fri</th>
            <th>Sat</th>
          </tr>  
        </thead>
        <tbody>
        </tbody>
      </table>
    </div>
    <script>
      var date = new Date();
      var today = date.getDate();
      var month = date.getMonth();
      var year = date.getFullYear();

      var months = [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December"
      ];

      var monthAndYear = document.querySelector(".date");
      monthAndYear.innerHTML = months[month] + " " + year;

      document.querySelector(".prev").addEventListener("click", function () {
        month--;
        if (month < 0) {
          year--;
          month = 11;
        }
        showCalendar(month, year);
      });

      document.querySelector(".next").addEventListener("click", function () {
        month++;
        if (month > 11) {
          year++;
          month = 0;
        }
        showCalendar(month, year);
      });

      function showCalendar(month, year) {
        var firstDay = new Date(year, month, 1);
        var lastDay = new Date(year, month + 1, 0);
        var startingDay = firstDay.getDay();
        var monthLength = lastDay.getDate();

        var monthAndYear = document.querySelector(".date");
        monthAndYear.innerHTML = months[month] + " " + year;

        var calendar = document.querySelector("table tbody");

        calendar.innerHTML = "";

        var date = 1;
        for (var i = 0; i < 6; i++) {
          var row = document.createElement("tr");

          for (var j = 0; j < 7; j++) {
            if (i === 0 && j < startingDay) {
              var cell = document.createElement("td");
              cell.classList.add("prev-month");
              cell.innerHTML = "";
              row.appendChild(cell);
            } else if (date > monthLength) {
              break;
            } else {
              var cell = document.createElement("td");
              cell.innerHTML = date;
              if (date === today && year === new Date().getFullYear() && month === new Date().getMonth()) {
                cell.classList.add("current-day");
                cell.style.cursor = "pointer";

                cell.addEventListener("click", function() {
                    alert("Today's date is: " + months[month] + " " + date + ", " + year + ".");
                })
              }
              row.appendChild(cell);
              date++;
            }
          }

          calendar.appendChild(row);

          // Code for removing last row if it's empty
          var lastRowEmptyCells = row.querySelectorAll(":empty");
          if (lastRowEmptyCells.length === 7) {
            row.remove();
          }
        }
      }

      showCalendar(month, year);
    </script>
  </body>
</html>

这个示例的实现方式和我们前面提到的基础实现方法非常相似,但是加入了点击具体日期展示相关信息的新功能。您可以点击具体的日期,系统会弹出提示框展示日期信息。

总结

这份攻略对于HTML、CSS和JavaScript的使用较为基础,但是已经可以快速的实现一份简单的日历。针对于更加复杂的效果,可以进一步调整代码并加入功能模块。

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

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

相关文章

  • JavaScript高级程序设计 阅读笔记(二十) js错误处理

    当我们在编写 JavaScript 代码时,难免会出现错误,这时我们需要做出适当的处理。本篇阅读笔记将讲解 JavaScript 错误处理的相关知识。 错误处理相关术语 异常 在运行 JavaScript 的时候,一旦出现了错误,便会抛出一个异常。 try-catch 语句 为了避免程序出现异常而终止,我们可以使用 try-catch 语句来捕捉异常。try…

    JavaScript 2023年5月27日
    00
  • 利用H5api实现时钟的绘制(javascript)

    利用H5api实现时钟的绘制(javascript)可以分为以下几个步骤: 1. 创建canvas元素并获取上下文对象 首先需要在html页面中创建一个canvas元素,通过JavaScript获取该元素的上下文对象。 示例代码: <canvas id="clockCanvas"></canvas> const c…

    JavaScript 2023年6月10日
    00
  • JavaScript高级程序设计 读书笔记之八 Function类及闭包

    JavaScript高级程序设计 读书笔记之八 Function类及闭包 Function类 Function类的特点 Function类本身也是一个函数,它可以像工厂函数一样构建新的函数实例。 使用Function构造函数构建函数,可以动态地创建函数语句。 可以将字符串形式的代码,通过Function的形式执行。 Function构造函数的使用 Funct…

    JavaScript 2023年5月28日
    00
  • JS Pro-深入面向对象的程序设计之继承的详解

    JS Pro-深入面向对象的程序设计之继承的详解 本攻略将从以下内容入手,逐步深入探讨JavaScript面向对象编程中的继承。 原型链继承 构造函数继承 组合继承 原型式继承 寄生式继承 寄生组合式继承 原型链继承 原型链继承,顾名思义,指的是连接原型链的方式进行继承。简单来说,就是在子类的构造函数中通过关联父类的原型实现继承。 function Pare…

    JavaScript 2023年5月27日
    00
  • 详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度

    一、介绍 本文是《详解XMLHttpRequest》系列的第二篇。在第一篇文章中,我们深入学习了XMLHttpRequest对象的用法、属性和方法。在本文中,我们将了解更多的响应属性、二进制数据和监测上传、下载进度的相关知识。 二、响应属性 在发送XMLHttpRequest请求后,可以使用以下响应属性来获取请求的响应。 1. responseText re…

    JavaScript 2023年6月10日
    00
  • JavaScript中的toLocaleDateString()方法使用简介

    当我们需要在 JavaScript 中将日期转换为特定格式的字符串时,可以使用 toLocaleDateString() 方法。 使用语法 toLocaleDateString() 方法接受两个可选参数:locales 和 options。 date.toLocaleDateString([locales[, options]]); 其中,locales 参…

    JavaScript 2023年6月10日
    00
  • JS Ajax请求如何防止重复提交

    JS Ajax请求如何防止重复提交的攻略如下: 1. 基于状态锁的防重复提交 1.1 原理 基于状态锁的防重复提交原理是,在第一次请求(提交表单)时,将提交按钮禁用,等到本次请求成功后,再将提交按钮启用。期间再次点击提交按钮不产生任何反应,从而达到防止重复提交的目的。 1.2 代码示例 $(‘#form’).on(‘submit’, function(e) …

    JavaScript 2023年6月11日
    00
  • js 创建对象的多种方式与优缺点小结

    关于 “JS 创建对象的多种方式与优缺点小结”,我们可以从以下几个方面来进行讲解: 1. 对象字面量创建对象 对象字面量是一种创建对象的简单方式,只需要用{}包含属性和方法即可。示例代码如下: var person = { name: "Tom", age: 20, sayHi: function() { console.log(&quo…

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