如何编程实现Airbnb日历?

Airbnb是一个众所周知的在线短租服务平台,其最重要的功能之一就是房源日历。房源日历显示了未来日期的入住和离开日期,便于房东和房客进行预订,同时也是Airbnb收益的主力来源之一。在这篇文章中,我们将学习如何使用编程语言创建一个Airbnb风格的房源日历。

一、设计

让我们考虑下面这个例子:

![Airbnb style calendar](https://i.imgur.com/RZrd3tp.png)

我们需要实现以下功能:

显示当前月份和年份

显示该月份的日历表格,并标记已经预订的日期

允许用户点击已经预订的日期,并弹出一个选项卡,允许用户查看详细信息

二、实现

我们将使用HTML,CSS和JavaScript作为主要工具来实现该日历。让我们从HTML开始设计。

HTML

```html

SuMoTuWeThFrSa

```

这里我们使用了一个 `div` 元素将整个日历包裹起来,并包含一个 `header` 和一个 `table` 元素。在 `header` 元素中,我们使用了两个 `div` 元素分别用来放置月份和年份。在 `table` 元素中,使用 `thead` 元素和 `tbody` 元素分别用来放置星期几的和日期表格。日期表格的具体内容我们将在JavaScript中动态生成。

让我们看看CSS。

CSS

```css

calendar {

fontfamily: Arial;

border: 1px solid ccc;

padding: 10px;

}

header {

display: flex;

justifycontent: spacebetween;

marginbottom: 10px;

}

month,

year {

fontsize: 20px;

fontweight: bold;

}

table {

bordercollapse: collapse;

width: 100%;

}

th,

td {

textalign: center;

padding: 10px;

}

th {

backgroundcolor: f0f0f0;

}

td {

cursor: pointer;

}

.selected {

backgroundcolor: f0f0f0;

}

.modal {

display: none;

position: fixed;

zindex: 1;

left: 0;

top: 0;

width: 100%;

height: 100%;

overflow: auto;

backgroundcolor: rgba(0,0,0,0.4);

}

.modalcontent {

backgroundcolor: fefefe;

margin: 10% auto;

padding: 20px;

width: 80%;

}

.close {

color: aaa;

float: right;

fontsize: 28px;

fontweight: bold;

}

.close:hover,

.close:focus {

color: black;

textdecoration: none;

cursor: pointer;

}

```

在CSS中,我们为整个日历元素设置了一些基本样式,包括字体、边框和内边距。我们使用 `flex` 布局将月份和年份放置在头部。在表格中,我们设置了样式主要用于美化和布局,其中包括文本居中对齐、鼠标光标和背景色。

现在让我们看看JavaScript代码。

JavaScript

我们需要定义一些全局变量,包括当前日期、选择的日期和模态框。我们可以使用 `Date` 对象获取当前日期,同时将选择的日期设为 `null` 和模态框设为 `null`。

```javascript

let now = new Date();

let selectedDate = null;

let modal = null;

```

我们需要编写 `initCalendar` 函数来初始化整个日历。该函数将主要完成以下工作:

1. 在 `month` 和 `year` 元素中显示当前月份和年份;

2. 生成日期表格的主体,并使用月份填充日期;

3. 标记已经预订的日期。

```javascript

function initCalendar() {

// 显示当前月份和年份

document.querySelector('month').innerHTML = now.toLocaleString('default', {month: 'long'});

document.querySelector('year').innerHTML = now.getFullYear();

// 获取该月份的天数和月份的第一天是星期几

let daysInMonth = new Date(now.getFullYear(), now.getMonth() 1, 0).getDate();

let firstDayOfMonth = new Date(now.getFullYear(), now.getMonth(), 1).getDay();

// 生成日期表格的主体

let calendarTable = document.querySelector('days');

let calendarData = '';

for (let i = 0; i < firstDayOfMonth; i ) {

calendarData = '';

}

for (let i = 1; i <= daysInMonth; i ) {

let reserved = Math.random() < 0.2 ? 'reserved' : '';

calendarData = `${i}`;

if ((firstDayOfMonth i) % 7 === 0 || i === daysInMonth) {

calendarData = `${calendarData}`;

calendarTable.innerHTML = calendarData;

calendarData = '';

}

}

// 标记已经预订的日期

let reservedDates = document.querySelectorAll('.reserved');

reservedDates.forEach(date => {

date.classList.add('reserved');

date.addEventListener('click', showModal);

});

}

```

在该函数中,我们首先获取当前月份和年份,并将它们显示在页面中。我们使用 `Date` 对象获取本月份的总天数和第一天是星期几。我们使用循环体生成日期表格的主体,通过选择器 `days` 获取日期表格的主体并向其中动态添加元素。循环体中,我们标记已经预订的日期,同时添加点击事件,当用户点击已经预订的日期时将弹出一个选项卡。我们将 `initCalendar` 函数与 `window.onload` 事件绑定,在页面加载完毕后自动执行该函数。

```javascript

window.onload = initCalendar;

```

现在,我们需要实现 `showModal` 和 `hideModal` 函数来显示和隐藏模态框。原理是动态创建模态框并通过选择器获取,使用 `display` 属性来控制其显示和隐藏。

```javascript

function showModal() {

let date = this.getAttribute('datadate');

let modalContent = `

×

您选择了 ${now.toLocaleString('default', {month: 'long'})} ${date} 号。

`;

modal = document.createElement('div');

modal.classList.add('modal');

modal.innerHTML = `

${modalContent}
`;

document.querySelector('body').appendChild(modal);

document.querySelector('.close').addEventListener('click', hideModal);

}

function hideModal() {

modal.style.display = 'none';

modal.remove();

modal = null;

}

```

在 `showModal` 函数中,我们首先获取用户点击的日期并生成模态框的主体。接着,我们通过创建一个 `div` 元素动态生成模态框,并将其插入到 `body` 元素中。我们还需要给生成的模态框添加关闭按钮的事件监听,即点击关闭按钮时调用 `hideModal` 函数。在 `hideModal` 函数中,我们通过设置 `display` 属性来隐藏模态框,并清空全局变量 `modal`。

在CSS中,我们为模态框定义了样式,并为关闭按钮定义了样式和事件监听器。

```javascript

document.querySelector('.close').addEventListener('click', hideModal);

```

完成了所有功能之后,我们的日历就可以正常运作了!

完整代码

```html

Airbnb日历

SuMoTuWeThFrSa

```

这是一个简单的Airbnb风格的日历,实现了跟踪、展示以及预订日期的基本功能。通过这个例子,我们可以加深对HTML、CSS和JavaScript的理解,同时了解如何使用这些语言来开发实用的应用程序。

免责声明:本网站部分内容由用户自行上传,若侵犯了您的权益,请联系我们处理,谢谢!

分享:

扫一扫在手机阅读、分享本文