לוחות שנה הפכו לחלק בלתי ניתן להימנע ממנו ביישומי האינטרנט המודרניים מאחר שהם מאפשרים למשתמשים לארגן, לתזמן ולעקוב אחר אירועים בצורה חלקה. בין אם אתה בונה כלי לניהול פרויקטים, אפליקציה לתזמון אירועים או חבילת יעילות אישית, רכיב לוח שנה מותאם אישית יכול לשפר מאוד את חוויית המשתמש. בעוד קיימות ספריות רבות לוח שנה מוכנות, יצירת רכיב משלך יכולה לספק את הגמישות לפגוש דרישות עיצוב ופונקציונליות ספציפיות.
במדריך זה, נבדוק כיצד לבנות רכיב דומה ללוח שנה של Google באמצעות JavaScript. עד סיום המדריך הזה, תהיה לך לוח שנה מאושר עם תכונות אינטראקטיביות והבנה עמוקה יותר של כיצד לבנות רכיבים שניתן להשתמש בהם שוב ליישומי האינטרנט שלך. בין אם אתה מפתח שמחפש להוסיף טאץ' ייחודי לפרויקט שלך או מישהו שמתרגש ללמוד את הפעולה הפנימית של פונקציות של לוח שנה, מדריך צעד אחר צעד זה יהיה יקר.
סקירה
ניצור רכיב לוח שנה עם התכונות הבאות:
- ציר זמן: ציר אנכי מ-12 בלילה עד 11 בלילה.
- בלוקי אירועים: אירועים שמוצגים דינמייתי עם מיקום וגובה תקין בהתאם לזמני ההתחלה והסיום שלהם.
- טיפול בהתנגשויות: אירועים שנתקלים בהתנגשויות בזמן יופיעו ציד אחד לציד.
הנה איך ניתן ליצור את הרכיב הזה צעד אחר צעד.
מדריך צעד אחר צעד
1. להגדיר את ה-HTML ואת הסגנונות הבסיסיים
אנו מתחילים על ידי יצירת מבנה HTML מינימלי עבור לוח השנה. הפריסה כוללת ציר זמן ומיכל עבור אירועים.
<div class="calendar">
<div class="calendar-time">
<ul id="timelist" class="calendar-timelist"></ul>
</div>
<div id="events" class="calendar-events"></div>
</div>
הוספת CSS בסיסי עבור עיצוב הלוח:
.calendar {
display: flex;
width: 500px;
margin: 20px auto;
position: relative;
}
.event {
background: #039be5;
border: 1px solid white;
border-radius: 5px;
position: absolute;
box-sizing: border-box;
color: white;
overflow: hidden;
padding: 3px;
}
.calendar-time {
border-right: 1px solid #ccc;
width: 100px;
}
.calendar-timelist {
list-style: none;
padding: 0;
margin: 0;
text-align: right;
padding-right: 20px;
}
.calendar-timelist li {
height: 60px;
box-sizing: border-box;
width: 100%;
}
.calendar-events {
flex-grow: 1;
position: relative;
}
2. צירוף מחלקת ה-JavaScript עבור הלוח
הגדרת מחלקת Calendar
לאיחסון כל הפונקציות.
בונה
הבונה מאתחל את הלוח על ידי עיצוב הציר והאירועים:
class Calendar {
constructor(data) {
// Render the timeline on the Y-axis
this.renderTime();
// Render the event blocks
this.renderEvents(data);
}
renderTime() {
let timeHTML = Array.from({ length: 24 }, (_, i) => `<li>${this.to12HourFormat(i)}</li>`).join("");
document.getElementById("timelist").innerHTML = timeHTML;
}
renderEvents(data) {
let groupedEvents = this.groupEvents(data);
let eventData = this.calculateEventStyles(groupedEvents);
let eventHTML = eventData
.map(
(e) =>
`<div class="event" style="top: ${e.top}px; height: ${e.height}px; width: ${e.width}%; left: ${e.left}%; z-index: ${e.zIndex};">
<strong>${e.title}</strong><br>${e.time}
</div>`
)
.join("");
document.getElementById("events").innerHTML = eventHTML;
}
to12HourFormat(hour) {
if (hour === 0) return "12 AM";
if (hour < 12) return `${hour} AM`;
if (hour === 12) return "12 PM";
return `${hour - 12} PM`;
}
}
3. טיפול בחפיפות באירועים ומיקומם
אנו זקוקים ללוגיקה לטיפול באירועים המתחפפים. מתוך כך אנו מקבצים ומחשבים מיקומים מתאימים.
קיבוץ אירועים לפי שעת ההתחלה
groupEvents(data) {
let groups = [];
data.forEach((event) => {
let hour = parseInt(event.start.split(":")[0], 10);
if (!groups[hour]) groups[hour] = [];
groups[hour].push(event);
});
return groups;
}
חישוב סגנונות האירוע
עבור כל קבוצה, נחשב את הסגנונות של האירוע עבור top
, height
, width
, ו־left
בהתאם לזמן ולהתקנטות.
calculateEventStyles(groups) {
let eventData = [];
groups.forEach((group) => {
let columns = [];
group.forEach((event) => {
let { start, end } = event;
let [sh, sm] = start.split(":").map(Number);
let [eh, em] = end.split(":").map(Number);
let top = sh * 60 + sm; // Convert start time to minutes
let height = (eh * 60 + em) - top; // Calculate duration in minutes
let left = columns.findIndex((col) => col.end <= start);
if (left === -1) {
left = columns.length;
columns.push({ end });
} else {
columns[left].end = end;
}
eventData.push({
title: event.name,
time: `${this.to12HourFormat(sh)} - ${this.to12HourFormat(eh)}`,
top,
height,
left: (left * 100) / columns.length,
width: 100 / columns.length,
zIndex: left,
});
});
});
return eventData;
}
4. דוגמה לנתונים ואתחול
הגדרת נתוני האירוע ואתחול של Calendar
:
const events = [
{ name: "Meeting with Donna", start: "09:00", end: "10:30" },
{ name: "Project Sync", start: "10:00", end: "11:00" },
{ name: "Lunch Break", start: "12:00", end: "13:00" },
{ name: "Client Call", start: "11:30", end: "12:30" },
];
new Calendar(events);
5. דוגמה מלאה לקוד
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
<title>Calendar Component</title>
</head>
<body>
<div class="calendar">
<div class="calendar-time">
<ul id="timelist" class="calendar-timelist"></ul>
</div>
<div id="events" class="calendar-events"></div>
</div>
<script src="script.js"></script>
</body>
</html>
מסקנה
הגישה הזו משתמשת ב-JavaScript רגיל כדי ליצור באופן דינמי רכיב דומה ליומן של Google. על ידי פיצול הבעיה לזמן הצגה, קיבוץ אירועים, וחישוב סגנונות, ניתן לבנות רכיבים אינטראקטיביים ונפחיתים. ניתן לנסח את הקוד ולהוסיף תכונות כגון אירועים שניתנים לגרירה או עיצוב נוסף!
Source:
https://dzone.com/articles/building-a-google-calendar-like-component-using-javascript