javascript实现日历控件(年月日关闭按钮)

实现一个完整的日历控件包括以下几个步骤:

  1. 创建HTML结构

在HTML文件中创建一个日历控件的容器,例如:

<div id="calendar">
  <div class="header">
    <span class="prev">&lt;</span>
    <span class="currentDate"></span>
    <span class="next">&gt;</span>
    <span class="close">X</span>
  </div>
  <div class="content"></div>
</div>

其中,容器id为calendar,包含一个头部(header)和内容区(content)。头部包含当前日期、上一个月、下一个月和关闭按钮。

  1. 添加CSS样式

为日历控件添加样式,例如:

#calendar {
  position: absolute;
  width: 240px;
  height: 220px;
  background-color: #fff;
  border: 1px solid #ccc;
  box-shadow: 2px 2px 3px rgba(0,0,0,.3);
  font-size: 12px;
  color: #333;
}

#calendar .header {
  height: 30px;
  line-height: 30px;
  text-align: center;
  background-color: #f5f5f5;
  border-bottom: 1px solid #ccc;
}

#calendar .header span {
  display: inline-block;
  width: 30px;
  cursor: pointer;
}

#calendar .content {
  padding: 10px;
  text-align: center;
}

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

#calendar th,
#calendar td {
  padding: 5px;
}

#calendar td:hover {
  background-color: #f5f5f5;
  cursor: pointer;
}

#calendar td.selected {
  background-color: #337ab7;
  color: #fff;
}
  1. 加载JavaScript文件

在HTML文件中加载JavaScript文件,例如:

<script src="calendar.js"></script>
  1. 编写JavaScript代码

在JavaScript文件中编写日历控件的相关代码,例如:

var Calendar = function (id) {
  this.container = document.getElementById(id);
  this.currentDate = new Date();
  this.buildCalendar();
};

Calendar.prototype.buildCalendar = function () {
  // 清空之前的内容
  this.container.querySelector('.content').innerHTML = '';

  // 创建头部
  var header = this.createHeader();
  this.container.querySelector('.header').appendChild(header);

  // 创建表格
  var table = this.createTable();
  this.container.querySelector('.content').appendChild(table);

  // 绑定事件
  var self = this;
  this.container.querySelector('.prev').addEventListener('click', function () { self.gotoPrevMonth(); });
  this.container.querySelector('.next').addEventListener('click', function () { self.gotoNextMonth(); });
  this.container.querySelector('.close').addEventListener('click', function () { self.closeCalendar(); });
  var tds = this.container.querySelectorAll('td');
  for (var i = 0; i < tds.length; i++) {
    tds[i].addEventListener('click', function () { self.selectDate(this); });
  }
};

Calendar.prototype.createHeader = function () {
  var header = document.createElement('div');
  var prev = document.createElement('span');
  var next = document.createElement('span');
  var close = document.createElement('span');
  var currentDate = document.createElement('span');
  prev.innerHTML = '&lt;';
  next.innerHTML = '&gt;';
  close.innerHTML = 'X';
  currentDate.innerHTML = this.currentDate.getFullYear() + '年' + (this.currentDate.getMonth() + 1) + '月';
  currentDate.className = 'currentDate';
  prev.className = 'prev';
  next.className = 'next';
  close.className = 'close';
  header.appendChild(prev);
  header.appendChild(currentDate);
  header.appendChild(next);
  header.appendChild(close);
  return header;
};

