Skip to content

Commit d01aca7

Browse files
committed
add aria contents
1 parent a2537d8 commit d01aca7

File tree

8 files changed

+226
-0
lines changed

8 files changed

+226
-0
lines changed

.vitepress/config/fa.mts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,5 +110,31 @@ function sidebar(): DefaultTheme.SidebarItem[] {
110110
},
111111
],
112112
},
113+
{
114+
text: "روابط کاربری accessible",
115+
base: "/topics/accessible-naming-screen-readers",
116+
items: [
117+
{
118+
text: "ARIA و محاسبه نام accessible",
119+
link: "/ARIA-accessible-name-computation",
120+
},
121+
{
122+
text: "درخت accessibility",
123+
link: "/the-accessibility-tree",
124+
},
125+
{
126+
text: "تست راهکارهای ARIA",
127+
link: "/testing-a-solution",
128+
},
129+
{
130+
text: "تجربه بصری و غیر بصری",
131+
link: "/visual-nonvisual-experience",
132+
},
133+
{
134+
text: "فرمان‌ها و حالت‌های تعامل در screen reader",
135+
link: "/screen-reader-commands-interaction-modes",
136+
},
137+
],
138+
},
113139
];
114140
}
608 KB
Loading

public/geckoflow-ax-tree.png

18.3 KB
Loading
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# ARIA و محاسبه نام accessible
2+
3+
**ARIA یا Accessible Rich Internet Applications**، یک مشخصه استاندارد برای مجموعه‌ای از ویژگی‌هاست که اطلاعات مربوط به accessibility را از طریق HTML منتقل می‌کند.
4+
5+
ARIA شامل مفهومی مهم در نشانه‌گذاری HTML است: [accessible naming](https://www.w3.org/WAI/ARIA/apg/practices/names-and-descriptions/).
6+
7+
کنترل‌های فرم در HTML دارای نام هستند. لینک‌ها و دکمه‌ها نیز نام دارند. عناصر section و table‌ها هم همین‌طور. (اما عناصر DIV نام ندارند.)
8+
9+
## نوشتن نام‌های accessible
10+
11+
راه‌های مختلفی برای اختصاص نام به یک عنصر وجود دارد که بسته به نقش (role) عنصر، متفاوت است: محتوای متنی، عنصر `<label>` برای فرم، ویژگی‌های `aria-label` و `aria-labelledby`، و حتی ویژگی‌های `title` و `placeholder`.
12+
13+
اما فقط یک نام در نهایت اعمال می‌شود. اگر چند ویژگی و محتوای متنی با هم استفاده شوند، کدام‌یک برنده می‌شود؟
14+
15+
## نام‌های accessible چگونه انتخاب می‌شوند؟
16+
17+
سندی به نام [Accessible Name and Description Computation](https://www.w3.org/TR/accname-1.2/) این فرآیند را استاندارد می‌کند تا از هرج‌ومرج در پلتفرم‌های مختلف جلوگیری شود.
18+
19+
```html
20+
<label>
21+
Zip Code
22+
<input aria-label="zip-code" placeholder="00000" title="Zip code" type="number" />
23+
</label>
24+
```
25+
26+
مشخصه Accessible Naming تعیین می‌کند که برای عناصر غیر مخفی که امکان نام‌گذاری دارند، ترتیب به چه صورت باشد: ابتدا `aria-labelledby`، سپس `aria-label`، بعد `title` یا `placeholder` یا تگ `<label>` فرم، و سپس برخی کنترل‌های فرزند، و در نهایت محتوای متنی.
27+
28+
## توضیحات accessible چیستند؟
29+
30+
توضیحاتی که با `aria-describedby` و `title` ارائه می‌شوند، مانند نام‌ها، توسط screen reader خوانده می‌شوند. اما این اتفاق با تأخیر اندکی انجام می‌شود و ممکن است بسته به تنظیمات کاربر اصلاً پخش نشود. بنابراین نمی‌توان همیشه روی شنیده شدن توضیحات حساب کرد.
31+
32+
نام‌ها و توضیحات accessible در [مشخصه اصلی ARIA](https://www.w3.org/TR/wai-aria-1.2/#namecalculation) نیز توضیح داده شده‌اند. این اطلاعات ممکن است فنی باشند، اما هر توسعه‌دهنده‌ای باید با آن‌ها آشنا باشد.
33+
34+
## متن قابل مشاهده را در اولویت قرار دهید
35+
36+
استفاده از `aria-label` بسیار ساده است، ولی نباید به آن بسنده کرد. همیشه باید در صورت امکان متن‌های قابل مشاهده را در اولویت قرار داد تا تجربه‌ی بصری کاربران با آن‌چه توسط Assistive Technology دریافت می‌کنند، مطابقت داشته باشد.
37+
38+
در بسیاری از مواقع، ویژگی `aria-label` بعد از تغییر محتوا به‌روزرسانی نمی‌شود و دیگر بیانگر چیزی که روی صفحه دیده می‌شود نیست. این مسئله موضوع یکی از موفقیت‌های معیارهای WCAG است: [Label in Name](https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html).
39+
40+
## ابزار Accessibility در Chrome DevTools
41+
42+
یکی از ابزارهای مورد علاقه من برای مشاهده نام‌ها و توضیحات قابل دسترس، Accessibility Inspector در Chrome DevTools است. این ابزار در کنار تب Styles در پنجره Elements قرار دارد. در سناریوهایی با چند ویژگی یا محتوای متنی، نشان می‌دهد که “کدام‌یک برنده می‌شود” — که بسیار مفید است.
43+
44+
<figure className="my-6">
45+
<img src="/devtools-accessible-name.png" alt="Chrome DevTools Accessibility Inspector on an icon button on StackBlitz" />
46+
</figure>
47+
48+
یا ممکن است نشان دهد که ورودی فرم شما اصلاً نام accessible ندارد، چون id آن با هیچ labelای تطابق ندارد.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# فرمان‌ها و حالت‌های تعامل در screen reader
2+
3+
در ادامه، نکات و فرمان‌هایی برای استفاده از انواع مختلف screen reader آورده شده است، از جمله VoiceOver برای MacOS و iOS، NVDA و JAWS در Windows و همچنین Android:
4+
5+
## details VoiceOver برای MacOS
6+
- فعال‌سازی و غیرفعال‌سازی:
7+
- کلید Command (⌘) + F5
8+
- در لپ‌تاپ‌ها: Fn + Command (⌘) + F5
9+
- استفاده از کلیدهای فعال‌سازی VoiceOver:
10+
- Control + Option (VO)
11+
- ناوبری در صفحه:
12+
- استفاده از کلیدهای TAB / Shift + TAB برای جابجایی بین عناصر قابل focus
13+
- استفاده از کلیدهای جهت برای پیمایش بین بخش‌های مختلف محتوا (بسته به حالت فعال)
14+
- نگه‌داشتن کلیدهای VO و استفاده از سایر فرمان‌ها. [cheat sheet](https://dequeuniversity.com/screenreaders/voiceover-keyboard-shortcuts)
15+
- اجرای VoiceOver Rotor:
16+
- با VO فعال، کلید VO + U را بزنید. با کلیدهای جهت جابجا شوید.
17+
- بستن بخش‌ها با کلید Escape (الگوی رایج)
18+
- ساکت کردن گفتار:
19+
- نگه‌داشتن کلید Command هنگام صحبت screen reader باعث توقف فوری گفتار می‌شود (مناسب برای دمو)
20+
- تغییر سرعت گفتار screen reader:
21+
- در برنامه VoiceOver Utility، بخش Speech
22+
23+
[VoiceOver cheat sheet برای دسکتاپ](https://dequeuniversity.com/screenreaders/voiceover-keyboard-shortcuts)
24+
25+
## VoiceOver برای iOS
26+
27+
در دستگاه‌های iOS، از بخش _Settings > Accessibility_ می‌توانید VoiceOver یا Switch Control را تنظیم کرده تا با سه بار فشار دادن دکمه پاور فعال شود.
28+
29+
[VoiceOver cheat sheet برای iOS](https://dequeuniversity.com/screenreaders/voiceover-ios-shortcuts)
30+
31+
## NVDA و JAWS برای Windows
32+
33+
[NVDA](https://www.nvaccess.org/download/) و [JAWS](https://www.freedomscientific.com/products/software/jaws/) از پرکاربردترین screen readerها در Windows هستند.
34+
35+
برای نصب NVDA روی Virtual Machine با Parallels (که نیاز به لایسنس Windows نیز دارد):
36+
https://jerryjones.dev/2020/08/06/setting-up-nvda-on-parallels-with-macos/
37+
38+
- [cheat sheet برای NVDA](https://dequeuniversity.com/screenreaders/nvda-keyboard-shortcuts)
39+
- [cheat sheet برای JAWS](https://dequeuniversity.com/assets/pdf/screenreaders/jaws.pdf)
40+
41+
## Accessibility در اندروید
42+
43+
- نکاتی برای تست در اندروید: https://developer.android.com/guide/topics/ui/accessibility/testing
44+
- [TalkBack cheat sheet](https://dequeuniversity.com/screenreaders/talkback-shortcuts)
45+
46+
## حالت‌های تعامل در screen readerهای Windows
47+
48+
در حالی که VoiceOver بیشتر با ترکیب‌های چندکلیدی کار می‌کند، NVDA و JAWS روی Windows رویکرد متفاوتی دارند. با فرمان‌های ساده‌تر، screen readerهای Windows دارای مفهومی به نام [_interaction modes_](https://tink.uk/understanding-screen-reader-interaction-modes/) هستند که مهندسان باید با آن آشنا باشند.
49+
50+
<div className="float-right border-2 w-fit p-6 my-6 ml-6">
51+
<h3 className="font-bold text-lg border-b-2 mb-6">مثالی از فرم</h3>
52+
<label>
53+
<div className="mb-2"><em>First Name</em></div>
54+
<input type="text" placeholder="Rainier McCheddarton" />
55+
</label>
56+
</div>
57+
58+
حالت پیش‌فرض در NVDA، **Browse Mode** است. این حالت به کاربر امکان می‌دهد محتوای صفحه را بخواند و مثلاً با کلید H بین headings جابجا شود.
59+
60+
وقتی فوکوس وارد یک ورودی فرم یا ویجت `contenteditable` می‌شود، حالت به **Forms Mode** یا همان **Focus Mode** تغییر می‌کند. در این حالت، مثلاً زدن حرف `H` باعث نوشتن آن حرف در فیلد می‌شود و دیگر به heading بعدی نمی‌رود. screen reader به‌صورت خودکار بر اساس role عنصر بین این دو حالت جابجا می‌شود.
61+
62+
می‌توانید با فرمان `NVDA + Space` (که `NVDA` معمولاً کلید Insert است) به‌صورت دستی بین حالت‌ها جابجا شوید.
63+
64+
## از نقش `role="application"` با احتیاط بسیار استفاده کنید
65+
66+
⚠️ نقش `application` در ARIA کاربر را مستقیماً وارد حالت Focus می‌کند. در استفاده از این role بسیار محتاط باشید، چون در اصل بسیاری از فرمان‌های screen reader در Windows را غیرفعال کرده و keystrokeها را مستقیماً به مرورگر می‌فرستید.
67+
68+
قبل از استفاده از این ویژگی، حتماً با کاربرانی که دائماً از screen reader استفاده می‌کنند تست انجام دهید. اشتباه در استفاده از آن بسیار آسان است و تجربه را به‌شدت می‌تواند خراب کند.
69+
70+
مطالعه بیشتر از Marco Zehe:
71+
https://www.marcozehe.de/if-you-use-the-wai-aria-role-application-please-do-so-wisely/
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# تست راهکارهای ARIA
2+
3+
اشتباه در استفاده از ARIA بسیار رایج است، چون اکثر توسعه‌دهندگان استفاده از ویژگی‌ها را ساده‌تر از تست کردن آن‌ها می‌دانند. نباید آن‌قدر به تیم QA وابسته بود که انتظار داشته باشیم آن‌ها موارد خاص ARIA را بررسی کنند (حتی اگر تیم QA داشته باشید)، چون چرخه بازخورد در این حالت _بسیار غیرضروری و طولانی_ خواهد شد. به همین دلایل، تست کردن راهکارهای خودتان در مراحل اولیه و به‌صورت مکرر ضروری است.
4+
5+
در ادامه چند نکته برای تست یک راهکار ARIA (پس از اینکه تمام گزینه‌های پیش‌فرض HTML را امتحان کرده‌اید):
6+
7+
1. آمار سایت خود را با نتایج نظرسنجی [WebAIM درباره screen readerها](https://webaim.org/projects/screenreadersurvey9/) مقایسه کنید تا بدانید کاربران از چه ترکیب‌هایی از screen reader و مرورگر استفاده می‌کنند. این کار به اولویت‌بندی شما کمک می‌کند.
8+
9+
همچنین می‌توانید به منابع زیر مراجعه کنید:
10+
11+
3. بررسی [A11ySupport.io](https://a11ysupport.io) برای پشتیبانی از ویژگی‌های خاص.
12+
4. راهنماهای ARIA Authoring Practices ممکن است پیشنهادهایی داشته باشند، اگرچه معمولاً برای استفاده در محیط production آماده نیستند.
13+
5. بررسی issue tracker‌های ریپوی پروژه‌های مهم مانند: [NVDA](https://github.com/nvaccess/nvda)، [WAI-ARIA](https://github.com/w3c/aria)، [WCAG](https://github.com/w3c/wcag)، [WebKit و Safari](https://bugs.webkit.org/)، و دیگر موارد.
14+
- همچنین می‌توانید آرشیو گفت‌وگوهای [لیست ایمیل WebAIM](https://webaim.org/discussion/archives) را بررسی کنید یا در صورت نیاز، پرسش جدیدی مطرح نمایید.
15+
16+
## به یاد داشته باشید: screen reader تنها بخشی از accessibility است
17+
18+
توسعه‌دهندگان معمولاً سعی می‌کنند مسائل را با استفاده از ویژگی‌ها و نشانه‌گذاری‌ها حل کنند — که تأثیر آن عمدتاً متوجه کاربران screen reader است. اما فراموش نکنید که screen reader تنها یکی از بخش‌های accessibility است. باید به پشتیبانی از کیبورد، کنتراست بصری، reflow و zoom، و حتی ناوبری صوتی (که وابسته به HTML معنایی است) نیز توجه داشته باشید.
19+
20+
لینک‌های پرش (skip links) نمونه خوبی هستند:
21+
22+
> «چرا لینک‌های پرش باید قابل مشاهده باشند وقتی فقط برای کاربران screen reader هستند؟»
23+
24+
در واقع، skip links برای همه کاربران کیبورد هستند. بسیاری از افراد باید آن‌ها را ببینند، و همچنین باید در screen reader هم قابل استفاده باشند.
25+
26+
بخش‌های مختلفی از accessibility وجود دارد که باید هم‌زمان با سایر دغدغه‌های توسعه وب به آن‌ها رسیدگی کرد. بنابراین هنگام اولویت‌بندی وظایف با اندازه‌ها و پیچیدگی‌های متفاوت، گروه‌های متنوع کاربران و تأثیر مسائل بر accessibility را مد نظر داشته باشید.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# درخت Accessibility
2+
3+
Accessibility Tree ساختاری موازی با DOM است که توسط [APIهای دسترسی پلتفرم‌ها](https://www.smashingmagazine.com/2015/03/web-accessibility-with-accessibility-api/) و مرورگرهای وب ایجاد می‌شود تا اطلاعات مربوط به accessibility را به Assistive Technology (AT) منتقل کند. این ساختار تحت تأثیر HTML، ARIA و گاهی CSS قرار می‌گیرد. زمانی که تغییری در درخت ایجاد شود، مرورگر رویدادهایی را به AT ارسال می‌کند که بخش‌هایی از درخت به‌روزرسانی شده‌اند.
4+
5+
این درخت، ساختاری را در اختیار AT قرار می‌دهد که عناصر غیرضروری مانند `style` و `script` و دیگر موارد حذف شده‌اند. APIهای دسترسی در macOS، iOS، Windows و سایر پلتفرم‌ها، نسخه‌های خاص خود از این درخت را ایجاد می‌کنند، به این معنا که نقش‌ها (roles) و سایر مشخصات ممکن است کمی متفاوت باشند.
6+
7+
<figure className="my-6">
8+
<img src="/geckoflow-ax-tree.png" alt="The Accessibility Tree flow in Firefox (Gecko)" />
9+
</figure>
10+
11+
Accessibility Tree بیشتر در ابزارهایی مانند screen reader کاربرد دارد. (البته screen readerهای امروزی به‌طور هم‌زمان از DOM نیز استفاده می‌کنند. مثلاً JAWS برای بهبود تجربه در صفحات فاقد دسترسی مناسب از DOM کمک می‌گیرد.)
12+
13+
## چگونه Accessibility Tree را مشاهده و تست کنیم؟
14+
15+
در حال حاضر ابزارهای بسیار خوبی برای بررسی Accessibility Tree در اختیار داریم! همان ابزار Accessibility در Chrome DevTools که برای بررسی نام‌های قابل دسترس استفاده کردیم، در اینجا نیز کاربرد دارد. همچنین می‌توانید از Safari Developer Tools و Firefox Developer Tools استفاده کنید. یا یک screen reader اجرا کنید!
16+
17+
DevTools مرورگرهای مدرن بسیار مناسب هستند برای اینکه نشان دهند چگونه Accessibility Tree با DOM در ارتباط است. این ابزارها اطلاعاتی مانند نام قابل دسترس، نقش، وضعیت مخفی بودن یا نبودن یک عنصر، یا اینکه آیا اطلاعاتی برای AT فراهم می‌کند یا نه، نمایش می‌دهند.
18+
19+
<figure className="my-6">
20+
<img src="/devtools-accessible-name.png" alt="Chrome DevTools Accessibility Inspector on an icon button on StackBlitz" />
21+
</figure>
22+
23+
## چرا این موضوع اهمیت دارد؟
24+
25+
با یادگیری نحوه عملکرد Accessibility Tree و ارتباط آن با DOM، درک بهتری از ARIA و رابطه‌اش با HTML خواهید داشت.
26+
27+
یکی از سوء‌تفاهم‌های رایج در مورد ARIA، تفاوت میان ویژگی `disabled` در HTML و ویژگی `aria-disabled` برای ورودی‌های فرم و کنترل‌های دیگر است. تنها `disabled` روی focusپذیری و ظاهر عنصر در رابط بصری تأثیر می‌گذارد، در حالی که `aria-disabled` هیچ‌گونه تغییری در ظاهر یا تعامل قابل مشاهده ایجاد نمی‌کند. ویژگی ARIA فقط از طریق Accessibility Tree بر AT اثر می‌گذارد و هیچ تغییری در DOM ایجاد نمی‌کند.
28+
29+
آگاهی از این تفاوت‌ها باعث می‌شود در استفاده از ویژگی‌ها در نشانه‌گذاری HTML خود دقت بیشتری داشته باشید و فرآیند تست نیز برایتان قابل پیش‌بینی‌تر و مؤثرتر خواهد بود.
30+
31+
## لینک‌های مرتبط
32+
- https://marcysutton.com/accessibility-and-performance#What-impacts-the-accessibility-tree
33+
- https://www.smashingmagazine.com/2015/03/web-accessibility-with-accessibility-api/
34+
- https://marcysutton.com/accessibility-and-performance#What-impacts-the-accessibility-tree

0 commit comments

Comments
 (0)