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

为了让大家更好地理解如何使用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日

相关文章

  • 了解前端理论:rscss和rsjs

    了解前端理论:rscss和rsjs 什么是rscss? rscss的全称是“Reasonable System for CSS Stylesheet Structure”,中文翻译为“合理的CSS样式表结构系统”。它是一种CSS结构组织的方法论,旨在提供一种有条理、可维护的CSS编写方式。rscss的设计目标是: 可读性:易于阅读和理解的代码结构 可维护:容…

    JavaScript 2023年5月27日
    00
  • JavaScript Length 属性的总结

    我们来讲解一下JavaScript Length 属性的总结。 什么是JavaScript Length属性 在JavaScript中,Length属性是Array对象的一个属性,用来返回该数组的元素个数。当Length属性被调用时,它的返回值是一个表示数组中元素个数的数字。 JavaScript Length属性的使用方法 可以使用以下语法来获得数组的长度…

    JavaScript 2023年5月28日
    00
  • JS面向对象编程详解

    JS面向对象编程详解 JavaScript是一种基于对象的语言。在JavaScript中,对象既可以是内置的,如Math和Date对象,也可以是自定义的。在这种语言中,我们使用面向对象编程(OOP)模式进行代码的组织和控制。 面向对象编程(OOP)是一种程序设计模式,它将计算机程序中的数据和功能组成了对象,通过对象之间的交互来实现计算机程序的功能。在Java…

    JavaScript 2023年5月18日
    00
  • 详解JS HTML Web端使用MQTT通讯测试

    下面是“详解JS HTML Web端使用MQTT通讯测试”的完整攻略: 一、MQTT介绍 即消息队列遥测传输(Message Queue Telemetry Transport,缩写为MQTT)是一个开放的物联网协议,由IBM于1999年开发。它是一个非常轻量的通讯协议,适合于各种网络连接条件下的物联网设备之间的消息通讯。同时,MQTT协议可以和HTTP和W…

    JavaScript 2023年5月27日
    00
  • 详解JavaScript的定时器

    下面是详解JavaScript的定时器的完整攻略: 什么是JavaScript定时器 JavaScript定时器是用来控制代码在指定的时间间隔内执行的方法。它们是非常有用的,可以用于制作动画、轮播图、定时更新时间等。JavaScript中有两种类型的定时器:setInterval()和setTimeout()。 setInterval() setInterv…

    JavaScript 2023年5月27日
    00
  • 基于jsTree的无限级树JSON数据的转换代码

    关于基于 jsTree 的无限级树 JSON 数据的转换代码,我来给您讲解一下完整攻略。 首先,我们需要了解一下 jsTree 的数据结构。它使用 JSON 对象来表示树形结构,其中每个节点都是一个对象,包含以下属性: “id”:节点的唯一标识符; “text”:节点的文本; “icon”:节点的图标; “state”:节点的状态,包括是否被选中、是否展开等…

    JavaScript 2023年5月28日
    00
  • js的写法基础分析

    我很乐意为你详细讲解“js的写法基础分析”的完整攻略。 标题 JS的写法基础分析 简介 在本篇文章中,你将学到JS的基础写法,包含变量定义、函数定义以及条件判断与循环等内容。同时,文章会使用两个实例帮助你更好地理解JS的写法基础。 变量定义 在JS中,变量定义是非常重要的基础内容。定义变量时,我们需要遵循以下规则: 变量的名称必须以字母、下划线或美元符号开头…

    JavaScript 2023年5月18日
    00
  • js冒泡法和数组转换成字符串示例代码

    让我来为大家详细讲解一下 “js冒泡法和数组转换成字符串示例代码” 的攻略。 js冒泡法 1. 什么是冒泡法? 冒泡法是一种基础的排序算法。它会重复地遍历数组,每次比较相邻两个元素的大小,并根据大小进行交换,直到数组顺序正确位置。 2. 冒泡法的具体实现 下面是冒泡法的详细代码: function bubbleSort(arr) { var len = ar…

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