SnippetUI

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-0overflow-hidden ngă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ặc w-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-600text-blue-700 cù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-allmax-w-0 cũng hiển thị mượt mà trong tất cả các trình duyệt hiện đại.