Динамічні теми на React: усунення FOUC та кастомізація

Динамічні теми на React, усунення FOUC та кастомізація палітри — наш профіль останні 5 років. Ми — команда з 5+ років досвіду в React-розробці, реалізували 30+ проектів з динамічними темами для e-commerce та SaaS. У продакшені зустрічаються типові проблеми: при перемиканні теми виникає FOUC (Flash o

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Динамічні теми на React: усунення FOUC та кастомізація
Середній
~2-3 дні

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1418
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1285
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    983
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1242
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    997

Динамічні теми на React, усунення FOUC та кастомізація палітри — наш профіль останні 5 років. Ми — команда з 5+ років досвіду в React-розробці, реалізували 30+ проектів з динамічними темами для e-commerce та SaaS. У продакшені зустрічаються типові проблеми: при перемиканні теми виникає FOUC (Flash of Unstyled Content), користувацькі налаштування не зберігаються, а кастомні палітри вимагають перезавантаження сторінки. На одному проекті e-commerce ми помітили, що 15% користувачів перемикають тему, і FOUC приводив до втрати конверсії до 3%. Ми вирішуємо ці проблеми архітектурно — через CSS Custom Properties, інлайн-скрипт для усунення FOUC та React Context для керування станом. Такий підхід гарантує миттєве перемикання без мерехтіння, поважає системне налаштування prefers-color-scheme і дозволяє розширювати кількість тем до десятків. Крім того, використання CSS-змінних у 22 рази швидше за підміну класів: на тестовому e-commerce з 250 компонентів підміна класів займала 180 мс, а CSS-змінні — лише 8 мс, без reflow. Вартість базової реалізації (light/dark) — від $800, повна кастомізація з колор-пікером — від $2000. Середній термін окупності — 2 місяці за рахунок зниження bounce rate на 12% і зростання конверсії на 3–5%.

Як усунути FOUC за допомогою CSS-змінних?

Правильний фундамент — CSS Custom Properties. Вся палітра та типографіка описуються через змінні. Компоненти використовують тільки змінні — жодних хардкодних HEX.

/* Базова тема (світла) */ :root { --color-bg-primary: #ffffff; --color-bg-secondary: #f5f5f5; --color-text-primary: #1a1a1a; --color-text-muted: #6b7280; --color-accent: #3b82f6; --color-border: #e5e7eb; --shadow-card: 0 1px 3px rgba(0,0,0,0.1); } /* Темна тема */ [data-theme="dark"] { --color-bg-primary: #0f172a; --color-bg-secondary: #1e293b; --color-text-primary: #f1f5f9; --color-text-muted: #94a3b8; --color-accent: #60a5fa; --color-border: #334155; --shadow-card: 0 1px 3px rgba(0,0,0,0.5); } /* Третя тема (високий контраст) */ [data-theme="high-contrast"] { --color-bg-primary: #000000; --color-text-primary: #ffffff; --color-accent: #ffff00; --color-border: #ffffff; } 

Зміна теми — один setAttribute. Перехід миттєвий, без перезавантаження.

Інлайн-скрипт проти FOUC

Головна проблема — мерехтіння при завантаженні. Рішення — інлайн-скрипт у <head>, який виконується до рендеру будь-якого CSS і встановлює тему.

<script> (function() { var theme = localStorage.getItem('theme'); var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; var resolved = theme || (prefersDark ? 'dark' : 'light'); document.documentElement.setAttribute('data-theme', resolved); })(); </script> 

Цей скрипт синхронний і крихітний — близько 200 байт. Наш досвід показує, що такий підхід повністю виключає FOUC, зберігаючи користувацький вибір.

Керування станом через React Context

React Context спрощує керування темою на всьому додатку. Ми використовуємо TypeScript, щоб гарантувати типобезпеку.

type Theme = 'light' | 'dark' | 'high-contrast' | 'system'; interface ThemeContextValue { theme: Theme; resolvedTheme: 'light' | 'dark' | 'high-contrast'; setTheme: (theme: Theme) => void; } const ThemeContext = createContext<ThemeContextValue | null>(null); export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [theme, setThemeState] = useState<Theme>(() => { if (typeof window === 'undefined') return 'system'; return (localStorage.getItem('theme') as Theme) || 'system'; }); const systemTheme = useMediaQuery('(prefers-color-scheme: dark)') ? 'dark' : 'light'; const resolvedTheme = theme === 'system' ? systemTheme : theme; useEffect(() => { document.documentElement.setAttribute('data-theme', resolvedTheme); }, [resolvedTheme]); const setTheme = (newTheme: Theme) => { setThemeState(newTheme); localStorage.setItem('theme', newTheme); }; return ( <ThemeContext.Provider value={{ theme, resolvedTheme, setTheme }}> {children} </ThemeContext.Provider> ); }; export const useTheme = () => { const ctx = useContext(ThemeContext); if (!ctx) throw new Error('useTheme must be inside ThemeProvider'); return ctx; }; 

Компонент-перемикач підтримує три кнопки: світла, темна, системна.

const ThemeToggle: React.FC = () => { const { theme, setTheme } = useTheme(); const options = [ { value: 'light', icon: <SunIcon />, label: 'Світла' }, { value: 'dark', icon: <MoonIcon />, label: 'Темна' }, { value: 'system', icon: <MonitorIcon />, label: 'Системна' }, ]; return ( <div className="theme-toggle" role="group" aria-label="Вибір теми"> {options.map(opt => ( <button key={opt.value} onClick={() => setTheme(opt.value)} aria-pressed={theme === opt.value} title={opt.label} > {opt.icon} </button> ))} </div> ); }; 

Як зробити переходи плавними?

Без анімації зміна виглядає різко. Додаємо transition на всі змінювані властивості, а при завантаженні вимикаємо.

*, *::before, *::after { transition: background-color 200ms ease, color 150ms ease, border-color 200ms ease, box-shadow 200ms ease; } .no-transition * { transition: none !important; } 

Для просунутих користувачів — colour picker для акцентного кольору. Користувач може вибрати будь-який колір, і він зберігається в localStorage. Реалізація займає кілька рядків коду і не вимагає додаткових бібліотек.

Що входить у роботу

Deliverable Опис
Дизайн-токени Документація всіх змінних і тем у форматі JSON
Вихідний код Компоненти React, CSS, скрипти — повний репозиторій
Інтеграція Tailwind, Next.js, будь-який стек
Навчання Документація та консультація для ваших розробників
Підтримка Гарантія 1 місяць, фікс багів і допомога в доопрацюваннях

Наш досвід гарантує відсутність FOUC і плавну анімацію. Ми сертифіковані для роботи з високонавантаженими проектами. Отримайте консультацію — оцінимо ваш проект протягом дня.

Етапи реалізації

  1. Аналітика — вивчаємо вашу палітру, аудит поточних стилів.
  2. Проектування — створюємо дизайн-токени та схему тем.
  3. Реалізація — верстка на CSS-змінних, інтеграція з React/Next.js.
  4. Тестування — перевірка FOUC, доступність (WCAG), плавність переходів.
  5. Деплой — розміщення на хостингу, налаштування кешування.

Строки

Задача Час
CSS-змінні + 2 теми (light/dark) 0,5 дня
FOUC-fix + React Context 0,5 дня
Перемикач + збереження в localStorage 0,5 дня
Плавні переходи 0,5 дня
Додаткові теми / colour picker 1–2 дні

Базова реалізація light/dark: 1,5–2 дні. Вартість визначається після аналізу. Середній термін окупності — 2 місяці за рахунок зниження bounce rate на 12% і зростання конверсії на 3–5%.

Виміри продуктивності перемикання тем На тестовому e-commerce із 250 компонентів підміна класів займала 180 мс із видимим мерехтінням, а CSS-змінні — 8 мс без reflow. Профілювання зроблено в Chrome DevTools на 4 різних пристроях, включаючи Moto G4 та iPhone 12. Повний звіт із записами performance-трейсів передаємо замовнику разом із вихідниками.

Зв'яжіться з нами — підберемо динамічні теми на React з усуненням FOUC та кастомізацією під ваш проект. Ми розбираємо задачу у зв'язці дизайн-токени та код: визначаємо палітру, описуємо змінні, готуємо перемикач і колор-пікер. Зазвичай перший прототип показуємо через 3–4 робочі дні, після узгодження шліфуємо поведінку на 3–5 реальних пристроях: iPhone SE, Pixel 6, MacBook, бюджетний Android та Windows-ноутбук. Окремий акцент робимо на доступності: контрастність WCAG AA, підтримка prefers-reduced-motion, синхронізація з системною темою в 100% випадків. Замовник отримує git-репозиторій з тегами релізів, Storybook з прев'ю кожної теми та короткий guide по додаванню нових палітр — все це входить у фікс-вартість без доплат.