aroma.md 06.05.2026

Aroma. Лендинг кофейни

Одностраничный лендинг кофейни: атмосфера, меню с фильтрами и каруселью, форма бронирования с модалкой подтверждения.

Задача

Типовая задача — сайт-визитка. Вся нестандартность собралась в карусели меню: не слайдер из коробки, а самописная штука, которая должна работать при трёх условиях одновременно — переменное число видимых карточек, фильтрация по категориям с пересчётом и прокрутка, управляемая снаружи.

Как делал

Внутри контейнера display: flex с overflow-x: auto, прокрутка нативная через scrollTo({ behavior: 'smooth' }). Никакого transform: translateX() с пересчётом индекса — браузер сам рисует плавный скролл, а JS только выставляет целевую позицию в пикселях.

Главная возня — синхронизация состояния. Листать можно стрелками, свайпом или просто пальцем по overflow-x, и всё это должно вести один и тот же currentIndex. Отсюда флаг isAnimating: пока идёт программный скролл, обработчик нативного scroll игнорируется, иначе он ловит промежуточные значения и перезаписывает индекс в середине анимации.

Фильтрация — это display: none для ненужных карточек и повторный initCarousel() через 50 мс: после смены display браузеру нужно пересчитать layout, иначе clientWidth вернёт старые значения. Точки и максимум индекса считаются от видимых элементов, поэтому один и тот же код обслуживает и «Все», и любую отдельную категорию.

Итог

Карусель не ломается при смене фильтра, ресайзе и свайпах: стрелки дизейблятся на краях, точки синхронизированы с индексом. Вся её логика — около двухсот строк ванильного JS без зависимостей.

// похожие проекты

Ещё работы

// проект 2026
Скриншот главной страницы лендинга DRIVE24

DRIVE24. Лендинг сервиса каршеринга

Лендинг сервиса каршеринга на WordPress + Elementor: тарифы, автопарк, инструкция, приложение, отзывы и форма заявки.

// проект 2026
Скриншот главной страницы лендинга пекарни "круассан"

«Круассан». Лендинг для пекарни

Лендинг пекарни: меню выпечки, отзывы, контакты и форма заказа торта.

// проект 2026
Скриншот страницы сайта chetaika с попапом

Chetaika. Книжный поисковик

Книжный поисковик поверх Google Books API: один HTML-файл, два serverless-прокси и чистый vanilla JS без зависимостей.

// проект 2026
Нет изображения

Бот для сбора лидов из Telegram-каналов и RSS

Бот для Telegram: читает каналы и RSS-ленты, фильтрует заказы по ключевым словам с весами и присылает подходящие в личку.

// проект 2026
Скриншот главной страницы сайта ayupov

Ayupov. Сайт-портфолио

Сайт-портфолио на своей теме WordPress с нуля: живой терминал, скрамбл-заголовок, CSS одним ответом.

// проект 2026
Скриншот страницы сайта YTWrapped

YT-wrapped. Аналитика YouTube-каналов

Аналитика YouTube-каналов: поиск, разбор последних 50 видео, вовлечённость, частота загрузок и рейтинг роликов.

> все проекты

// contact.php

Ну что, работаем?

Опишите задачу — разберусь и предложу решение.