Mobil Öncelikli Tasarım: Mobile-First Web Tasarımı
2026'da web trafiğinin %65'i mobil'den geliyor. Hala "desktop-first" tasarım yapan şirketler, pazarın 2/3'sini kaybediyor.
Mobil öncelikli tasarım (Mobile-First Design), bu sorunu çözer. Desktop için tasarlamak yerine, önce mobil için tasarla. Sonra desktop'a ekle.
Bu rehberde, mobile-first tasarımın filosofisini, pratiğini, ve doğru uygulanmasını öğreneceksiniz.
Mobile-First Nedir?
Mobile-First: Tasarımı mobil ekranda başla, sonra tablet ve desktop'a scale up et.
Desktop-First vs Mobile-First
Desktop-First:
Desktop 1920px → Tablet 768px → Mobil 375px
(Çıkarma işlemi - saati, hamburger menu koyup, column'ı sil)
Mobile-First:
Mobil 375px → Tablet 768px → Desktop 1920px
(Ekleme işlemi - menu ekle, column ekle, spacing scale up)
Mobile-First neden daha iyi?
- Constraint Forces Simplicity: Mobil dar olduğu için, gereksiz elemanları çıkarmaya zorlanırsın
- Content First: Essentials'ı belirlemek kolay
- Performance: Mobil'de optimize edilmiş ise, desktop'ta da hızlı
- SEO: Google, mobile-first index'lemesini yapıyor
Mobile-First Design Process
Adım 1: Mobil Wireframe (375px)
<!-- Mobil layout - single column -->
<header>
<logo></logo>
<hamburger-menu></hamburger-menu>
</header>
<main>
<hero-section></hero-section>
<feature-card></feature-card>
<feature-card></feature-card>
<feature-card></feature-card>
</main>
<footer></footer>
Önemli: Vertically stacked, no sidebars, full-width.
Adım 2: Tablet Wireframe (768px)
<!-- Tablet - iki kolona başla -->
<header>
<logo></logo>
<nav><!-- Hamburger + inline menu --></nav>
</header>
<main>
<hero-section></hero-section>
<feature-grid columns=2></feature-grid>
</main>
Adım 3: Desktop Wireframe (1920px)
<!-- Desktop - full feature sayfası -->
<header>
<logo></logo>
<nav full-menu></nav>
</header>
<main>
<sidebar></sidebar>
<hero-section></hero-section>
<feature-grid columns=3></feature-grid>
</main>
<footer></footer>
Mobile-First CSS Architecture
Mobile-first CSS'de, base styles mobil, media queries tablet/desktop:
/* Mobile (default, breakpoint yok) */
body {
font-size: 16px;
padding: 16px;
background: white;
}
.container {
width: 100%;
max-width: none;
}
.feature-grid {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
}
.nav {
display: none; /* Hamburger menu'ye hide */
}
.hamburger {
display: block;
}
/* Tablet (768px+) */
@media (min-width: 768px) {
body {
font-size: 16px;
padding: 24px;
}
.feature-grid {
grid-template-columns: 1fr 1fr; /* 2 columns */
gap: 24px;
}
.nav {
display: flex;
}
.hamburger {
display: none;
}
}
/* Desktop (1024px+) */
@media (min-width: 1024px) {
body {
padding: 32px;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
.feature-grid {
grid-template-columns: 1fr 1fr 1fr; /* 3 columns */
gap: 32px;
}
}
Anahtar: Desktop media query'i max-width değil, min-width kullan.
Mobile-First Navigation
Mobile'da menu depolama zor. Çözümler:
1. Hamburger Menu (Slide-out)
<!-- HTML -->
<header>
<button id="hamburger" aria-label="Menu">☰</button>
<nav id="menu" class="hidden">
<a href="/">Home</a>
<a href="/about">About</a>
<a href="/services">Services</a>
<a href="/contact">Contact</a>
</nav>
</header>
<!-- JavaScript -->
<script>
const hamburger = document.getElementById('hamburger');
const menu = document.getElementById('menu');
hamburger.addEventListener('click', () => {
menu.classList.toggle('open');
hamburger.setAttribute('aria-expanded',
menu.classList.contains('open'));
});
</script>
<!-- CSS -->
<style>
nav {
position: fixed;
top: 0;
left: -300px;
width: 300px;
height: 100vh;
background: #333;
transition: left 0.3s ease;
z-index: 1000;
}
nav.open {
left: 0;
}
/* Desktop - sidebar yok, inline nav */
@media (min-width: 768px) {
nav {
position: static;
width: auto;
height: auto;
background: none;
display: flex;
gap: 24px;
left: auto;
}
nav.open {
left: auto;
}
}
</style>
2. Bottom Tab Navigation
Mobil uygulamalarda popüler. Footer'da 4-5 tab.
<!-- Bottom tabs (mobil) -->
<nav class="bottom-tabs">
<a href="/" class="tab">🏠 Home</a>
<a href="/search" class="tab">🔍 Search</a>
<a href="/profile" class="tab">👤 Profile</a>
<a href="/settings" class="tab">⚙️ Settings</a>
</nav>
<style>
.bottom-tabs {
position: fixed;
bottom: 0;
left: 0;
right: 0;
display: flex;
justify-content: space-around;
background: white;
border-top: 1px solid #ddd;
}
.tab {
flex: 1;
padding: 12px;
text-align: center;
}
/* Desktop - hidden */
@media (min-width: 768px) {
.bottom-tabs {
display: none;
}
}
</style>
Mobile-First Typography
Mobil ekranda okuma zor. Optimizasyonlar:
/* Mobile Typography */
body {
font-size: 16px; /* Min 16px (zoom trigger) */
line-height: 1.6; /* Readable */
font-weight: 400;
-webkit-font-smoothing: antialiased;
}
h1 {
font-size: 28px; /* Mobil başlığı */
line-height: 1.2;
font-weight: 700;
margin-bottom: 16px;
}
h2 {
font-size: 22px;
line-height: 1.3;
margin-bottom: 12px;
}
p {
margin-bottom: 16px;
}
/* Tablet+ */
@media (min-width: 768px) {
h1 { font-size: 36px; }
h2 { font-size: 28px; }
}
/* Desktop+ */
@media (min-width: 1024px) {
h1 { font-size: 48px; }
h2 { font-size: 32px; }
}
Mobile-First Images
Responsive images, mobile-first:
<!-- Responsive image (mobile-first) -->
<picture>
<!-- Mobile (default) -->
<img src="image-small.jpg" alt="Description">
<!-- Tablet (600px+) -->
<source media="(min-width: 600px)" srcset="image-medium.jpg">
<!-- Desktop (1024px+) -->
<source media="(min-width: 1024px)" srcset="image-large.jpg">
</picture>
<!-- Modern approach: srcset -->
<img
srcset="
image-small.jpg 480w,
image-medium.jpg 1024w,
image-large.jpg 1920w"
sizes="
(max-width: 480px) 100vw,
(max-width: 1024px) 80vw,
1200px"
src="image-medium.jpg"
alt="Description"
>
Mobile-First Layouts: Grid & Flexbox
Flex (Simple)
/* Mobile - single column */
.container {
display: flex;
flex-direction: column;
gap: 16px;
}
/* Tablet+ - two column */
@media (min-width: 768px) {
.container {
flex-direction: row;
flex-wrap: wrap;
}
.item {
flex: 1 1 calc(50% - 8px);
}
}
/* Desktop+ - three column */
@media (min-width: 1024px) {
.item {
flex: 1 1 calc(33.333% - 11px);
}
}
Grid (Advanced)
/* Mobile - single column */
.grid {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
}
/* Tablet+ - responsive columns */
@media (min-width: 768px) {
.grid {
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
}
}
/* Desktop+ - fixed columns */
@media (min-width: 1024px) {
.grid {
grid-template-columns: repeat(3, 1fr);
gap: 32px;
}
}
Mobile-First Touch Interactions
Mobile'da tıklama konuşu çok. Tasarım:
/* Touch-friendly buttons & links */
button, a[role="button"] {
min-width: 48px;
min-height: 48px;
padding: 12px 16px;
font-size: 16px;
border: none;
border-radius: 4px;
cursor: pointer;
transition: all 0.3s ease;
-webkit-tap-highlight-color: transparent; /* iOS tap color */
}
button:active {
background: darker;
transform: scale(0.98); /* Visual feedback */
}
/* Links - underline on mobile, on hover desktop */
a {
color: #0066CC;
text-decoration: underline;
}
@media (min-width: 768px) {
a {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
}
Mobile-First Forms
Mobil formlar kısa ve basit:
<!-- Mobile-friendly form -->
<form>
<div class="form-group">
<label for="email">Email</label>
<input
id="email"
type="email"
inputmode="email"
placeholder="you@example.com"
required>
</div>
<div class="form-group">
<label for="phone">Phone</label>
<input
id="phone"
type="tel"
inputmode="tel"
placeholder="+90 (___) ___ __">
</div>
<button type="submit">Submit</button>
</form>
<!-- CSS -->
<style>
.form-group {
margin-bottom: 16px;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
}
input {
width: 100%;
padding: 12px;
font-size: 16px;
border: 1px solid #ddd;
border-radius: 4px;
}
input:focus {
outline: none;
border-color: #0066CC;
box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.1);
}
/* Tablet+ - inline form */
@media (min-width: 768px) {
.form-group {
display: inline-block;
width: calc(50% - 8px);
margin-right: 16px;
}
}
</style>
Mobile-First Performance
Mobile-first, otomatik olarak performance-optimized:
// Lazy load non-critical resources
if (window.innerWidth > 1024) {
// Load desktop-only resources
const script = document.createElement('script');
script.src = 'desktop-features.js';
document.body.appendChild(script);
}
// Intersection Observer for lazy load
const images = document.querySelectorAll('img[loading="lazy"]');
const imageObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.src = entry.target.dataset.src;
imageObserver.unobserve(entry.target);
}
});
});
images.forEach(img => imageObserver.observe(img));
Mobile-First Testing
Tasarımı test et (mobile'dan desktop'a):
-
Physical Mobile Devices:
- iPhone 12/13/14 (iOS)
- Samsung Galaxy (Android)
- Test touch interactions
-
DevTools (Chrome/Safari/Firefox):
- Toggle Device Toolbar (Cmd+Shift+M)
- Test breakpoint'leri
- Check performance
-
Real Device Testing:
- BrowserStack
- LambdaTest
- Özel cihazlar
Mobile-First Checklist
- [ ] Tasarımı mobil'de başlat
- [ ] Base CSS mobil optimize
- [ ] Media queries min-width kullan
- [ ] Touch targets 48x48px+
- [ ] Font size 16px+
- [ ] Navigation hamburger veya bottom tabs
- [ ] Forms minimal alanlar
- [ ] Images responsive
- [ ] Lazy loading implemented
- [ ] Performance optimized (LCP < 2.5s)
- [ ] Accessibility checked
- [ ] Tested on real devices
- [ ] No horizontal scroll
- [ ] Gestures (swipe, pinch) handled
- [ ] Loading states visible
Sonuç: Mobile-First = Future-Proof
Mobile-first tasarım:
- Otomatik mobile optimization
- Content-first approach
- Better performance
- Higher conversion (mobile users)
- Future-proof (screen sizes değişebilir, ama principle aynı)
2026'da hala desktop-first yapıyorsan, pazarın 2/3'ünü kaybediyorsun.
Mobile-first web tasarımında yardımcı olabiliriz. İletişime geçin.