Calendar.prototype.createTable = function () {
  var table = document.createElement('table');
  var thead = document.createElement('thead');
  var tbody = document.createElement('tbody');

  // 创建星期几的表头
  var weekDays = ['日', '一', '二', '三', '四', '五', '六'];
  var tr = document.createElement('tr');
  for (var i = 0; i < weekDays.length; i++) {
    var th = document.createElement('th');
    th.innerHTML = weekDays[i];
    tr.appendChild(th);
  }
  thead.appendChild(tr);

  // 创建日期的表格
  var firstDay = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), 1);
  var lastDay = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() + 1, 0);
  var daysInMonth = lastDay.getDate();
  var dayOfWeek = firstDay.getDay();
  var date = 1;
  var selectedDate = null;
  for (var i = 0; i < 6; i++) {
    var tr = document.createElement('tr');
    for (var j = 0; j < 7; j++) {
      var td = document.createElement('td');
      if (i === 0 && j < dayOfWeek) {
        // 上个月的日期
        var prevMonthLastDay = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), 0);
        td.innerHTML = prevMonthLastDay.getDate() - (dayOfWeek - j - 1);
        td.className = 'inactive';
      } else if (date > daysInMonth) {
        // 下个月的日期
        td.innerHTML = date - daysInMonth;
        td.className = 'inactive';
        date++;
      } else {
        td.innerHTML = date;
        date++;
      }

      if (td.innerHTML === selectedDate) {
        td.className = 'selected';
      }
      tr.appendChild(td);
    }
    tbody.appendChild(tr);
  }
  table.appendChild(thead);
  table.appendChild(tbody);
  return table;
};

Calendar.prototype.gotoPrevMonth = function () {
  this.currentDate = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() - 1, 1);
  this.buildCalendar();
};

Calendar.prototype.gotoNextMonth = function () {
  this.currentDate = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() + 1, 1);
  this.buildCalendar();
};

Calendar.prototype.selectDate = function (td) {
  var currentDate = this.currentDate.getFullYear() + '-' + (this.currentDate.getMonth() + 1) + '-' + td.innerHTML;
  console.log(currentDate);
};

Calendar.prototype.closeCalendar = function () {
  this.container.style.display = 'none';
};

以上是一个基本的日历控件的JavaScript代码,在这个控件中提供了选择日期、关闭控件、上一个月、下一个月等功能。可以在需要的页面中实例化该控件,并调用相应方法进行日期的选择。

以下是一个示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>JavaScript实现日历控件示例</title>
  <style>
    #calendar {
      position: absolute;
      width: 240px;
      height: 220px;
      background-color: #fff;
      border: 1px solid #ccc;
      box-shadow: 2px 2px 3px rgba(0,0,0,.3);
      font-size: 12px;
      color: #333;
    }

    #calendar .header {
      height: 30px;
      line-height: 30px;
      text-align: center;
      background-color: #f5f5f5;
      border-bottom: 1px solid #ccc;
    }

    #calendar .header span {
      display: inline-block;
      width: 30px;
      cursor: pointer;
    }

    #calendar .content {
      padding: 10px;
      text-align: center;
    }

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

    #calendar th,
    #calendar td {
      padding: 5px;
    }

    #calendar td:hover {
      background-color: #f5f5f5;
      cursor: pointer;
    }

    #calendar td.selected {
      background-color: #337ab7;
      color: #fff;
    }
  </style>
</head>
<body>
  <input type="text" id="date" />
  <div id="calendar">
    <div class="header">
      <span class="prev">&lt;</span>
      <span class="currentDate"></span>
      <span class="next">&gt;</span>
      <span class="close">X</span>
    </div>
    <div class="content"></div>
  </div>
  <script src="calendar.js"></script>
  <script>
    var dateInput = document.getElementById('date');
    dateInput.addEventListener('click', function () {
      var calendar = new Calendar('calendar');
      calendar.container.style.display = 'block';
    });
  </script>
</body>
</html>

以上示例中,为页面中的input元素绑定了点击事件,当点击该元素时,实例化了一个日历控件,并显示在页面上。通过这个控件选择的日期可以在控制台中查看。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript实现日历控件(年月日关闭按钮) - Python技术站

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

