字节笔记本

2026年2月23日

shadcn/ui Music 示例:构建现代化音乐应用界面

本文介绍 shadcn/ui 官方提供的 Music 音乐应用示例,展示如何使用 shadcn/ui 组件库构建一个现代化的音乐播放界面。

示例概述

shadcn/ui 的 Music 示例是一个功能完整的音乐应用界面,展示了多个核心组件的组合使用。该示例包含专辑展示、播放列表、标签切换等功能模块,采用响应式设计,支持桌面端和移动端适配。

核心组件使用

1. 布局组件

  • Tabs 标签页:用于切换 Music、Podcasts、Live 三个主要视图
  • Sidebar 侧边栏:展示播放列表导航
  • ScrollArea 滚动区域:实现专辑列表的水平滚动

2. 基础组件

  • Button 按钮:添加音乐按钮,使用 PlusCircledIcon 图标
  • Separator 分隔线:区分不同内容区块
  • Image 图片:Next.js 图片组件,支持响应式图片显示

3. 数据结构

示例使用两组模拟数据:

  • listenNowAlbums:"立即收听"专辑列表
  • madeForYouAlbums:"为你推荐"专辑列表
  • playlists:播放列表数据

代码结构分析

tsx
export const metadata: Metadata = {
  title: "Music App",
  description: "Example music app using the components.",
}

页面使用 Next.js 13+ 的 Metadata API 定义页面元数据。

响应式处理

tsx
<div className="md:hidden">
  {/* 移动端显示静态图片预览 */}
</div>
<div className="hidden md:block">
  {/* 桌面端显示完整交互界面 */}
</div>

通过 Tailwind CSS 的响应式类实现设备适配。

标签页实现

tsx
<Tabs defaultValue="music" className="h-full space-y-6">
  <TabsList>
    <TabsTrigger value="music">Music</TabsTrigger>
    <TabsTrigger value="podcasts">Podcasts</TabsTrigger>
    <TabsTrigger value="live" disabled>Live</TabsTrigger>
  </TabsList>
  <TabsContent value="music">...</TabsContent>
  <TabsContent value="podcasts">...</TabsContent>
</Tabs>

专辑列表展示

tsx
<ScrollArea>
  <div className="flex space-x-4 pb-4">
    {listenNowAlbums.map((album) => (
      <AlbumArtwork
        key={album.name}
        album={album}
        className="w-[250px]"
        aspectRatio="portrait"
        width={250}
        height={330}
      />
    ))}
  </div>
  <ScrollBar orientation="horizontal" />
</ScrollArea>

样式特点

  • 使用 Tailwind CSS 工具类进行样式定义
  • 支持深色模式(通过 dark:hiddenhidden dark:block 类)
  • 采用 CSS Grid 布局(lg:grid-cols-5
  • 边框和背景色使用 shadcn/ui 的设计令牌

技术栈

  • 框架:Next.js 13+ (App Router)
  • UI 库:shadcn/ui 组件
  • 样式:Tailwind CSS
  • 图标:Radix UI Icons

项目链接

分享: