JS实现简易日历效果

yizhihongxing

下面是详细讲解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日

相关文章

  • vue使用keep-alive保持滚动条位置的实现方法

    当我们在Vue应用中使用Vue-router进行路由跳转时,如果跳转到的页面存在滚动条,那么这时候就会存在一个问题,就是当我们返回到之前的路由时,滚动条会自动回到顶部,而不是保持在之前的位置。而我们可以使用keep-alive组件来保持滚动条位置。 Vue中keep-alive组件的使用 Vue中的keep-alive组件可以帮助我们在组件切换时,保留组件状…

    JavaScript 2023年6月11日
    00
  • js停止输出代码

    如果想要在JavaScript中停止当前代码的执行,可以使用以下几种方法: 1. 使用throw语句抛出错误 使用throw语句可以抛出一个自定义的错误,从而终止代码执行。示例代码如下: function divide(a, b) { if (b === 0) { throw new Error(‘除数不能为0!’); } return a / b; } t…

    JavaScript 2023年5月28日
    00
  • javascript下使用Promise封装FileReader

    下面我将详细讲解如何在JavaScript中使用Promise封装FileReader。 什么是Promise? 在介绍如何使用Promise封装FileReader之前,先来简述一下Promise的概念。 Promise是一种异步编程的解决方案,它可以优雅地处理回调地狱(callback hell)问题,使得异步操作更为简洁、可读性更强。 使用Promis…

    JavaScript 2023年6月11日
    00
  • JavaScript实现抽奖器效果

    抽奖器效果是很常见的一种交互效果,下面就用 Markdown 格式给大家详细讲解一下如何使用 JavaScript 实现抽奖器效果。 准备工作 在实现抽奖器效果之前,我们需要先准备好以下工作: 在 HTML 页面中放置一个用于显示抽奖结果的元素,比如一个 span 标签。 准备好抽奖数据,可以是一个数组,每个元素表示一个奖品。 实现步骤 接下来就可以开始实现…

    JavaScript 2023年6月11日
    00
  • JavaScript实现获取dom中class的方法

    实现获取DOM中class的方法,可以使用原生JavaScript中的classList属性,也可以使用jQuery中的选择器方法。 使用原生JavaScript 获取DOM元素节点 javascript var element = document.getElementById(‘elementId’); 获取节点中的class列表 javascript …

    JavaScript 2023年6月10日
    00
  • javascript 事件处理程序介绍

    JavaScript 事件处理程序介绍 在 JavaScript 中,事件处理程序是处理在页面中发生的事件的功能代码。当用户在页面上进行操作时,比如单击一个按钮或是按下一个键盘按键,这些事件将被浏览器捕获,然后触发相应的事件处理程序。 事件处理程序的绑定方式 1. HTML事件处理程序 在HTML标签中直接在属性中绑定事件处理程序。 <button o…

    JavaScript 2023年5月28日
    00
  • 详解js界面跳转与值传递

    关于“详解js界面跳转与值传递”的攻略,我们可以分为以下几个部分: 1. 基本的页面跳转方式 在Web应用开发中,实现页面跳转是一个非常常见的需求。在JavaScript中,我们可以使用location对象来实现页面跳转。下面是示例代码: location.href = "http://www.example.com"; // 使用hre…

    JavaScript 2023年6月11日
    00
  • extjs4图表绘制之折线图实现方法分析

    关于“extjs4图表绘制之折线图实现方法分析”的完整攻略,我将给你详细讲解。 1. 前言 折线图是常用的一种图表类型,它可以帮助我们展示数据的变化趋势和规律。而在extjs4中,我们也可以轻松地利用其中的图表组件来绘制折线图。下面是具体实现步骤。 2. 准备工作 在开始绘制折线图之前,我们需要做一些准备工作。 首先,我们需要导入extjs4中的chart.…

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