Sidebar Menu Thu Gọn
Đây là điều hướng thanh bên có thể được sử dụng trên trang tổng quan, v.v. và có thể thu gọn về trạng thái chỉ có biểu tượng.
ReactTailwind CSSlucide-react
Điều hướng thanh bên cho phép bạn chuyển đổi giữa màn hình kích thước đầy đủ với văn bản và màn hình nhỏ gọn chỉ có các biểu tượng, thường thấy trên màn hình quản lý và trang tổng quan. Lý tưởng nếu bạn muốn tối đa hóa diện tích hiển thị của khu vực nội dung.
Xem trước
Dashboard Overview
Welcome back, Jane. Here is what’s happening today.
Total Revenue
$45,231
Active Users
2,410
New Orders
142
Recent Activity
Trường hợp sử dụng & Tính năng
- Màn hình bảng điều khiển & quản trị: Được thiết kế để cho phép người dùng tập trung vào nội dung chính (biểu đồ, bảng dữ liệu, v.v.) bằng cách thu gọn điều hướng nếu cần.
- Hoàn thiện với chú giải công cụ: Ngay cả khi nó ở trạng thái nhỏ gọn chỉ có các biểu tượng, khả năng truy cập và tính dễ sử dụng vẫn được đảm bảo bằng cách hiển thị chú giải công cụ khi di chuột.
- Hoạt ảnh mượt mà: Bằng cách kết hợp chiều rộng, độ trong suốt (
opacity) vàmax-width, chúng tôi đạt được chuyển động tự nhiên trong đó văn bản biến mất và xuất hiện mượt mà.
Những điểm chính của thiết kế và UX (Design & UX)
- Ngăn chặn tràn văn bản: Kết hợp
max-w-0vàoverflow-hiddenngăn văn bản ngắt thành dòng mới và phá vỡ bố cục khi gấp lại. - Làm nổi bật trực quan trạng thái hoạt động: Mục menu hiện được chọn có nền màu xanh lam và màu văn bản để truyền tải vị trí hiện tại một cách trực quan.
- Hướng dẫn mắt: Nút bật tắt để mở và đóng được đặt ở viền của thanh bên để tăng khả năng “nhấn vào đây để di chuyển.”
Cách tùy chỉnh (Hướng dẫn tùy chỉnh)
- Thay đổi độ rộng của thanh bên: Bạn có thể điều chỉnh nó theo kích thước mong muốn bằng cách thay đổi
w-64(khi được mở rộng) hoặcw-20(khi thu gọn) ở phía mã triển khai. - Thay đổi màu chủ đề: Bằng cách thay thế tất cả các lớp tiện ích
bg-blue-600vàtext-blue-700cùng một lúc, bạn có thể áp dụng chúng cho các thiết kế phù hợp với màu sắc thương hiệu của mình.
Mã triển khai (Implementation)
<div className="flex h-screen bg-slate-50 font-sans overflow-hidden">
{/* Sidebar */}
<aside
className={`bg-white border-r border-slate-200 flex flex-col transition-all duration-300 ease-in-out relative z-10 ${
isCollapsed ? 'w-20' : 'w-64'
}`}
>
{/* Header */}
<div className="h-16 flex items-center px-4 border-b border-slate-100 shrink-0">
<div className="flex items-center gap-3 overflow-hidden whitespace-nowrap">
<div className="w-10 h-10 rounded-xl bg-blue-600 flex items-center justify-center shrink-0 shadow-sm shadow-blue-200">
<Hexagon className="w-6 h-6 text-white" />
</div>
<span
className={`font-bold text-slate-800 text-xl transition-all duration-300 overflow-hidden ${
isCollapsed ? 'max-w-0 opacity-0' : 'max-w-[200px] opacity-100'
}`}
>
DashUI
</span>
</div>
</div>
{/* Navigation */}
<nav className="flex-1 py-6 px-3 space-y-2 overflow-y-auto overflow-x-hidden">
{navItems.map((item, index) => (
<a
key={index}
href="#"
className={`flex items-center gap-3 px-3 py-3 rounded-xl transition-colors group relative ${
item.active
? 'text-blue-700 bg-blue-50 hover:bg-blue-100'
: 'text-slate-500 hover:bg-slate-100 hover:text-slate-900'
}`}
>
<item.icon className="w-6 h-6 shrink-0" />
<span
className={`font-semibold whitespace-nowrap transition-all duration-300 flex-1 text-sm overflow-hidden ${
isCollapsed ? 'max-w-0 opacity-0' : 'max-w-[200px] opacity-100'
}`}
>
{item.label}
</span>
{/* Badge display (only when expanded) */}
{!isCollapsed && item.badge && (
<span className="bg-blue-100 text-blue-700 py-0.5 px-2 rounded-full text-xs font-bold whitespace-nowrap">
{item.badge}
</span>
)}
{/* Tooltip (displayed on hover only when collapsed) */}
{isCollapsed && (
<div className="absolute left-14 hidden group-hover:block bg-slate-800 text-white text-xs px-2.5 py-1.5 rounded-md shadow-lg z-20 whitespace-nowrap pointer-events-none opacity-0 transition-opacity duration-200 group-hover:opacity-100">
{item.label}
</div>
)}
</a>
))}
</nav>
{/* Footer Profile */}
<div className="p-4 border-t border-slate-100 shrink-0">
<a href="#" className="flex items-center gap-3 hover:bg-slate-50 p-2 -m-2 rounded-xl transition-colors">
<img
src="https://i.pravatar.cc/150?u=a042581f4e29026704d"
alt="User Avatar"
className="w-10 h-10 rounded-full shrink-0 border border-slate-200 object-cover"
/>
<div
className={`flex-1 min-w-0 transition-all duration-300 overflow-hidden ${
isCollapsed ? 'max-w-0 opacity-0' : 'max-w-[200px] opacity-100'
}`}
>
<p className="text-sm font-semibold text-slate-900 truncate">Jane Doe</p>
<p className="text-xs text-slate-500 truncate">Admin</p>
</div>
</a>
</div>
</aside>
{/* Toggle Button */}
<button
onClick={() => setIsCollapsed(!isCollapsed)}
className={`absolute top-6 z-20 cursor-pointer bg-white border border-slate-200 text-slate-500 hover:text-blue-600 hover:bg-blue-50 rounded-full p-1.5 shadow-sm transition-all duration-300 ${
isCollapsed ? 'left-[4.2rem]' : 'left-[15rem]'
}`}
aria-label={isCollapsed ? "Expand sidebar" : "Collapse sidebar"}
>
<ChevronLeft className={`w-4 h-4 transition-transform duration-300 ${isCollapsed ? 'rotate-180' : ''}`} />
</button>
{/* Khu vực nội dung chính (Ví dụ) */}
<main className="flex-1 p-8 tràn-y-auto">
<h1 className="text-2xl font-bold text-slate-900">Trang tổng quan</h1>
<p className="text-slate-500 mt-1">Chọn một mục từ thanh bên.</p>
</chính>
</div>
);
} Hỗ trợ trình duyệt
- Hoạt động tốt với các phiên bản mới nhất của trình duyệt hiện đại (Chrome, Firefox, Safari, Edge).
- Hoạt ảnh
transition-allvàmax-w-0cũng hiển thị mượt mà trong tất cả các trình duyệt hiện đại.