# 🎨 ПРАВИЛА CSS LAYOUT И СКРОЛЛА > **Цель:** Предотвратить проблемы с overflow, scroll и позиционированием в Next.js 15 + React 19 приложении ## 📋 **ОСНОВНЫЕ ПРИНЦИПЫ LAYOUT** ### 1. **БАЗОВАЯ АРХИТЕКТУРА LAYOUT** ```typescript // ✅ ПРАВИЛЬНАЯ структура для всех страниц приложения
{/* Контейнер полной высоты */} {/* Фиксированная боковая панель */}
{/* ЕДИНСТВЕННАЯ зона скролла */} {/* Весь контент здесь */}
``` ### 2. **КРИТИЧЕСКИЕ ПРАВИЛА OVERFLOW** #### **✅ ПРАВИЛЬНО: Один уровень overflow** ```css /* Родительский контейнер */ .container { height: 100vh; overflow: hidden; /* Запрещаем скролл на уровне экрана */ } /* Дочерний скроллируемый контейнер */ .scrollable-content { flex: 1; overflow-y: auto; /* ЕДИНСТВЕННАЯ зона скролла */ } ``` #### **❌ НЕПРАВИЛЬНО: Множественные overflow зоны** ```css /* Создаёт конфликты скролла */ .parent { overflow-y: auto; /* Первый скролл */ } .child { overflow-y: auto; /* Второй скролл - ПРОБЛЕМА! */ } ``` --- ## 🚨 **ТИПИЧНЫЕ ПРОБЛЕМЫ И РЕШЕНИЯ** ### **ПРОБЛЕМА 1: Контент смещается вправо** **❌ Причина:** ```jsx
{' '} {/* Принудительная высота */}
{' '} {/* Скрывает контент */} {/* Контент не помещается и смещается */}
``` **✅ Решение:** ```jsx
{' '} {/* Простая вертикальная компоновка */} {/* Контент автоматически размещается правильно */}
``` ### **ПРОБЛЕМА 2: Скролл не работает** **❌ Причина:** ```jsx
{' '} {/* Блокирует скролл */}
{' '} {/* Дублирует блокировку */}
{' '} {/* Создаёт контент больше экрана */} {/* Контент не скроллится */}
``` **✅ Решение:** ```jsx
{' '} {/* ЕДИНСТВЕННАЯ зона скролла */} {/* Контент свободно скроллится */}
``` ### **ПРОБЛЕМА 3: Двойной sidebar в layout** **❌ Причина:** ```jsx // В page.tsx
{/* Первый sidebar */}
{/* Второй sidebar - ДУБЛИРОВАНИЕ! */}
``` **✅ Решение:** ```jsx // В page.tsx - УБРАТЬ дублирование
{/* ЕДИНСТВЕННЫЙ sidebar */}
{/* Весь контент */}
``` --- ## 🏗️ **АРХИТЕКТУРНЫЕ ПАТТЕРНЫ** ### **ПАТТЕРН 1: Dashboard с статистикой** ```jsx export function DashboardPage() { return (
{/* Заголовок */}
{/* Статистические карточки */} {/* Основное содержимое */}
) } ``` ### **ПАТТЕРН 2: Таблица с фильтрами** ```jsx export function TablePage() { return (
{/* Фильтры (фиксированные) */} {/* Таблица (скроллируемая) */}
) } ``` ### **ПАТТЕРН 3: Модальные окна** ```jsx // ✅ Модалки не должны влиять на основной скролл
{' '} {/* Скролл только внутри модалки */}
``` --- ## 📱 **RESPONSIVE DESIGN ПРАВИЛА** ### **АДАПТИВНЫЕ КОНТЕЙНЕРЫ** ```jsx
{/* Карточки адаптивно размещаются */}
``` ### **АДАПТИВНЫЕ ОТСТУПЫ** ```jsx
``` --- ## 🎯 **СПЕЦИФИЧЕСКИЕ ПРАВИЛА ДЛЯ SFERA** ### **ПРАВИЛА ДЛЯ ФУЛФИЛМЕНТ КОМПОНЕНТОВ** #### **1. Главная страница склада** ```jsx // src/app/fulfillment-warehouse/page.tsx
{/* Статистика - НЕ скроллится */} {/* Контент - скроллится */}
``` #### **2. Таблицы поставок** ```jsx // src/components/fulfillment-warehouse/fulfillment-supplies-page.tsx
{' '} {/* ← КЛЮЧЕВОЙ ЭЛЕМЕНТ */} {/* Фильтры */} {/* Статистика */} {/* Основная таблица - скроллируется естественно */}
``` #### **3. Раскрывающиеся детали (Master-Detail)** ```jsx // Детали поставок в раскрывающихся строках
{' '} {/* Локальный скролл */}
``` --- ## ⚡ **ПРОИЗВОДИТЕЛЬНОСТЬ И ОПТИМИЗАЦИЯ** ### **ВИРТУАЛИЗАЦИЯ ДЛЯ БОЛЬШИХ СПИСКОВ** ```jsx // Для таблиц с >100 строк import { FixedSizeList as List } from 'react-window' ;
{' '} {/* Контейнер фиксированной высоты */} {({ index, style }) => (
)}
``` ### **LAZY LOADING ДЛЯ КОНТЕНТА** ```jsx const LazyTableSection = lazy(() => import('./TableSection')) // В компоненте
{/* Загружается сразу */} Загрузка...
}> {/* Загружается по требованию */} ``` --- ## 🚨 **АНТИ-ПАТТЕРНЫ И ЗАПРЕТЫ** ### **❌ НИКОГДА НЕ ДЕЛАЙТЕ:** #### **1. Принудительные размеры** ```jsx // ❌ Создаёт проблемы с layout
``` #### **2. Множественные overflow зоны** ```jsx // ❌ Конфликты скролла
``` #### **3. Смешивание fixed и sticky позиционирования** ```jsx // ❌ Непредсказуемое поведение
``` #### **4. Игнорирование responsive дизайна** ```jsx // ❌ Не адаптируется к мобильным устройствам
{/* Сломается на мобильных */} ``` --- ## 🔧 **ИНСТРУМЕНТЫ ОТЛАДКИ** ### **CSS DEBUG КЛАССЫ** ```css /* Добавьте для визуализации проблем */ .debug-borders * { border: 1px solid red !important; } .debug-overflow { overflow: visible !important; background: rgba(255, 0, 0, 0.1) !important; } .debug-scroll { scrollbar-color: red transparent !important; scrollbar-width: thick !important; } ``` ### **REACT DevTools** ```jsx // Добавьте data-атрибуты для отладки
``` ### **КОНСОЛЬНЫЕ ЛОГИ ДЛЯ РАЗМЕРОВ** ```jsx useEffect(() => { const element = ref.current if (element) { console.log('LAYOUT DEBUG:', { scrollHeight: element.scrollHeight, clientHeight: element.clientHeight, offsetHeight: element.offsetHeight, hasOverflow: element.scrollHeight > element.clientHeight, }) } }, []) ``` --- ## 📊 **ЧЕКЛИСТ ПРОВЕРКИ LAYOUT** ### **Перед релизом:** - [ ] Единственная зона скролла на странице - [ ] Нет принудительных высот (`minHeight: '200vh'`) - [ ] Правильная структура с `h-screen` и `overflow-hidden` - [ ] Responsive дизайн для мобильных устройств - [ ] Sidebar не дублируется в компонентах - [ ] Модальные окна не влияют на основной скролл ### **При проблемах со скроллом:** - [ ] Проверить количество `overflow-y-auto` в иерархии - [ ] Убедиться в отсутствии `overflow-hidden` на скроллируемом контейнере - [ ] Проверить наличие `flex-1` у родительского контейнера - [ ] Убрать принудительные размеры (`min-height`, `height: 200vh`) --- ## 🎨 **КАСТОМНЫЕ СКРОЛЛБАРЫ** ### **TAILWIND CLASSES** ```jsx
``` ### **CUSTOM CSS** ```css /* Кастомные скроллбары для SFERA */ .custom-scrollbar::-webkit-scrollbar { width: 8px; } .custom-scrollbar::-webkit-scrollbar-track { background: transparent; } .custom-scrollbar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.2); border-radius: 4px; } .custom-scrollbar::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.3); } ``` **Следование этим правилам обеспечит корректную работу layout и скролла во всех компонентах!** 🚀