Scroll Area
จาก shadcnพื้นที่เลื่อนดูเนื้อหาที่มีแถบเลื่อนของตัวเอง ควบคุมสไตล์แถบได้สม่ำเสมอทั้งแนวตั้งและแนวนอน
ติดตั้ง
Terminal
pnpm dlx shadcn@latest add @whereui/scroll-areaต้องผูก registry และติดตั้ง @whereui/theme นำหน้าเสมอเมื่อติดตั้งครั้งแรก
การใช้งาน
import { ScrollArea } from "@/components/ui/scroll-area"<ScrollArea className="h-40 w-full max-w-md rounded-xl border p-3"> {/* รายการยาว ๆ */}</ScrollArea>ตัวอย่างเพิ่มเติม
แถบเลื่อนแนวนอน
ข้อควรรู้
- กำหนดความสูงคงที่ (เช่น h-40) ให้ ScrollArea ไม่งั้นเนื้อหาจะขยายเต็มความยาว
- แถบแนวนอนให้เพิ่ม ScrollBar orientation="horizontal" ไว้ท้ายเนื้อหา
ซอร์สโค้ด
components/ui/scroll-area.tsx
"use client"import * as React from "react"import { ScrollArea as ScrollAreaPrimitive } from "@base-ui/react/scroll-area"import { cn } from "cn"function ScrollArea({ className, children, ...props}: ScrollAreaPrimitive.Root.Props) { return ( <ScrollAreaPrimitive.Root data-slot="scroll-area" className={cn("relative", className)} {...props} > <ScrollAreaPrimitive.Viewport data-slot="scroll-area-viewport" className="size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1" > {children} </ScrollAreaPrimitive.Viewport> <ScrollBar /> <ScrollAreaPrimitive.Corner /> </ScrollAreaPrimitive.Root> )}function ScrollBar({ className, orientation = "vertical", ...props}: ScrollAreaPrimitive.Scrollbar.Props) { return ( <ScrollAreaPrimitive.Scrollbar data-slot="scroll-area-scrollbar" data-orientation={orientation} orientation={orientation} className={cn( "flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent", className )} {...props} > <ScrollAreaPrimitive.Thumb data-slot="scroll-area-thumb" className="relative flex-1 rounded-full bg-border" /> </ScrollAreaPrimitive.Scrollbar> )}export { ScrollArea, ScrollBar }