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中使用Spread运算符的八种方法总结

    下面我将详细讲解“JavaScript中使用Spread运算符的八种方法总结”的完整攻略。 什么是Spread运算符 Spread运算符是ES6中新引入的一种运算符,由三个连续的点符号…组成。它可以将一个可迭代对象(如数组或者字符串)展开成单个元素,或将多个元素指定为数组的元素,具有非常强大的功能。语法如下: // 展开数组成为元素 […array]…

    JavaScript 2023年5月27日
    00
  • js实现的在线调色板功能完整实例

    下面是“JS实现的在线调色板功能完整实例”的完整攻略: 1. 调色板功能介绍 调色板是一种图形界面控件,常用于用户界面设计中。它提供了一组可供选择的颜色,用户可以通过调整滑块或者输入数值等方式选择颜色。而JavaScript可以通过一些特定的API来实现这样的调色板功能。 2. HTML结构与CSS样式 为了实现调色板功能,首先需要构建一个HTML页面,然后…

    JavaScript 2023年6月10日
    00
  • JavaScript严格模式不支持八进制的问题讲解

    JavaScript 严格模式是一种在 JavaScript 中启用更严格语法的模式,目的是为了避免一些潜在的错误和不安全的行为。在严格模式下,一些语法和行为会有所限制和修改,其中就包括不支持八进制数字字面量。下面将对此问题进行详细讲解。 什么是八进制数字字面量? 在 JavaScript 中,我们可以用不同的进制来表示数字。除了默认的十进制以外,还支持八进…

    JavaScript 2023年6月10日
    00
  • js替换字符串中所有指定的字符(实现代码)

    要替换 JavaScript 字符串中的所有指定字符,可以使用字符串的 replace() 函数。replace() 函数可以接受两个参数,第一个参数是需要替换的字符或正则表达式,第二个参数是替换为的字符或函数。为了替换所有指定的字符,我们需要使用正则表达式来匹配所有出现的目标字符。 以下是实现代码: var str = "Hello, World…

    JavaScript 2023年5月28日
    00
  • JavaScript函数的调用以及参数传递

    一、JavaScript函数的调用 JavaScript函数的调用可以通过三种方式进行,分别是: 1.函数直接调用 语法格式为: functionName() 示例代码: function sayHello(){ console.log(‘Hello World!’); } sayHello(); //输出:Hello World! 2.方法调用 方法调用需…

    JavaScript 2023年5月27日
    00
  • jQuery中使用animate自定义动画的方法

    当我们在前端开发中需要实现网站的动态效果时,很多情况下需要使用动画效果,而jQuery中是提供了一个非常方便的动画库——animate,它能够轻松实现元素的自定义动画。下面是使用animate实现自定义动画的步骤: 步骤1:引入jQuery库 在html文档中引入jQuery库的代码如下: <script src="https://cdn.b…

    JavaScript 2023年6月11日
    00
  • 详解Javascript动态操作CSS

    详解Javascript动态操作CSS 概述 在网页中,CSS是控制网页样式的重要手段之一,而通过Javascript动态修改CSS,可以实现更加灵活的交互效果。本攻略将介绍如何通过Javascript来动态修改CSS。 获取元素 首先,需要获取到需要修改CSS的元素。可以通过document.getElementById、document.getEleme…

    JavaScript 2023年6月10日
    00
  • 详解vue 单页应用(spa)前端路由实现原理

    详解Vue单页应用(SPA)前端路由实现原理 前言 前端路由是单页应用(SPA)的核心实现之一,Vue.js 作为一个流行前端框架,提供了内置路由器 Vue Router,方便前端开发者实现路由功能。在本文中,我们将详细讲解 Vue 单页应用(SPA)前端路由实现原理。 什么是单页应用(SPA)? 单页应用(Single Page Application,简…

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