JS简单实现移动端日历功能示例

首先,实现移动端日历功能需要考虑日期的显示、日期的选择和切换不同月份等问题,以下是一个完整攻略:

设计思路

  1. 在页面中渲染日历主体部分,包括日期、星期、月份等。
  2. 通过 JavaScript 操作获取当前时间,并根据当前时间初始化日历的显示。
  3. 实现日历的月份、日期的切换。
  4. 实现日期的选择,可以记录选中的日期并高亮显示。

代码实现

HTML 结构

首先,我们需要在 HTML 中创建一个日历的结构,包括表格、日期、星期和月份等。

<div class="calendar">
  <div class="header">
    <span class="prev-month">&lt;</span>
    <span class="month">2021年5月</span>
    <span class="next-month">&gt;</span>
  </div>
  <table>
    <thead>
      <tr>
        <th>日</th>
        <th>一</th>
        <th>二</th>
        <th>三</th>
        <th>四</th>
        <th>五</th>
        <th>六</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="disabled">25</td>
        <td class="disabled">26</td>
        <td class="disabled">27</td>
        <td class="disabled">28</td>
        <td class="">29</td>
        <td class="">30</td>
        <td class="">31</td>
      </tr>
      <!-- 其他日期的表格 -->
    </tbody>
  </table>
</div>

CSS 样式

.calendar {
  width: 300px;
  background-color: #fff;
  border: 1px solid #ccc;
  border-radius: 4px;
  font-size: 14px;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
}
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px;
  border-bottom: 1px solid #ccc;
}
.month {
  font-size: 16px;
  font-weight: bold;
}
table {
  width: 100%;
  margin: 0;
  border-collapse: collapse;
  text-align: center;
  table-layout: fixed;
}
table th,
table td {
  width: 14.28%;
  padding: 10px;
  border: 1px solid #ccc;
  box-sizing: border-box;
}
table th {
  color: #666;
}
td.disabled {
  color: #ccc;
}
td.selected {
  background-color: #f66;
  color: #fff;
  font-weight: bold;
  border-radius: 50%;
}

JavaScript 实现

获取时间

使用 Date() 对象获取当前时间,并获取当前年份、月份、日期等信息。

const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();

初始化日历

要初始化日历的显示,首先需要获取到当前月份的第一天是星期几,然后根据这个信息确定日历中表格的位置。同时,需要把具体的日期填充到表格中,如果某一天为当前日期,则需要高亮显示。

function initCalendar() {
  const firstDay = new Date(year, month - 1, 1).getDay();
  const daysInMonth = new Date(year, month, 0).getDate();

  const prevMonthDays = firstDay === 0 ? 7 : firstDay;
  let lastMonthDays = new Date(year, month - 1, 0).getDate();

  const tbody = document.querySelector("table tbody");

  let lastMonthStart = lastMonthDays - prevMonthDays + 1;
  const currentMonthDays =
    day === 1 ? 0 : Math.min(daysInMonth, prevMonthDays + 42);

  let row = null;
  for (let i = 1; i <= currentMonthDays; i++) {
    if ((i - 1) % 7 === 0) {
      row = document.createElement("tr");
      tbody.appendChild(row);
    }
    const cell = document.createElement("td");
    if (i <= prevMonthDays) {
      cell.className = "disabled";
      cell.textContent = lastMonthStart++;
    } else {
      const date = i - prevMonthDays;
      if (date === day) {
        cell.className = "selected";
      }
      cell.textContent = date;
    }
    row.appendChild(cell);
  }
}

切换月份

切换月份需要先修改 yearmonth 的值,然后调用初始化日历的函数重新渲染日历。

function prevMonth() {
  month--;
  if (month < 1) {
    year--;
    month = 12;
  }
  clearCalendar();
  initCalendar();
}

function nextMonth() {
  month++;
  if (month > 12) {
    year++;
    month = 1;
  }
  clearCalendar();
  initCalendar();
}

选择日期

选择日期需要监听鼠标单击事件,并根据点击的 <td> 元素所在行和列,获取日期信息并记录下来。同时,要把先前选中的日期的类名去掉,然后给当前选中的日期加上类名以实现高亮显示。

function selectDate(e) {
  const td = e.target;
  if (td.tagName === "TD" && !td.classList.contains("disabled")) {
    const currentSelected = document.querySelector(".selected");
    if (currentSelected) {
      currentSelected.classList.remove("selected");
    }
    td.classList.add("selected");
  }
}

案例说明

示例 1:修改月份

我们可以通过增加两个按钮,分别用于切换到上一个月和下一个月,来实现切换月份的功能。如下面的 HTML 代码所示:

<div class="calendar">
  ...
  <div class="footer">
    <button id="prevMonthBtn">&lt;</button>
    <button id="nextMonthBtn">&gt;</button>
  </div>
</div>

然后,我们需要在 JavaScript 中为这两个按钮绑定事件监听函数,并在函数中调用切换月份的函数:

