vb编程制作简单日历
如何编程实现Airbnb日历?
Airbnb是一个众所周知的在线短租服务平台,其最重要的功能之一就是房源日历。房源日历显示了未来日期的入住和离开日期,便于房东和房客进行预订,同时也是Airbnb收益的主力来源之一。在这篇文章中,我们将学习如何使用编程语言创建一个Airbnb风格的房源日历。
一、设计
让我们考虑下面这个例子:
![Airbnb style calendar](https://i.imgur.com/RZrd3tp.png)
我们需要实现以下功能:
显示当前月份和年份
显示该月份的日历表格,并标记已经预订的日期
允许用户点击已经预订的日期,并弹出一个选项卡,允许用户查看详细信息
二、实现
我们将使用HTML,CSS和JavaScript作为主要工具来实现该日历。让我们从HTML开始设计。
HTML
```html
Su | Mo | Tu | We | Th | Fr | Sa |
---|
```
这里我们使用了一个 `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 = `
if ((firstDayOfMonth i) % 7 === 0 || i === daysInMonth) {
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 = `
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
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;
}
Su | Mo | Tu | We | Th | Fr | Sa |
---|
let now = new Date();
let selectedDate = null;
let modal = null;
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 = `
if ((firstDayOfMonth i) % 7 === 0 || i === daysInMonth) {
calendarData = `
calendarTable.innerHTML = calendarData;
calendarData = '';
}
}
let reservedDates = document.querySelectorAll('.reserved');
reservedDates.forEach(date => {
date.classList.add('reserved');
date.addEventListener('click', showModal);
});
}
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 = `
document.querySelector('body').appendChild(modal);
document.querySelector('.close').addEventListener('click', hideModal);
}
function hideModal() {
modal.style.display = 'none';
modal.remove();
modal = null;
}
window.onload = initCalendar;