Büyük Veri Tablolarını Mobilde Göstermek: Responsive Tablo Tasarım Rehberi
ERP ve dashboard tablolarını mobilde nasıl gösterilir? Yatay scroll, sticky column, card view pattern ve CSS container queries ile responsive tablo...
Sorun: 10+ Kolonlu Tablo Mobilde Nasıl Gösterilir?
ERP, CRM, dashboard uygulamalarında tablolar genellikle 10-20 kolon içerir. Masaüstünde sorun yok — ama mobilde 375px genişliğe sığdırmak imkansız.
En yaygın yanlış: tabloyu küçültmek. Font okunmaz, butonlar tıklanamaz.
4 Yaklaşım (En Basit → En Gelişmiş)
1. Yatay Scroll (overflow-x)
En basit ve en yaygın çözüm:
.table-container {
overflow-x: auto;
-webkit-overflow-scrolling: touch; /* iOS yumuşak scroll */
}
table {
min-width: 800px; /* Tablo minimum genişliği */
width: 100%;
}
<div class="table-container">
<table>
<thead>...</thead>
<tbody>...</tbody>
</table>
</div>
Avantaj: Sıfır JavaScript, tüm kolon yapısı korunur. Dezavantaj: Kullanıcı sağa kaydırmadan tüm veriyi göremez.
2. Sticky (Sabit) İlk Kolon
İlk kolonu sabitleyip geri kalanını kaydırılabilir yapın:
.table-container {
overflow-x: auto;
position: relative;
}
table th:first-child,
table td:first-child {
position: sticky;
left: 0;
z-index: 2;
background: var(--color-bg); /* Arka plan rengi şart */
box-shadow: 2px 0 4px rgba(0,0,0,0.1);
}
Avantaj: Müşteri adı veya ürün kodu her zaman görünür. Dezavantaj: İkinci kolonu da sabitlemek karmaşıklaşır.
3. Card View Pattern
Mobilde tablo satırlarını karta dönüştürün:
/* Masaüstünde normal tablo */
@media (min-width: 769px) {
.responsive-table thead { display: table-header-group; }
.responsive-table tr { display: table-row; }
.responsive-table td { display: table-cell; }
}
/* Mobilde kart görünümü */
@media (max-width: 768px) {
.responsive-table thead { display: none; }
.responsive-table tr {
display: block;
margin-bottom: 1em;
border: 1px solid var(--color-border);
border-radius: 8px;
padding: 0.75em;
}
.responsive-table td {
display: flex;
justify-content: space-between;
padding: 0.4em 0;
border-bottom: 1px solid var(--color-border);
}
.responsive-table td:last-child {
border-bottom: none;
}
/* data-label attribute ile kolon başlığını göster */
.responsive-table td::before {
content: attr(data-label);
font-weight: 600;
color: var(--color-text-muted);
flex-basis: 40%;
}
}
<table class="responsive-table">
<thead>
<tr>
<th>Müşteri</th>
<th>Bakiye</th>
<th>Vade</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Müşteri">ABC Ltd.</td>
<td data-label="Bakiye">₺125.000</td>
<td data-label="Vade">15 gün</td>
</tr>
</tbody>
</table>
4. Kolon Gizleme (Priority Columns)
Önemli kolonları tutup, mobilde gereksiz olanları gizleyin:
/* Öncelik sistemi */
.col-priority-1 { } /* Her zaman görünür */
.col-priority-2 { } /* Tablette görünür, mobilde gizli */
.col-priority-3 { } /* Sadece masaüstünde görünür */
@media (max-width: 480px) {
.col-priority-2,
.col-priority-3 { display: none; }
}
@media (min-width: 481px) and (max-width: 768px) {
.col-priority-3 { display: none; }
}
React Bileşeni: Responsive Table
interface Column<T> {
key: keyof T;
label: string;
priority: 1 | 2 | 3;
render?: (value: T[keyof T], row: T) => React.ReactNode;
}
interface ResponsiveTableProps<T> {
columns: Column<T>[];
data: T[];
}
export function ResponsiveTable<T extends Record<string, any>>({
columns, data
}: ResponsiveTableProps<T>) {
return (
<div className="table-container">
<table className="responsive-table">
<thead>
<tr>
{columns.map(col => (
<th key={String(col.key)} className={`col-priority-${col.priority}`}>
{col.label}
</th>
))}
</tr>
</thead>
<tbody>
{data.map((row, i) => (
<tr key={i}>
{columns.map(col => (
<td
key={String(col.key)}
data-label={col.label}
className={`col-priority-${col.priority}`}
>
{col.render ? col.render(row[col.key], row) : row[col.key]}
</td>
))}
</tr>
))}
</tbody>
</table>
</div>
);
}
Hangi Yaklaşımı Ne Zaman Kullanmalı?
| Yaklaşım | En iyi kullanım | Kolon sayısı |
|---|---|---|
| Yatay scroll | Hızlı çözüm, az özelleştirme | 5-10 |
| Sticky column | Anahtar kolon her zaman görünmeli | 8-15 |
| Card view | Veri karşılaştırma gerekmiyorsa | 4-8 |
| Kolon gizleme | Bazı kolonlar isteğe bağlı | 10-20 |
| Karma | Sticky + kolon gizleme beraber | 15+ |
İlgili Yazılar
- Dark Mode Implementasyonu — Tablo renkleri tema ile
- Skeleton Loading UX — Tablo yüklenirken
- React Modular Dashboard — Dashboard tablo organizasyonu
Bu rehber MDN’nin CSS overflow ve position: sticky dokümantasyonuna dayanarak hazırlanmıştır.