document.getElementById("prevMonthBtn").addEventListener("click", prevMonth);
document.getElementById("nextMonthBtn").addEventListener("click", nextMonth);

示例 2:显示详细日期信息

在 HTML 中,我们可以为每个 <td> 元素添加一个 data-date 属性,用于存储该日期的详细信息。如下所示:

<td class="" data-date="2021-06-01">1</td>

然后,我们可以在选择日期的函数中获取这个属性的值,并将其展示在页面的另一个位置上,比如一个 <div> 元素中。具体的代码如下:

function selectDate(e) {
  const td = e.target;
  ...
  const dateStr = `${year}-${month.toString().padStart(2, "0")}-${date
    .toString()
    .padStart(2, "0")}`;
  document.getElementById("selectedDate").textContent = dateStr;
}

其中,padStart 方法用于在数字不足两位时,在前面添加一个 0。dateStr 变量用于存储当前选中日期的字符串形式,然后将其添加到页面的 <div> 元素中,即可完成显示详细日期信息的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS简单实现移动端日历功能示例 - Python技术站

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

相关文章

  • js中string之正则表达式replace方法详解

    JS中String之正则表达式replace方法详解 什么是正则表达式 正则表达式可以理解为是一种匹配文本模式的规则。使用正则表达式可以方便地进行文本操作,如查找、替换、匹配等。在JavaScript中,可以使用RegExp对象来表示正则表达式。 replace方法概述 字符串的replace()方法可以用来替换字符串中的文本。它可以接受两个参数,第一个参数…

    JavaScript 2023年5月28日
    00
  • JavaScript实现的简单加密解密操作示例

    JavaScript实现的简单加密解密操作示例,主要是基于对字符串进行加密和解密操作。下面是该操作的完整攻略: 标题 在你的 markdown 文本中,使用 # 符号来标记不同级别的标题,如下所示: # 一级标题 ## 二级标题 ### 三级标题 加密和解密函数的编写 我们需要编写加密和解密函数,分别实现对字符串的加密和解密操作。下面是一个简单的实例: //…

    JavaScript 2023年5月19日
    00
  • 浅谈Ajax相关及其优缺点

    浅谈Ajax相关及其优缺点 什么是Ajax Ajax全称为Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),是一种用于创建现代Web应用的技术。它可以让网页在不刷新的情况下向服务器发送请求,获取数据并作出相应的动态更新。 Ajax的优缺点 优点 异步请求:可以在不刷新页面的情况下与服务器通信,否则需要…

    JavaScript 2023年6月11日
    00
  • Vue.js每天必学之数据双向绑定

    Vue.js每天必学之数据双向绑定攻略 什么是数据双向绑定 数据双向绑定是指当数据发生变化时,页面元素会自动更新来保持一致,同时当用户操作页面元素发生变化时,与之绑定的数据也会自动更新。 为什么需要数据双向绑定 数据双向绑定可以帮助我们更加方便地处理页面元素和数据之间的关系,简化了开发过程并提高了开发效率。 如何实现数据双向绑定 Vue.js提供了v-mod…

    JavaScript 2023年6月11日
    00
  • jquery对象和javascript对象即DOM对象相互转换

    将jQuery对象转换为DOM对象可以使用get()或[index]方法,将DOM对象转换成jQuery对象可以使用$()或jQuery()方法进行转换。 示例1:将jQuery对象转换成DOM对象 // 创建jQuery对象 var $elem = $(‘<div>’, {text: ‘Hello World!’}); // 将jQuery对象…

    JavaScript 2023年5月27日
    00
  • JavaScript编程的单例设计模讲解

    JavaScript编程的单例设计模式讲解 在JavaScript开发中,单例模式是一个常见的设计模式。它可以保证一个类只有一个实例,并提供一个全局可访问该实例的访问点。 使用场景 当一个对象需要在整个应用程序中只有一个实例时,就可以考虑使用单例模式。如: 全局状态管理 路由管理 模态框管理 数据库连接池 WebSocket连接管理等。 基本实现方式 let…

    JavaScript 2023年6月10日
    00
  • 利用JS十分钟判断数组中存在元素的多种方式

    利用JS十分钟判断数组中存在元素的多种方式 在JavaScript中,判断一个数组中是否存在某个元素,是我们经常需要面对的问题。以下是几种实现此功能的方式。 方法一:使用includes()方法 ES6中,可以使用数组的includes()方法来判断是否包含某个元素。 示例代码: const arr = [1, 2, 3]; console.log(arr.…

    JavaScript 2023年5月27日
    00
  • JavaScript静态类型检查工具FLOW简介

    JavaScript静态类型检查工具FLOW简介 什么是FLOW FLOW是Facebook推出的一款JavaScript静态类型检查工具。通过FLOW,我们可以在代码编写阶段就能够发现类型错误,从而减少代码运行时出错的风险,提高代码质量和稳定性。 FLOW的安装和使用 安装 FLOW需要通过NPM来进行安装,可以使用以下命令: npm install –…

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