آموزش ساخت تایملاینهای (Timeline) عمودی و افقی مدرن با CSS
رفیق توسعهدهنده! این مقاله قراره یه نقشه راه کامل باشه تا بتونی با CSS، تایملاینهای عمودی و افقی رو به صورت حرفهای بسازی. اگه دنبال ابزارهای خفن برای طراحیهای وبت هستی و میخوای پروژههات رو جذابتر کنی، یه سر به فروشگاه ابزارهای ما بزن که کلی چیزای باحال اونجا منتظرته!
همچنین اگه تو مسیر کدنویسی سوالی برات پیش اومد، میتونی با ما تماس بگیری: 09202232789
🗺️ نقشه راه ساخت تایملاینهای مدرن با CSS

۱. ساختار HTML 🧱
- ▪ لیستهای غیرترتیبی (UL)
- ▪ هر آیتم به عنوان یک رویداد (LI)
- ▪ عناصر داخلی برای تاریخ و محتوا
۲. تایملاین عمودی ⬆️
- ▪ استفاده از `::before` برای خط
- ▪ `position: relative` و `absolute`
- ▪ تراز کردن محتوا در دو طرف
۳. تایملاین افقی ↔️
- ▪ `display: flex` یا `grid`
- ▪ مدیریت سرریز (Overflow)
- ▪ رسپانسیو کردن با Media Queries
۴. مدرنسازی و تعامل ✨
- ▪ افکتهای هاور و انیمیشن
- ▪ استفاده از Font Awesome
- ▪ دسترسیپذیری (Accessibility)
فهرست مطالب

درک اصول اولیه تایملاین: چرا و چگونه؟

