You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用NextJS和TailwindCSS实现类Twitter响应式头部?

用NextJS + TailwindCSS实现类Twitter的响应式布局

核心思路

利用TailwindCSS的响应式断点(默认lg对应1024px)区分大屏/移动端布局:

  • 大屏(≥1024px):左侧固定侧边栏,包含完整导航+用户面板,主内容区靠右
  • 移动端(<1024px):顶部显示简化用户栏,底部显示精简导航栏,主内容区占满屏幕

实现步骤

1. 搭建全局布局(app/layout.tsx)

全局布局负责控制不同屏幕下组件的显示/隐藏,以及整体排版:

import Navbar from '@/components/Navbar';
import UserPanel from '@/components/UserPanel';
import MobileNavbar from '@/components/MobileNavbar';
import MobileUserBar from '@/components/MobileUserBar';

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="zh-CN">
      <body className="min-h-screen bg-gray-50">
        {/* 大屏侧边栏:仅lg及以上显示 */}
        <div className="hidden lg:flex flex-col w-64 h-screen fixed left-0 top-0 bg-white border-r p-4">
          <Navbar />
          {/* 用户面板固定在侧边栏底部 */}
          <div className="mt-auto">
            <UserPanel />
          </div>
        </div>

        {/* 移动端顶部用户栏:仅lg以下显示 */}
        <div className="lg:hidden flex items-center justify-between p-4 bg-white border-b">
          <MobileUserBar />
        </div>

        {/* 主内容区:大屏时预留侧边栏宽度 */}
        <main className="lg:ml-64 p-4 lg:p-8">
          {children}
        </main>

        {/* 移动端底部导航栏:仅lg以下显示 */}
        <div className="lg:hidden fixed bottom-0 left-0 right-0 bg-white border-t p-2">
          <MobileNavbar />
        </div>
      </body>
    </html>
  );
}

2. 实现大屏导航组件(components/Navbar.tsx)

包含完整的导航链接,支持大屏显示文字、中屏仅显示图标:

import Link from 'next/link';
// 推荐用lucide-react图标替代文字图标,需先安装:npm install lucide-react
import { Home, Search, Bell, MessageCircle, Bookmark, User } from 'lucide-react';

export default function Navbar() {
  return (
    <div className="space-y-6">
      {/* Logo区域 */}
      <Link href="/" className="flex items-center gap-3 text-xl font-bold">
        <User className="h-8 w-8 text-blue-500" />
        <span className="hidden xl:inline">Twitter Clone</span>
      </Link>

      {/* 导航链接 */}
      <nav className="space-y-4">
        <Link href="/" className="flex items-center gap-3 p-2 rounded-full hover:bg-gray-100 transition-colors">
          <Home className="h-6 w-6" />
          <span className="hidden xl:inline">首页</span>
        </Link>
        <Link href="/explore" className="flex items-center gap-3 p-2 rounded-full hover:bg-gray-100 transition-colors">
          <Search className="h-6 w-6" />
          <span className="hidden xl:inline">探索</span>
        </Link>
        <Link href="/notifications" className="flex items-center gap-3 p-2 rounded-full hover:bg-gray-100 transition-colors">
          <Bell className="h-6 w-6" />
          <span className="hidden xl:inline">通知</span>
        </Link>
        <Link href="/messages" className="flex items-center gap-3 p-2 rounded-full hover:bg-gray-100 transition-colors">
          <MessageCircle className="h-6 w-6" />
          <span className="hidden xl:inline">消息</span>
        </Link>
        <Link href="/bookmarks" className="flex items-center gap-3 p-2 rounded-full hover:bg-gray-100 transition-colors">
          <Bookmark className="h-6 w-6" />
          <span className="hidden xl:inline">书签</span>
        </Link>
        <Link href="/profile" className="flex items-center gap-3 p-2 rounded-full hover:bg-gray-100 transition-colors">
          <User className="h-6 w-6" />
          <span className="hidden xl:inline">个人主页</span>
        </Link>
      </nav>

      {/* 发布按钮 */}
      <button className="w-full bg-blue-500 text-white rounded-full py-2 font-bold hover:bg-blue-600 transition-colors">
        发布推文
      </button>
    </div>
  );
}

3. 实现大屏用户面板(components/UserPanel.tsx)

固定在侧边栏底部,显示用户信息:

import Link from 'next/link';
import { ChevronDown } from 'lucide-react';
import Image from 'next/image';

export default function UserPanel() {
  return (
    <Link href="/profile" className="flex items-center gap-3 p-2 rounded-full hover:bg-gray-100 transition-colors w-full">
      <Image
        src="/avatar.jpg"
        alt="用户头像"
        width={40}
        height={40}
        className="rounded-full"
      />
      <div className="hidden xl:block flex-1">
        <p className="font-semibold truncate">你的用户名</p>
        <p className="text-gray-500 text-sm truncate">@yourusername</p>
      </div>
      <ChevronDown className="h-5 w-5 text-gray-500" />
    </Link>
  );
}

4. 实现移动端顶部用户栏(components/MobileUserBar.tsx)

简化版用户栏,仅保留核心功能:

import Link from 'next/link';
import { Search, MessageCircle, User } from 'lucide-react';

export default function MobileUserBar() {
  return (
    <div className="flex items-center justify-between w-full">
      <Link href="/" className="text-2xl">
        <User className="h-8 w-8 text-blue-500" />
      </Link>
      <div className="flex items-center gap-4">
        <Search className="h-6 w-6" />
        <MessageCircle className="h-6 w-6" />
      </div>
    </div>
  );
}

5. 实现移动端底部导航栏(components/MobileNavbar.tsx)

精简导航,仅保留高频入口,支持路由高亮:

import Link from 'next/link';
import { Home, Search, Bell, User } from 'lucide-react';
import { usePathname } from 'next/navigation';

export default function MobileNavbar() {
  const pathname = usePathname();

  const getActiveClass = (path: string) => {
    return pathname === path ? 'text-blue-500' : 'text-gray-600';
  };

  return (
    <div className="flex justify-around">
      <Link href="/" className={`p-2 ${getActiveClass('/')}`}>
        <Home className="h-6 w-6" />
      </Link>
      <Link href="/explore" className={`p-2 ${getActiveClass('/explore')}`}>
        <Search className="h-6 w-6" />
      </Link>
      <Link href="/notifications" className={`p-2 ${getActiveClass('/notifications')}`}>
        <Bell className="h-6 w-6" />
      </Link>
      <Link href="/profile" className={`p-2 ${getActiveClass('/profile')}`}>
        <User className="h-6 w-6" />
      </Link>
    </div>
  );
}

关键细节说明

  1. 响应式断点控制:通过hidden lg:flex、lg:hidden等类,精准控制组件在不同屏幕尺寸下的显示状态
  2. 固定定位:大屏侧边栏和移动端底部导航栏使用fixed定位,确保滚动时始终可见
  3. 交互优化:添加hover:bg-gray-100、transition-colors类实现平滑的hover效果
  4. 路由高亮:利用NextJS的usePathname钩子,为当前路由的导航链接添加高亮样式

内容的提问来源于stack exchange,提问作者user17680380

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:33:17