ناحیه اسکرول (Scroll Area)

کامپوننت ناحیه اسکرول برای ایجاد نوار اسکرول سفارشی با ظاهر یکسان در تمام مرورگرها استفاده می‌شود. این کامپوننت رفتار اسکرول بومی مرورگر را حفظ می‌کند.

نصب (Installation)

1npx @quark-lab/rad-ui add scroll-area

نمونه‌ها (Examples)

پیش‌فرض (Default)

نمایش لیست عمودی با نوار اسکرول سفارشی.

برچسب‌ها

نسخه 1
نسخه 2
نسخه 3
نسخه 4
نسخه 5
نسخه 6
نسخه 7
نسخه 8
نسخه 9
نسخه 10
نسخه 11
نسخه 12
نسخه 13
نسخه 14
نسخه 15
نسخه 16
نسخه 17
نسخه 18
نسخه 19
نسخه 20
نسخه 21
نسخه 22
نسخه 23
نسخه 24
نسخه 25
نسخه 26
نسخه 27
نسخه 28
نسخه 29
نسخه 30
نسخه 31
نسخه 32
نسخه 33
نسخه 34
نسخه 35
نسخه 36
نسخه 37
نسخه 38
نسخه 39
نسخه 40
نسخه 41
نسخه 42
نسخه 43
نسخه 44
نسخه 45
نسخه 46
نسخه 47
نسخه 48
نسخه 49
نسخه 50
مشاهده کد
1import { ScrollArea } from "@/components/ui/scroll-area";
2import { Separator } from "@/components/ui/separator";
3
4const tags = Array.from({ length: 50 }).map((_, i) => `نسخه ${i + 1}`);
5
6export default function BasicExample() {
7  return (
8    <ScrollArea className="h-72 w-48 rounded-md border">
9      <div className="p-4">
10        <h4 className="mb-4 text-sm font-medium leading-none">برچسب‌ها</h4>
11        {tags.map((tag) => (
12          <div key={tag}>
13            <div className="text-sm">{tag}</div>
14            <Separator className="my-2" />
15          </div>
16        ))}
17      </div>
18    </ScrollArea>
19  );
20}
21

افقی (Horizontal)

اسکرول افقی با استفاده از ScrollBar با orientation='horizontal'.

جاوااسکریپت
تایپ‌اسکریپت
ری‌اکت
نکست
تیلویند
نود
پایتون
گو
مشاهده کد
1import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area";
2import { Badge } from "@/components/ui/badge";
3
4const badges = [
5  "جاوااسکریپت",
6  "تایپ‌اسکریپت",
7  "ری‌اکت",
8  "نکست",
9  "تیلویند",
10  "نود",
11  "پایتون",
12  "گو",
13];
14
15export default function HorizontalExample() {
16  return (
17    <ScrollArea className="w-72 rounded-md border whitespace-nowrap">
18      <div className="flex w-max gap-3 p-4">
19        {badges.map((badge) => (
20          <Badge key={badge} variant="secondary">
21            {badge}
22          </Badge>
23        ))}
24      </div>
25      <ScrollBar orientation="horizontal" />
26    </ScrollArea>
27  );
28}
29

نوار اسکرول سفارشی (Styled Scrollbar)

سفارشی‌سازی رنگ دستگیره نوار اسکرول.

آیتم شماره 1
آیتم شماره 2
آیتم شماره 3
آیتم شماره 4
آیتم شماره 5
آیتم شماره 6
آیتم شماره 7
آیتم شماره 8
آیتم شماره 9
آیتم شماره 10
آیتم شماره 11
آیتم شماره 12
آیتم شماره 13
آیتم شماره 14
آیتم شماره 15
آیتم شماره 16
آیتم شماره 17
آیتم شماره 18
آیتم شماره 19
آیتم شماره 20
آیتم شماره 21
آیتم شماره 22
آیتم شماره 23
آیتم شماره 24
آیتم شماره 25
آیتم شماره 26
آیتم شماره 27
آیتم شماره 28
آیتم شماره 29
آیتم شماره 30
مشاهده کد
1import { ScrollArea } from "@/components/ui/scroll-area";
2
3export default function StyledExample() {
4  return (
5    <ScrollArea
6      className="h-72 w-48 rounded-md border"
7      scrollbarThumbClassName="bg-primary hover:bg-primary/80"
8    >
9      <div className="p-4">
10        {Array.from({ length: 30 }).map((_, i) => (
11          <div key={i} className="mb-2 text-sm">
12            آیتم شماره {i + 1}
13          </div>
14        ))}
15      </div>
16    </ScrollArea>
17  );
18}
19

اسکرول دوطرفه (Both Scrollbars)

محتوایی که هم به اسکرول عمودی و هم افقی نیاز دارد.

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 1

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 2

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 3

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 4

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 5

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 6

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 7

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 8

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 9

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 10

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 11

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 12

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 13

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 14

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 15

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 16

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 17

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 18

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 19

این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف 20

مشاهده کد
1import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area";
2
3export default function BothScrollbarsExample() {
4  return (
5    <ScrollArea className="h-72 w-72 rounded-md border">
6      <div className="p-4 w-[500px]">
7        {Array.from({ length: 20 }).map((_, i) => (
8          <div key={i} className="mb-4">
9            <p className="whitespace-nowrap">
10              این یک متن طولانی است که نیاز به اسکرول افقی دارد - ردیف {i + 1}
11            </p>
12          </div>
13        ))}
14      </div>
15      <ScrollBar orientation="horizontal" />
16      <ScrollBar orientation="vertical" />
17    </ScrollArea>
18  );
19}
20

بدون نوار اسکرول (Hidden Scrollbar)

مخفی کردن نوار اسکرول با حفظ قابلیت اسکرول.

آیتم شماره 1
آیتم شماره 2
آیتم شماره 3
آیتم شماره 4
آیتم شماره 5
آیتم شماره 6
آیتم شماره 7
آیتم شماره 8
آیتم شماره 9
آیتم شماره 10
آیتم شماره 11
آیتم شماره 12
آیتم شماره 13
آیتم شماره 14
آیتم شماره 15
آیتم شماره 16
آیتم شماره 17
آیتم شماره 18
آیتم شماره 19
آیتم شماره 20
آیتم شماره 21
آیتم شماره 22
آیتم شماره 23
آیتم شماره 24
آیتم شماره 25
آیتم شماره 26
آیتم شماره 27
آیتم شماره 28
آیتم شماره 29
آیتم شماره 30
مشاهده کد
1import { ScrollArea } from "@/components/ui/scroll-area";
2
3export default function HiddenScrollbarExample() {
4  return (
5    <ScrollArea className="h-72 w-48 rounded-md border" hideScrollbar>
6      <div className="p-4">
7        {Array.from({ length: 30 }).map((_, i) => (
8          <div key={i} className="mb-2 text-sm">
9            آیتم شماره {i + 1}
10          </div>
11        ))}
12      </div>
13    </ScrollArea>
14  );
15}
16

مثال‌های پیشرفته (Advanced Examples)

ناحیه اسکرول با پس‌زمینه (Custom Container)

سفارشی‌سازی ظاهر ناحیه اسکرول و آیتم‌های داخلی.

آیتم شماره 1
آیتم شماره 2
آیتم شماره 3
آیتم شماره 4
آیتم شماره 5
آیتم شماره 6
آیتم شماره 7
آیتم شماره 8
آیتم شماره 9
آیتم شماره 10
آیتم شماره 11
آیتم شماره 12
آیتم شماره 13
آیتم شماره 14
آیتم شماره 15
آیتم شماره 16
آیتم شماره 17
آیتم شماره 18
آیتم شماره 19
آیتم شماره 20
آیتم شماره 21
آیتم شماره 22
آیتم شماره 23
آیتم شماره 24
آیتم شماره 25
آیتم شماره 26
آیتم شماره 27
آیتم شماره 28
آیتم شماره 29
آیتم شماره 30
مشاهده کد
1import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area";
2
3export default function CustomContainerExample() {
4  return (
5    <ScrollArea className="h-72 w-48 rounded-md border bg-muted/50">
6      <div className="p-4">
7        {Array.from({ length: 30 }).map((_, i) => (
8          <div
9            key={i}
10            className="mb-2 p-2 rounded bg-card border border-border"
11          >
12            آیتم شماره {i + 1}
13          </div>
14        ))}
15      </div>
16      <ScrollBar className="bg-muted" />
17    </ScrollArea>
18  );
19}
20

مرجع API (API Reference)

ScrollArea

پراپ‌های کامپوننت ScrollArea.

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
type"auto" | "always" | "scroll" | "hover""hover"نحوه نمایش نوار اسکرول
scrollHideDelaynumber600تاخیر مخفی شدن نوار اسکرول (میلی‌ثانیه)
dir"ltr" | "rtl""rtl"جهت متن (پیش‌فرض RTL)
hideScrollbarbooleanfalseمخفی کردن نوار اسکرول با حفظ قابلیت اسکرول
scrollbarThumbClassNamestringundefinedکلاس‌های CSS برای سفارشی‌سازی رنگ دستگیره نوار اسکرول
classNamestringundefinedکلاس‌های CSS اضافی

ScrollBar

پراپ‌های کامپوننت ScrollBar.

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
orientation"vertical" | "horizontal""vertical"جهت نوار اسکرول
forceMountbooleanundefinedنمایش اجباری حتی وقتی محتوا نیاز به اسکرول ندارد
thumbClassNamestringundefinedکلاس‌های CSS برای دستگیره نوار اسکرول
classNamestringundefinedکلاس‌های CSS اضافی برای track نوار اسکرول

بهترین شیوه‌ها (Best Practices)

تعیین ارتفاع ثابت (Fixed Height)

برای فعال شدن اسکرول عمودی، حتماً یک ارتفاع ثابت (مثل h-72 یا h-[300px]) روی ScrollArea تنظیم کنید

اسکرول افقی (Horizontal Scroll)

برای اسکرول افقی، از whitespace-nowrap روی container و ScrollBar با orientation="horizontal" استفاده کنید

پشتیبانی RTL

برای زبان‌های راست به چپ، prop dir="rtl" را روی ScrollArea تنظیم کنید تا نوار اسکرول در سمت صحیح نمایش داده شود