تایملاینها ابزارهایی بصری هستن که به کاربر کمک میکنن تا توالی رخدادها، مراحل یک پروژه، تاریخچه یک محصول یا هر اطلاعات زمانی دیگه رو به راحتی درک کنن. از نمایش تاریخچه شرکتها گرفته تا برنامهریزی رویدادها، کاربردهای بیشماری دارن. ساخت یه تایملاین جذاب و کاربردی با CSS، نه تنها تجربه کاربری رو بهبود میده، بلکه به پروژههای شما جلوهای حرفهای میبخشه.
ما در این مقاله، قدم به قدم یاد میگیریم چطور از HTML ساده برای ساختاردهی و از CSS قدرتمند برای جان بخشیدن به این ساختار استفاده کنیم. هدفمون اینه که تایملاینهایی بسازیم که هم از نظر بصری زیبا باشن و هم روی همه دستگاهها، از موبایلهای کوچیک گرفته تا تلویزیونهای بزرگ، درست و حسابی نمایش داده بشن.
ساختار HTML پایه برای تایملاین
اساس هر تایملاینی، یه ساختار HTML منطقیه. بهترین راه برای ساختن یه تایملاین، استفاده از لیستهای غیرترتیبی (<ul>) هست. هر آیتم در این لیست (<li>) یک “رویداد” یا “نقطه زمانی” رو نشون میده. داخل هر <li> میتونیم المانهایی برای تاریخ، عنوان، توضیحات و حتی آیکونها قرار بدیم.
💡 نکته کلیدی: استفاده از ساختار معنایی HTML باعث میشه تایملاین شما برای موتورهای جستجو و ابزارهای دسترسیپذیری، قابل فهمتر باشه. هیچ ضروررتی برای استفاده از <div>های بیشمار نیست.
نمونه ساختار HTML
اینجا یه نمونه از ساختار اولیه HTML رو میبینید که برای هر دو نوع تایملاین (عمودی و افقی) قابل استفادهست:
<div class="timeline">
<ul>
<li class="timeline-event">
<div class="event-date">۲۰۲۳</div>
<div class="event-icon"><i class="fas fa-code"></i></div>
<div class="event-content">
<h4>شروع پروژه</h4>
<p>فاز اول توسعه و جمعآوری نیازمندیها آغاز شد.</p>
</div>
</li>
<li class="timeline-event">
<div class="event-date">۲۰۲۴</div>
<div class="event-icon"><i class="fas fa-rocket"></i></div>
<div class="event-content">
<h4>انتشار اولیه</h4>
<p>نسخه بتا برای تست و بازخورد کاربران منتشر گردید.</p>
</div>
</li>
<!-- رویدادهای دیگر -->
</ul>
</div>
تایملاین عمودی: گام به گام
تایملاینهای عمودی رایجترین نوع هستن و برای نمایش اطلاعات به ترتیب زمانی خیلی خوب کار میکنن. ایده اصلی اینه که یه خط عمودی در مرکز یا یک طرف داریم و رویدادها در کنار اون خط قرار میگیرن. میتونیم از شبهعنصرهای ::before و ::after در CSS برای ایجاد این خط و نقاط رویداد استفاده کنیم.
CSS پایه برای تایملاین عمودی
بیاید با استایلدهی به <ul> و <li> شروع کنیم:
.timeline {
position: relative;
max-width: 1200px;
margin: 0 auto;
padding: 20px 0;
}
.timeline ul {
list-style: none;
padding: 0;
margin: 0;
}
.timeline-event {
position: relative;
padding: 20px 0;
margin-left: 60px; /* برای فاصله از خط عمودی */
margin-bottom: 30px;
border-bottom: 1px dashed #eee; /* جداکننده رویدادها */
}
.timeline-event:last-child {
border-bottom: none;
}
ساخت خط عمودی و نقاط رویداد
حالا وقتشه که خط اصلی و نقاطی که هر رویداد رو نشون میدن، اضافه کنیم. این کار با استفاده از ::before و ::after روی .timeline-event انجام میشه:
/* خط عمودی اصلی */
.timeline::before {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 20px; /* موقعیت خط */
width: 4px;
background: linear-gradient(to bottom, #4CAF50, #2196F3); /* گرادیانت برای جلوه مدرن */
border-radius: 2px;
}
/* نقطه روی خط برای هر رویداد */
.timeline-event::before {
content: '';
position: absolute;
width: 20px;
height: 20px;
background: #fff;
border: 4px solid #4CAF50; /* رنگ دایره */
border-radius: 50%;
left: 13px; /* تنظیم موقعیت دقیق روی خط */
top: 25px;
z-index: 1; /* بالاتر از خط اصلی */
}
/* برای محتوا */
.event-date {
position: absolute;
left: -100px; /* تاریخ رو در سمت چپ خط قرار میدهیم */
top: 20px;
width: 80px;
text-align: right;
font-weight: 600;
color: #888;
font-size: 0.9em;
}
.event-content {
background-color: #f9f9f9;
padding: 15px 20px;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
margin-left: 20px; /* فاصله از نقطه */
}
.event-content h4 {
margin-top: 0;
margin-bottom: 10px;
color: #3f51b5;
font-size: 1.2em;
}
.event-content p {
margin-bottom: 0;
color: #666;
line-height: 1.6;
}
برای اینکه تایملاین شلوغ نباشه و خوانایی خوبی داشته باشه، میشه از display: flex روی .timeline-event استفاده کرد و محتوا رو به دو طرف خط منتقل کرد. برای این کار، نیاز به تغییراتی در ساختار HTML و CSS داریم. همچنین، میتونی از وبسایت ما برای کشف ابزارهای بیشتر طراحی وب استفاده کنی.
تایملاین عمودی دو طرفه (Dual-sided Vertical Timeline)
این طراحی جذاب، رویدادها رو به صورت متناوب در سمت چپ و راست خط عمودی نمایش میده. این کار به بهبود استفاده از فضا و زیبایی کمک میکنه.
برای این کار، باید .timeline-event رو به دو دسته زوج و فرد تقسیم کنیم یا کلاسهای جداگانهای براشون تعریف کنیم. من اینجا از :nth-child(even) و :nth-child(odd) استفاده میکنم.
/* تغییرات برای مرکز قرار دادن خط */
.timeline::before {
left: 50%;
transform: translateX(-50%);
}
.timeline-event {
margin-left: 0; /* ریست کردن مارجین قبلی */
width: 50%; /* هر رویداد نیمی از عرض رو بگیره */
position: relative;
margin-bottom: 40px;
padding: 0 25px; /* پدینگ برای فاصله از مرکز */
box-sizing: border-box; /* پدینگ داخل عرض حساب بشه */
}
/* رویدادهای سمت راست (فرد) */
.timeline-event:nth-child(odd) {
float: right;
clear: right;
text-align: right;
}
.timeline-event:nth-child(odd) .event-date {
left: auto;
right: -100px; /* تاریخ رو به راست منتقل میکنیم */
text-align: left;
}
.timeline-event:nth-child(odd) .event-content {
margin-left: 0;
margin-right: 20px; /* فاصله از نقطه */
}
.timeline-event:nth-child(odd)::before {
left: -10px; /* نقطه رو به سمت چپ آیتم منتقل میکنیم */
border-color: #2196F3;
}
/* رویدادهای سمت چپ (زوج) */
.timeline-event:nth-child(even) {
float: left;
clear: left;
text-align: left;
}
.timeline-event:nth-child(even) .event-date {
left: -100px; /* تاریخ رو به چپ منتقل میکنیم */
right: auto;
text-align: right;
}
.timeline-event:nth-child(even) .event-content {
margin-right: 0;
margin-left: 20px; /* فاصله از نقطه */
}
.timeline-event:nth-child(even)::before {
left: auto; /* ریست کردن left */
right: -10px; /* نقطه رو به سمت راست آیتم منتقل میکنیم */
border-color: #FFC107;
}
/* آیکونها در مرکز */
.event-icon {
position: absolute;
top: 25px;
left: 50%;
transform: translateX(-50%);
width: 30px;
height: 30px;
background-color: #fff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2em;
color: #555;
z-index: 2;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
با این تغییرات، خط عمودی به مرکز میره و رویدادها به صورت متناوب در دو طرف قرار میگیرن. برای آیکونها، میتونی از Font Awesome استفاده کنی. فراموش نکن که لینک CDN اون رو به <head> اضافه کنی: <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">.
تایملاین افقی: از صفر تا صد
تایملاینهای افقی برای نمایش روند پیشرفت، پروژههای با مراحل مشخص یا جدولهای زمانی کوچکتر خیلی مناسبن. چالش اصلی در این نوع تایملاین، مدیریت فضا و اطمینان از رسپانسیو بودن در اندازههای مختلف صفحه نمایش هست.
ساختار با Flexbox
بهترین ابزار برای ساخت تایملاین افقی، Flexbox هست. با استفاده از display: flex روی کانتینر <ul>، میتونیم آیتمها رو در کنار هم قرار بدیم:
.timeline.horizontal {
padding: 50px 0;
overflow-x: auto; /* برای اسکرول افقی در صورت نیاز */
white-space: nowrap; /* جلوگیری از شکستن خطوط */
position: relative;
}
.timeline.horizontal ul {
display: flex;
justify-content: space-between; /* یا space-around */
position: relative;
padding-top: 60px; /* برای محتوای بالای خط */
padding-bottom: 60px; /* برای محتوای پایین خط */
}
/* خط افقی اصلی */
.timeline.horizontal ul::before {
content: '';
position: absolute;
top: 50px; /* موقعیت خط در مرکز */
left: 0;
right: 0;
height: 4px;
background: linear-gradient(to right, #4CAF50, #2196F3);
z-index: 0;
}
.timeline.horizontal .timeline-event {
flex: 1 0 200px; /* حداقل عرض برای هر رویداد */
margin: 0 10px;
padding: 0;
text-align: center;
border-bottom: none; /* ریست کردن بوردر عمودی */
position: relative;
white-space: normal; /* اجازه شکستن خطوط محتوا */
}
/* نقاط روی خط */
.timeline.horizontal .timeline-event::before {
content: '';
position: absolute;
width: 20px;
height: 20px;
background: #fff;
border: 4px solid #4CAF50;
border-radius: 50%;
left: 50%;
transform: translateX(-50%);
top: 41px; /* موقعیت دقیق روی خط */
z-index: 1;
}
.timeline.horizontal .event-content {
margin: 0;
margin-top: 20px; /* بالای خط */
background-color: #f9f9f9;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
.timeline.horizontal .timeline-event:nth-child(even) .event-content {
margin-top: 0;
margin-bottom: 20px; /* پایین خط */
}
.timeline.horizontal .timeline-event:nth-child(even)::before {
top: auto;
bottom: 41px;
border-color: #FFC107;
}
نکته: در تایملاین افقی، معمولاً رویدادهای زوج و فرد رو به ترتیب بالا و پایین خط قرار میدن تا فضا بهتر مدیریت بشه و تداخل متنی کمتری داشته باشیم.
طراحی رسپانسیو برای همه دستگاهها
مهم نیست چقدر تایملاین شما زیبا باشه، اگه روی موبایل، تبلت یا حتی تلویزیون درست نمایش داده نشه، تجربه کاربری فاجعهبار خواهد بود. رسپانسیو کردن تایملاین یه گام ضروریه.
تبدیل افقی به عمودی در موبایل
برای تایملاین افقی، معمولاً در صفحات کوچک (موبایل) بهتره که به حالت عمودی برگردونده بشه. این کار با Media Queries انجام میشه:
@media (max-width: 768px) {
/* تغییر تایملاین افقی به عمودی برای موبایل و تبلت */
.timeline.horizontal ul {
flex-direction: column; /* آیتمها زیر هم قرار بگیرن */
align-items: flex-start; /* آیتمها از چپ شروع بشن */
padding-top: 0;
padding-bottom: 0;
}
.timeline.horizontal ul::before {
top: 0;
bottom: 0;
left: 20px; /* خط عمودی در سمت چپ */
height: 100%;
width: 4px;
background: linear-gradient(to bottom, #4CAF50, #2196F3);
}
.timeline.horizontal .timeline-event {
width: 100%;
margin: 0;
padding: 20px 0;
margin-left: 60px; /* فاصله از خط عمودی جدید */
text-align: left;
border-bottom: 1px dashed #eee;
}
.timeline.horizontal .timeline-event:last-child {
border-bottom: none;
}
.timeline.horizontal .timeline-event::before {
left: 13px; /* نقطه روی خط عمودی */
top: 25px;
transform: none;
}
.timeline.horizontal .event-content {
margin-top: 0;
margin-bottom: 0;
margin-left: 20px; /* فاصله از نقطه */
}
.timeline.horizontal .timeline-event:nth-child(even) .event-content {
margin-top: 0;
margin-bottom: 0;
margin-left: 20px;
}
.timeline.horizontal .timeline-event:nth-child(even)::before {
top: 25px;
bottom: auto;
border-color: #4CAF50; /* رنگ یکپارچه */
}
.timeline.horizontal .event-date {
position: static; /* تاریخ رو به حالت عادی برگردونیم */
margin-bottom: 5px;
text-align: left;
width: auto;
font-size: 1em;
font-weight: 700;
color: #333;
}
}
با این مدیا کوئری، تایملاین افقی شما در صفحههای کوچکتر به تایملاین عمودی استاندارد تبدیل میشه. این یه راه حل مدنرن و کارآمده که تجربه کاربری رو در همه دستگاهها حفظ میکنه. اگر به کدهای آماده و اسنیپتهای بیشتر نیاز داری، حتماً بخش مربوطه رو چک کن.
اضافه کردن جلوههای مدرن و تعاملی
برای اینکه تایملاین شما واقعاً “مدرن” به نظر برسه، باید کمی چاشنی انیمیشن و تعامل بهش اضافه کنیم. افکتهای هاور، سایهها و تغییرات رنگ میتونن جذابیت بصری زیادی ایجاد کنن.
افکتهای هاور و ترنزیشن
وقتی کاربر ماوس رو روی یک رویداد میبره، میتونه یه تغییر رنگ یا بزرگ شدن جزئی رو ببینه:
.event-content {
transition: all 0.3s ease-in-out; /* اضافه کردن ترنزیشن برای smooth شدن تغییرات */
cursor: pointer;
}
.timeline-event:hover .event-content {
background-color: #e0f2f7; /* رنگ پسزمینه جدید */
box-shadow: 0 8px 16px rgba(0,0,0,0.2); /* سایه عمیقتر */
transform: translateY(-5px); /* کمی به سمت بالا حرکت کنه */
}
.timeline-event:hover::before {
border-color: #2196F3 !important; /* تغییر رنگ نقطه */
transform: scale(1.2); /* بزرگتر شدن نقطه */
transition: all 0.3s ease-in-out;
}
استفاده از آیکونها و رنگبندی
آیکونها و رنگهای مناسب میتونن به تایملاین شما روح ببخشن. با Font Awesome میتونید هزاران آیکون مختلف رو به راحتی اضافه کنید و با استفاده از متغیرهای CSS، مدیریت رنگها رو آسونتر کنید.
🎨 متغیرهای CSS (CSS Variables) برای مدیریت رنگبندی: با تعریف رنگهای اصلی در متغیرها، میتونید به راحتی تم رنگی تایملاین رو تغییر بدید.
:root {
--primary-color: #4CAF50;
--secondary-color: #2196F3;
--accent-color: #FFC107;
--bg-light: #f9f9f9;
--text-dark: #333;
}
/* حالا میتونی از این متغیرها استفاده کنی: */
/* background-color: var(--bg-light); */
/* border-color: var(--primary-color); */
تکنیکهای پیشرفته و بهینهسازی
وقتی اصول اولیه رو یاد گرفتیم، میتونیم با چند تکنیک پیشرفتهتر، تایملاین رو بهینهسازی کنیم و قابلیتهای جدیدی بهش اضافه کنیم.
استفاده از CSS Grid برای چیدمانهای پیچیدهتر
در حالی که Flexbox برای تایملاینهای خطی عالیه، CSS Grid برای چیدمانهای دو بعدی و پیچیدهتر، قدرت بیشتری داره. مثلاً میتونی یک تایملاین با چندین خط موازی یا با بخشهای نامنظم بسازی.
| ویژگی | Flexbox (۱ بُعدی) | CSS Grid (۲ بُعدی) |
|---|---|---|
| هدف اصلی | چیدمان در یک خط (افقی یا عمودی) | چیدمان در سطرها و ستونها |
| مناسب برای | تایملاینهای ساده عمودی/افقی | تایملاینهای با ساختار پیچیدهتر، گالریها |
| کنترل آیتم | بر اساس محتوا و فضای موجود | دقیق بر اساس خطوط Grid |
بهبود دسترسیپذیری (Accessibility)
برای اینکه تایملاین شما برای همه کاربران (از جمله کسانی که از ابزارهای کمکی استفاده میکنن) قابل فهم باشه، باید به دسترسیپذیری توجه کنی:
- از تگهای معنایی (
<ul>،<li>،<h4>) استفاده کن. - مطمئن شو که کنتراست رنگی بین متن و پسزمینه به اندازه کافی واظح هست.
- برای آیکونها از
aria-hidden="true"استفاده کن اگه فقط جنبه تزئینی دارن، و اگه اطلاعات مهمی دارن، متن جایگزین (altیاaria-label) اضافه کن. - برای تایملاینهای افقی که اسکرول میخورن، از راهنماهای ناوبری (مثلاً دکمههای چپ و راست) برای کاربران صفحهخوان استفاده کن.
عیبیابی سریع و راه حلها
تو مسیر ساخت تایملاین، ممکنه به مشکلاتی بربخوری. اینجا به چند مورد رایج و راه حلشون اشاره میکنم:
۱. خط عمودی/افقی نمایش داده نمیشه یا ناقصه
علت احتمالی:
position: relative;روی کانتینر اصلی (.timeline) اعمال نشده.content: '';در شبهعنصر::beforeیا::afterفراموش شده.- عرض (
width) یا ارتفاع (height) شبهعنصر صفر هست. z-indexنامناسب باعث شده زیر عناصر دیگه قرار بگیره.
راه حل:
- مطمئن شو
.timeline { position: relative; }اعمال شده. - برای خط از
content: ''; width: 4px; height: 100%;(عمودی) یاwidth: 100%; height: 4px;(افقی) و برای نقاط ازwidth: 20px; height: 20px;استفاده کن. z-index: 1;رو برای نقاط روی خط وz-index: 0;رو برای خط اصلی تنظیم کن.
۲. محتوای رویدادها همپوشانی دارن یا بهم ریختهست
علت احتمالی:
marginیاpaddingناکافی بین آیتمها.floatیاpositionنادرست برای عناصر محتوا.- برای تایملاین افقی،
flex-wrap: nowrap;اعمال نشده یاflex-basis/widthآیتمها کم هست.
راه حل:
- با
margin-bottom(عمودی) یاmargin-left/right(افقی) به آیتمها فضای کافی بده. - در تایملاین عمودی دو طرفه، مطمئن شو که
clear: both;یاoverflow: hidden;روی کانتینر تایملاین یا بعد از هر رویداد اعمال شده تا floatها بهم نخورن. - برای افقی،
overflow-x: auto;وwhite-space: nowrap;رو روی کانتینر اصلی.timeline.horizontalاعمال کن و حداقل عرضی باflex: 0 0 250px;به هر رویداد بده.
۳. رسپانسیو بودن مشکل داره
علت احتمالی:
- Media Queries به درستی تعریف نشده یا breakpointها مناسب نیستن.
- از واحدهای مطلق (مثل
pxثابت) زیاد استفاده شده به جای واحدهای نسبی (%،em،rem،vw). viewport meta tagدر HTML صفحه وجود نداره.
راه حل:
- تگ
<meta name="viewport" content="width=device-width, initial-scale=1.0">رو به<head>اضافه کن. - برای تبدیل افقی به عمودی،
flex-direction: column;وalign-items: flex-start;رو در مدیا کوئری مناسب اعمال کن. - بیشتر از واحدهای نسبی استفاده کن و مقادیر
marginوpaddingرو در مدیا کوئریها تنظیم کن.
سوالات متداول (FAQ)
آیا تایملاینهای CSS با مرورگرهای قدیمی سازگار هستن؟
بیشتر ویژگیهای CSS که در این مقاله استفاده شد (مثل Flexbox، ::before و ::after، position) با مرورگرهای مدرن سازگار هستن. برای مرورگرهای قدیمیتر مثل IE11، ممکنه نیاز به پیشوندهای وندور (vendor prefixes) یا fallbackهای خاص داشته باشی. استفاده از ابزارهایی مثل Autoprefixer میتونه بهت کمک کنه.
چطور میتونم آیکونها رو به تایملاین اضافه کنم؟
بهترین راه، استفاده از کتابخانههای آیکون مثل Font Awesome هست. کافیه لینک CDN رو به <head> صفحه اضافه کنی و سپس از تگ <i> با کلاسهای مناسب برای هر آیکون استفاده کنی. میتونی آیکون رو داخل .event-icon یا حتی به عنوان content در شبهعنصرها قرار بدی.
آیا امکان اضافه کردن انیمیشنهای پیچیدهتر با CSS هست؟
بله، قطعاً! میتونی از @keyframes برای ساخت انیمیشنهای ورود (مثلاً fadeIn یا slideIn) برای هر رویداد استفاده کنی. همچنین، transition رو میتونی برای تغییرات smooth تر در هاور یا فوکوس به کار ببری. برای انیمیشنهای خیلی پیچیده و زمانبندی دقیق، ممکنه نیاز به جاوااسکریپت داشته باشی، اما CSS به تنهایی هم خیلی کارآمده.