Для создания мобильного меню в Ant Design (antd)
используется компонент Drawer, который
обеспечивает выдвижную панель, идеально подходящую для навигации на
мобильных устройствах. Drawer позволяет управлять
положением панели, её шириной, видимостью и поведением при закрытии.
import { Drawer, Button, Menu } from 'antd';
import { useState } from 'react';
const MobileMenu = () => {
const [visible, setVisible] = useState(false);
const showDrawer = () => setVisible(true);
const onCl ose = () => setVisible(false);
return (
<>
<Button type="primary" onCl ick={showDrawer}>
Открыть меню
</Button>
<Drawer
title="Меню"
placement="left"
onCl ose={onClose}
visible={visible}
>
<Menu mode="inline">
<Menu.Item key="1">Главная</Menu.Item>
<Menu.Item key="2">О нас</Menu.Item>
<Menu.Item key="3">Контакты</Menu.Item>
</Menu>
</Drawer>
</>
);
};
Ключевые моменты:
placement – задаёт сторону, с которой
выезжает меню (left, right, top,
bottom). Для мобильного меню чаще используют
left или right.visible – управляет видимостью
панели.onClose – коллбэк для закрытия
меню.В мобильных версиях сайта часто используется комбинация
Drawer и обычного
Menu для десктопа. Для реализации
адаптивного поведения удобно использовать
useMediaQuery или библиотеку
react-responsive:
import { useMediaQuery } from 'react-responsive';
const isMobile = useMediaQuery({ maxWidth: 768 });
return (
<>
{isMobile ? <MobileMenu /> : <DesktopMenu />}
</>
);
Рекомендации:
Button и
MenuOutlined из
@ant-design/icons.Ant Design предоставляет возможность изменять стили компонентов через
props, а также через
styled-components или
CSS-in-JS. Для Drawer и
Menu доступны следующие параметры:
width – ширина выдвижного меню
(например, width={250}).closable – возможность отображения
стандартного крестика для закрытия.mask – включение/выключение
затемнённого фона.maskClosable – закрытие меню при клике
на маску.<Drawer
title="Меню"
placement="left"
onCl ose={onClose}
visible={visible}
width={300}
closable={false}
maskClosable={true}
>
<Menu mode="inline">
<Menu.Item key="1">Главная</Menu.Item>
<Menu.Item key="2">Услуги</Menu.Item>
<Menu.Item key="3">Контакты</Menu.Item>
</Menu>
</Drawer>
Для более сложной навигации можно использовать
SubMenu, который поддерживает вложенные
пункты:
import { Menu } from 'antd';
const { SubMenu } = Menu;
<Menu mode="inline">
<Menu.Item key="1">Главная</Menu.Item>
<SubMenu key="sub1" title="Услуги">
<Menu.Item key="2">Дизайн</Menu.Item>
<Menu.Item key="3">Разработка</Menu.Item>
</SubMenu>
<Menu.Item key="4">Контакты</Menu.Item>
</Menu>
Особенности для мобильного меню:
mode="inline" обеспечивает вертикальное
расположение.overflow: auto; для
прокрутки.Ant Design поддерживает стандартные анимации при открытии
Drawer, но для более выразительных эффектов можно
подключить react-transition-group или
CSS-переходы:
.ant-drawer-content-wrapper {
transition: transform 0.3s ease-in-out;
}
Практическая рекомендация: Плавное открытие улучшает пользовательский опыт, особенно при медленном интернет-соединении на мобильных устройствах.
Для SPA часто используется
react-router-dom, где пункты меню должны
вести на разные маршруты:
import { Link } from 'react-router-dom';
<Menu mode="inline">
<Menu.Item key="1">
<Link to="/">Главная</Link>
</Menu.Item>
<Menu.Item key="2">
<Link to="/about">О нас</Link>
</Menu.Item>
</Menu>
Совет: После перехода по ссылке стоит автоматически
закрывать Drawer через onClose, чтобы не
оставлять меню открытым на новом экране.
Для сложных проектов можно использовать React Context или Redux для управления состоянием мобильного меню. Это позволяет:
const MenuContext = React.createContext();
const MenuProvider = ({ children }) => {
const [visible, setVisible] = useState(false);
return (
<MenuContext.Provider value={{ visible, setVisible }}>
{children}
</MenuContext.Provider>
);
};
React.memo для пунктов
меню, чтобы не перегружать мобильное устройство.Мобильное меню в Ant Design сочетает в себе простоту реализации, гибкость кастомизации и встроенную адаптивность, что позволяет создавать навигацию любого уровня сложности, сохраняя удобство для пользователей на мобильных устройствах.