feat(mobile): comprehensive mobile web design patterns — 6 new articles
- mobile-patterns.md: Mobile layout & pattern systems (18.5KB) Fluid typography, container queries, safe-area, CSS architecture, touch-optimized components, iOS/Android specifics, testing checklist - mobile-layout-patterns.md: Mobile layout systems (11.5KB) CSS grid, single-column stack, full-bleed hero, card stack, swipeable carousel, split-screen, off-canvas nav, bottom sheet, FAB, component patterns - mobile-navigation-patterns.md: Mobile navigation (9.8KB) Bottom tab bar, top nav, hamburger menu, bottom sheet nav, pill nav, comparison matrix, navigation rules, swipe navigation, breadcrumbs, tab content - mobile-form-patterns.md: Mobile form patterns (10.3KB) Input types, keyboards, floating labels, validation patterns, progressive disclosure, autocomplete, masked inputs, toggle/radio, form anti-patterns - mobile-interaction-patterns.md: Touch & gestures (16.7KB) Swipe detection, long press, pull-to-refresh, touch feedback, scroll-reveal, parallax, sticky scroll, CSS scroll animations, touch carousel, haptic feedback, passive listeners - mobile-performance-patterns.md: Performance optimization (12.3KB) Core Web Vitals (LCP/INP/CLS), LCP optimization, INP debugging, CLS prevention, image optimization, lazy loading, service workers, CSS/JS optimization, network optimization - mobile-landing-patterns.md: Landing page patterns (21.3KB) Section sequencing, hero, social proof, feature cards, CTA patterns (inline/sticky/full-bleed), testimonials, pricing, FAQ accordion, footer, mobile checklist
This commit is contained in:
1 parent
76c4c5b4fe
commit
083f6ba783
7 files changed
+4192
No files matched your search
@@ -0,0 +1,436 @@
|
||||
---
|
||||
title: Mobile Navigation Patterns
|
||||
created: 2026-07-03
|
||||
updated: 2026-07-03
|
||||
type: system
|
||||
tags: [mobile, navigation, ux, bottom-nav, hamburger, gesture]
|
||||
sources:
|
||||
- https://www.uxpin.com/studio/blog/mobile-navigation-examples/
|
||||
- https://www.uxpin.com/studio/blog/mobile-navigation-patterns-pros-and-cons/
|
||||
- https://www.seven-squar-tech.com/which-mobile-navigation-patterns-works-what-fails/
|
||||
- https://claritee.io/blog/creative-mobile-ui-patterns-for-enhanced-navigation/
|
||||
confidence: high
|
||||
---
|
||||
|
||||
# Mobile Navigation Patterns — Мобильная навигация
|
||||
|
||||
## 1. Типы навигации для мобильных
|
||||
|
||||
### 1.1 Bottom Tab Bar (Наиболее предпочтительная)
|
||||
|
||||
```css
|
||||
.bottom-nav {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: calc(56px + var(--safe-bottom));
|
||||
padding-bottom: var(--safe-bottom);
|
||||
background: var(--surface-1);
|
||||
border-top: 1px solid var(--border-1);
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
z-index: 100;
|
||||
box-shadow: 0 -2px 10px rgba(0,0,0,0.05);
|
||||
}
|
||||
|
||||
.bottom-nav__item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 8px 16px;
|
||||
color: var(--text-secondary);
|
||||
text-decoration: none;
|
||||
font-size: 12px;
|
||||
transition: color 0.2s;
|
||||
min-width: 48px;
|
||||
min-height: 48px;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.bottom-nav__item.active {
|
||||
color: var(--primary);
|
||||
}
|
||||
|
||||
.bottom-nav__item.active .bottom-nav__icon {
|
||||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
.bottom-nav__icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
```
|
||||
|
||||
**Правила:**
|
||||
- 3-5 элементов максимум
|
||||
- Иконка + подпись
|
||||
- Текущий раздел выделен
|
||||
- Не скрывать при скролле
|
||||
- Лучше чем hamburger (все элементы видны)
|
||||
|
||||
### 1.2 Top Navigation Bar
|
||||
|
||||
```css
|
||||
.top-nav {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 56px;
|
||||
padding: 0 16px;
|
||||
background: var(--surface-1);
|
||||
border-bottom: 1px solid var(--border-1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.top-nav__title {
|
||||
font-size: var(--text-lg);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.top-nav__actions {
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.top-nav__action {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
border: none;
|
||||
color: var(--text-primary);
|
||||
cursor: pointer;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.top-nav__action:active {
|
||||
background: var(--surface-2);
|
||||
}
|
||||
```
|
||||
|
||||
**Правила:**
|
||||
- Sticky при скролле (не fixed)
|
||||
- Логотип слева, действия справа
|
||||
- Заголовок по центру
|
||||
- Минимум 2-3 действия
|
||||
|
||||
### 1.3 Hamburger Menu (Slide-in Drawer)
|
||||
|
||||
```css
|
||||
.hamburger-menu {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 85vw;
|
||||
max-width: 320px;
|
||||
height: 100dvh;
|
||||
background: var(--surface-1);
|
||||
transform: translateX(-100%);
|
||||
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
z-index: 1000;
|
||||
padding: 24px;
|
||||
padding-top: calc(24px + var(--safe-top));
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.hamburger-menu.open {
|
||||
transform: translateX(0);
|
||||
}
|
||||
|
||||
.hamburger-menu__overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0,0,0,0.5);
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: opacity 0.3s ease;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.hamburger-menu.open + .hamburger-menu__overlay {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.hamburger-menu__link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
padding: 16px;
|
||||
color: var(--text-primary);
|
||||
text-decoration: none;
|
||||
font-size: var(--text-base);
|
||||
border-radius: 8px;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.hamburger-menu__link:active {
|
||||
background: var(--surface-2);
|
||||
}
|
||||
|
||||
.hamburger-menu__link .menu-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
```
|
||||
|
||||
**Правила:**
|
||||
- 5-8 пунктов максимум
|
||||
- Иконка + текст
|
||||
- Разделители между секциями
|
||||
- Закрывать по тапу на overlay или свайпу
|
||||
- Всегда видный close button
|
||||
|
||||
### 1.4 Bottom Sheet Navigation
|
||||
|
||||
```css
|
||||
.bottom-sheet-nav {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: var(--surface-1);
|
||||
border-radius: 16px 16px 0 0;
|
||||
transform: translateY(100%);
|
||||
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
z-index: 1000;
|
||||
padding: 16px;
|
||||
padding-bottom: calc(16px + var(--safe-bottom));
|
||||
max-height: 70dvh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.bottom-sheet-nav.open {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
.bottom-sheet-nav__handle {
|
||||
width: 40px;
|
||||
height: 4px;
|
||||
background: var(--border-1);
|
||||
border-radius: 2px;
|
||||
margin: 0 auto 16px;
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
.bottom-sheet-nav__grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.bottom-sheet-nav__item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 16px;
|
||||
border-radius: 12px;
|
||||
text-decoration: none;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.bottom-sheet-nav__item:active {
|
||||
background: var(--surface-2);
|
||||
}
|
||||
|
||||
.bottom-sheet-nav__item .nav-icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
background: var(--surface-2);
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
```
|
||||
|
||||
### 1.5 Pill Navigation (Chip Scroller)
|
||||
|
||||
```css
|
||||
.pill-nav {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
overflow-x: auto;
|
||||
padding: 12px 16px;
|
||||
scrollbar-width: none;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
.pill-nav::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pill-nav__item {
|
||||
padding: 8px 16px;
|
||||
border-radius: 24px;
|
||||
background: var(--surface-2);
|
||||
color: var(--text-secondary);
|
||||
white-space: nowrap;
|
||||
font-size: var(--text-sm);
|
||||
border: 1px solid var(--border-1);
|
||||
text-decoration: none;
|
||||
transition: all 0.2s;
|
||||
min-height: 36px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.pill-nav__item.active {
|
||||
background: var(--primary);
|
||||
color: white;
|
||||
border-color: var(--primary);
|
||||
}
|
||||
|
||||
.pill-nav__item:active {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
```
|
||||
|
||||
**Где использовать:** Категории, фильтры, быстрые действия.
|
||||
|
||||
## 2. Navigation Comparison Matrix
|
||||
|
||||
| Паттерн | Кол-во пунктов | Видимость | Доступность | Скорость |
|
||||
|---------|---------------|-----------|-------------|----------|
|
||||
| Bottom Tab | 3-5 | ★★★★★ | ★★★★★ | ★★★★★ |
|
||||
| Top Nav | 2-3 | ★★★★☆ | ★★★★☆ | ★★★★☆ |
|
||||
| Hamburger | 5-8 | ★☆☆☆☆ | ★★★☆☆ | ★★☆☆☆ |
|
||||
| Bottom Sheet | 6-12 | ★☆☆☆☆ | ★★★☆☆ | ★★★☆☆ |
|
||||
| Pill Nav | 5-15 | ★★★★☆ | ★★★★☆ | ★★★★☆ |
|
||||
|
||||
## 3. Navigation Rules
|
||||
|
||||
### Golden Rules
|
||||
|
||||
1. **3-5 основных разделов** — больше требует hierarchy
|
||||
2. **Bottom Tab > Hamburger** — видимая навигация всегда лучше
|
||||
3. **Иконка + текст** — всегда, никогда только иконки
|
||||
4. **Текущий раздел всегда выделен** — не заставляйте пользователя думать
|
||||
5. **Навигация не исчезает при скролле** — sticky или fixed
|
||||
6. **Один паттерн на сайт** — не смешивайте bottom tab и hamburger
|
||||
|
||||
### When to Use What
|
||||
|
||||
| Ситуация | Паттерн |
|
||||
|----------|---------|
|
||||
| 3-5 основных разделов | Bottom Tab Bar |
|
||||
| Много разделов (>5) | Bottom Tab + More (bottom sheet) |
|
||||
| Product page (1 раздел) | Top Nav |
|
||||
| Landing page (1 страница) | Нет навигации или якоря |
|
||||
| Admin panel | Side drawer (left) |
|
||||
| E-commerce categories | Pill Nav |
|
||||
|
||||
## 4. Navigation Patterns for Content
|
||||
|
||||
### 4.1 Swipe to Navigate
|
||||
|
||||
```css
|
||||
.swipe-container {
|
||||
display: flex;
|
||||
overflow-x: hidden;
|
||||
scroll-snap-type: x mandatory;
|
||||
scroll-behavior: smooth;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
.swipe-container .page {
|
||||
flex: 0 0 100%;
|
||||
scroll-snap-align: start;
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 Breadcrumbs (Mobile)
|
||||
|
||||
```css
|
||||
.breadcrumbs {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 12px 16px;
|
||||
overflow-x: auto;
|
||||
scrollbar-width: none;
|
||||
white-space: nowrap;
|
||||
font-size: var(--text-sm);
|
||||
}
|
||||
|
||||
.breadcrumbs::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.breadcrumbs__item {
|
||||
color: var(--text-secondary);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.breadcrumbs__item.active {
|
||||
color: var(--text-primary);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.breadcrumbs__separator {
|
||||
color: var(--text-secondary);
|
||||
font-size: 12px;
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 Tab Content Navigation
|
||||
|
||||
```css
|
||||
.tab-content {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.tab-content__header {
|
||||
position: sticky;
|
||||
top: 56px;
|
||||
background: var(--surface-1);
|
||||
border-bottom: 1px solid var(--border-1);
|
||||
z-index: 50;
|
||||
}
|
||||
|
||||
.tab-content__body {
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.tab-content__section {
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.tab-content__section-title {
|
||||
font-size: var(--text-xl);
|
||||
font-weight: 700;
|
||||
margin-bottom: 16px;
|
||||
position: sticky;
|
||||
top: 100px;
|
||||
background: var(--surface-1);
|
||||
padding: 8px 0;
|
||||
z-index: 10;
|
||||
}
|
||||
```
|
||||
|
||||
## 5. Navigation Anti-Patterns
|
||||
|
||||
| ❌ Плохо | ✅ Хорошо |
|
||||
|----------|-----------|
|
||||
| Hamburger для 3-4 разделов | Bottom Tab Bar |
|
||||
| Скрытие навигации при скролле | Sticky/Fixed навигация |
|
||||
| Только иконки без текста | Иконка + подпись |
|
||||
| 6+ пунктов в bottom nav | Разделить на разделы |
|
||||
| Навигация на top для основного | Bottom для основных |
|
||||
| Нет выделенного активного состояния | Четкий active state |
|
||||
Reference in new issue
Block a user