相关文章

  • 详解javascript中的变量提升和函数提升

    什么是变量提升和函数提升 在JavaScript中,当我们定义变量和函数时,会发生“变量提升”和“函数提升”的现象。变量提升指的是当声明一个变量时,JavaScript会将该声明提升至作用域顶部,也就是在代码中变量声明语句前使用该变量也不会报错。 同理,函数提升指的是在定义函数时,JavaScript也会将该函数提升至作用域顶部,因此在函数定义之前使用该函数…

    JavaScript 2023年5月27日
    00
  • JavaScript 事件属性绑定带参数的函数

    JavaScript 事件属性绑定带参数的函数,是指在绑定事件时,可以将一个或多个参数传递给要执行的函数。这种技术非常常用,特别是在处理事件时需要传递一些额外参数的情况下。 使用匿名函数绑定带参数的函数 使用匿名函数是一种常见的方式,可以在匿名函数中调用需要执行的函数,并将需要传递的参数传递给它。例如,我们可以在HTML中这样绑定一个带参数的click事件:…

    JavaScript 2023年6月10日
    00
  • JavaScript保留关键字汇总

    下面是JavaScript保留关键字汇总的完整攻略。 什么是JavaScript保留关键字 JavaScript保留关键字是指被JavaScript编程语言用作内部特定目的的单词或符号。这些单词或符号不能被作为变量名、函数名或标识符等用于代码中。如果这些关键字被用作标识符,代码就会出现编译错误。所以我们在编写JavaScript代码的时候,需要避免使用保留关…

    JavaScript 2023年5月18日
    00
  • JavaScript中数组成员的添加、删除介绍

    JavaScript中数组成员的添加、删除介绍 JavaScript中的数组是一种特殊的对象,我们可以通过数组索引将多个值存储在其中,并可以方便地进行添加、删除等操作。 添加元素 JavaScript提供了多种向数组中添加元素的方法: 1. push() push() 方法可以在数组的末尾添加一个或多个元素,并返回数组的新长度。 let arr = [‘ap…

    JavaScript 2023年5月27日
    00
  • JavaScript之浏览器对象_动力节点Java学院整理

    JavaScript之浏览器对象_动力节点Java学院整理 本文旨在详细讲解JavaScript中浏览器对象的使用,并提供相关的示例说明。 一、什么是浏览器对象 浏览器对象是指在JavaScript代码中可以直接调用的一些内置对象,它们包含了浏览器窗口、浏览器标签页、浏览器历史、浏览器地址栏、浏览器中的图片、表单等元素信息等等。浏览器对象可以通过JavaSc…

    JavaScript 2023年5月18日
    00
  • js中array的sort()方法使用介绍

    下面我将详细讲解一下“js中array的sort()方法使用介绍”的完整攻略。 什么是sort()方法 sort()方法是JavaScript Array对象上的一个方法,用于对数组中的元素进行排序。它可以接受一个可选的比较函数作为参数,该函数将用于比较数组中的元素以确定它们的排序顺序。 在未传递比较函数的情况下,sort()方法将以字母顺序对字符串进行排序…

    JavaScript 2023年5月27日
    00
  • jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】

    下面详细讲解如何使用jQuery的animate()方法实现背景色渐变效果,需要使用jQuery.color.js插件。具体步骤如下: 1. 引入jQuery和jQuery.color.js插件 在HTML文件中,我们需要引入jQuery和jQuery.color.js插件。 <script src="https://code.jquery.…

    JavaScript 2023年6月11日
    00
  • 解读邮箱正则表达式:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

    首先,这个正则表达式用于验证邮箱的格式是否正确。下面我会逐个解读每一个符号的含义。 ^ 表示匹配字符串的开头。 \w+ 表示匹配字母、数字、下划线至少一次,这部分表示邮箱用户名部分。 ([-+.]\w+)* 表示匹配特殊字符 -、+、. 后面跟一个或多个字母、数字、下划线,0次或多次。这部分表示邮箱用户名中的特殊字符部分,可以没有。 @ 表示匹配到 at 符…

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