مقالات

اعلان‌های قابل دسترسی با ARIA Live Regions (قسمت 2)


در بخش اول این فصل، ما در مورد آنچه که ممکن است به مناطق زنده نیاز داشته باشیم و نحوه ایجاد آنها با استفاده از HTML و ARIA بحث کردیم.

در این قسمت به این می پردازیم که مناطق زنده چیست نه مناسب برای و چرا، و ما در مورد راه های قوی تر برای پیاده سازی برخی از الگوهای رابط کاربری رایج که در غیر این صورت ممکن است استفاده از مناطق زنده را در نظر بگیرید، بحث خواهیم کرد. در مرحله بعد، ما به برخی از بهترین روش‌ها برای اجرای مناطق زنده در زمانی که نیاز به استفاده از آنها برای نمایش مواردی مانند پیام‌های وضعیت در برنامه‌های کاربردی وب خود دارید، نگاه می‌کنیم.

مناطق زنده به راحتی قابل سوء استفاده و برای استفاده بیش از حد. جدا از پشتیبانی ناسازگار مرورگر و صفحه‌خوان، قابلیت‌های ذاتی مناطق زنده محدود است. با طراحی، آنها را برای انواع خاصی از به روز رسانی محتوا نامناسب می کند.

مناطق زنده از متن غنی استفاده نمی کنند

مناطق زنده از متن غنی استفاده نمی کنند. این بدان معنی است که معنای عناصری مانند عنوان، لیست، پیوند، دکمه و سایر عناصر ساختاری یا تعاملی هنگامی که محتوای یک منطقه زنده اعلام می شود، منتقل نمی شود. به عنوان مثال، اگر یک منطقه زنده حاوی دکمه باشد، صفحه خوان متن دکمه را هنگامی که به منطقه زنده تزریق می شود، بدون اشاره به نقش دکمه اعلام می کند:

div aria-live="polite">

button>You'll have to guess what I represent!button>
div>

این واقعیت که متن نشان دهنده برچسب یک دکمه است توسط صفحه خوان در پیام منطقه زنده گزارش نمی شود. (نمونه وام گرفته شده از مقاله اسکات اوهارا)

هنگامی که دکمه را با استفاده از جاوا اسکریپت به یک منطقه زنده اضافه می کنید، VoiceOver با سافاری چگونه دکمه ای را اعلام می کند:


یک صفحه خوان کل محتوای یک منطقه زنده را به عنوان یک رشته متن طولانی، بدون هیچ ساختاری اعلام می کند.

به همین دلیل است شما نباید تمام بخش های محتوا را در یک منطقه زنده بپیچید. در غیر این صورت، کل محتوای برگه به عنوان یک رشته متن طولانی اعلام می شود و در نتیجه تجربه کاربری ضعیفی ایجاد می شود.

زمانی که به‌روزرسانی‌های محتوا برای بخش‌های بزرگ محتوا اتفاق می‌افتد، اغلب راه بهتری برای انتقال این به‌روزرسانی‌ها به کاربران صفحه‌خوان وجود دارد.

به عنوان مثال، فرض کنید در حال ساخت یک جزء فیلتر برای یک وب سایت تجارت الکترونیک یا هر وب سایتی هستید که امکان فیلتر کردن محتوا در بخش اصلی سایت را ارائه می دهد.

در اکثر برنامه های وب، به محض اینکه کاربر یکی از فیلترهای موجود را انتخاب کند، محتوای موجود در برگه اصلی به صورت پویا فیلتر می شود. اما فقط به این دلیل که محتوای بخش در حال به روز رسانی است به این معنی نیست که بخش باید منطقه فعال باشد.

پس چگونه انجام دهید به کاربر اطلاع دهید که محتوای موجود در برگه در حال به روز رسانی است؟

ارائه دستورالعمل‌های ساده‌ای که انتظارات کاربر را از آنچه در هنگام تعامل با یک عنصر روی می‌دهد تعیین می‌کند، گاهی اوقات بیش از اندازه کافی است که کاربر را از به‌روزرسانی‌های محتوا حتی قبل از وقوع آنها مطلع کند.

برای مؤلفه فیلتر، این بدان معناست که می‌توانید دستورالعملی را در بالای گروه فیلتر قرار دهید تا به کاربر اطلاع دهید که تغییر فیلترها باعث تغییر محتوا در قسمت اصلی می‌شود. به این ترتیب، انتظارات کاربر را در مورد اتفاقی که هنگام انتخاب فیلتر می‌افتد تعیین می‌کنید، بنابراین دیگر نیازی به اعلام هیچ‌گونه اعلامیه‌ای در زمان به‌روزرسانی محتوا ندارید. کاربر می داند که می تواند به سادگی به قسمت اصلی رفته و شروع به کاوش در محتوای فیلتر شده کند.

وب سایت مرجع سریع WCAG اجرای زنده این رویکرد را ارائه می دهد.

تصویری از وب‌سایت مرجع سریع WCAG که برگه فیلترها را در نوار کناری سمت چپ برجسته می‌کند، با یادداشتی در بالای برگه که می‌گوید تغییر فیلترها معیارها و تکنیک‌های موفقیت فهرست‌شده را تغییر می‌دهد.

قبل از فیلترهای محتوا در نوار کناری سمت چپ مرجع سریع، یادداشتی وجود دارد که به کاربر اطلاع می دهد که “تغییر فیلترها معیارها و تکنیک های موفقیت لیست شده را تغییر می دهد.” زمانی که این ماکت دائمی برای همه کاربران از جمله کاربران صفحه‌خوان نمایش داده می‌شود، نیازی به یک منطقه زنده نیست.

یکی دیگر از مؤلفه‌های رابط کاربری بسیار رایج که می‌تواند از یک رویکرد پیاده‌سازی مشابه بهره‌مند شود، مؤلفه جستجوی پویا است – به‌ویژه یکی از اجزای جستجوی پویا که در آن کادر جستجویی دارید که نتایج را فیلتر کرده و در حین تایپ در فیلد نمایش می‌دهد، مانند مؤلفه جستجویی که می‌توانید در وب‌سایت مجله Smashing پیدا کنید.

کاری که بسیاری از توسعه دهندگان هنگام ایجاد کامپوننتی مانند این انجام می دهند (و البته این اشتباهی است که من در اوایل کارم مرتکب شدم) این است که ظرف نتایج جستجو را به عنوان منطقه فعال تعریف می کنند (همانطور که مجله Smashing در حال حاضر انجام می دهد)، فقط به این دلیل که محتوای موجود در کانتینر به صورت پویا و همزمان با تایپ کاربر در فیلد به روز می شود. این منجر به یک تجربه کاربری بسیار پر سر و صدا می شود. به این صورت است که VoiceOver در macOS پس از تایپ یک کلمه کلیدی جستجو در آن، محتویات محفظه نتایج را اعلام می کند:


یک رویکرد ساده‌تر، قوی‌تر و کاربرپسندتر برای پیاده‌سازی این الگو، ارائه یک دستورالعمل (یعنی یک توضیح قابل دسترسی برای فیلد ورودی) است که به کاربر می‌گوید وقتی شروع به تایپ کردن در فیلد کند، چه اتفاقی می‌افتد. شرح ممکن است به عنوان “نتایج خواهد بود [ filter / display / etc. ] در حین نوشتن». به عنوان مثال، مؤلفه جستجوی وب سایت a11ysupport.io اجرای زنده این رویکرد را ارائه می دهد. توضیحات مفید جعبه جستجو به شما این امکان را می دهد که “ویژگی ها در حین تایپ فیلتر می شوند.”

ماکت باید با فیلد جستجو مرتبط باشد aria-describedby بنابراین صفحه خوان ها می توانند آن را به کاربران خود اعلام کنند.

ارائه دستورالعمل های آموزشی برای همه کاربران مفید است. اما اگر نمی‌خواهید توضیحات قابل مشاهده باشد، می‌توانید به صورت بصری آن را با استفاده از عبارت پنهان کنید visually-hidden کلاس سودمند فقط مطمئن شوید که به درستی به فیلد ورودی با استفاده از لینک مرتبط است aria-describedby.

با اطلاع دادن به کاربر صفحه‌خوان که نتایج در هنگام تایپ نمایش داده می‌شوند، دیگر نیازی به برقراری ارتباط در هنگام نمایش نتایج ندارید و کاربر می‌داند که پس از اتمام تایپ کلمه کلیدی خود در فیلد، می‌تواند به نتایج جستجو برود.

با این حساب، با این حال، شما می خواهید از یک منطقه فعال زنده برای اطلاع دادن به کاربر استفاده کنید نه نتایج یافت شد.

در حالی که نمی‌خواهیم مدام حرف افراد را در حین نوشتن قطع کنیم، اما لازم است وقتی کارها اشتباه می‌شود، صحبت را قطع کنیممهندس دسترس‌پذیری، اسکات اوهارا، در مقاله‌اش در نظر گرفتن نتایج جستجوی پویا و محتوا می‌گوید. به طور خاص، هنگامی که شخصی درخواستی را وارد می کند که هیچ نتیجه ای ندارد، فوراً به او اطلاع دهید. به تأخیر انداختن چنین پیامی منجر به اتلاف زمان و عدم اطمینان احتمالی در مورد “زمانی” که درخواست کسی کار نمی کند، می شود. […] افرادی که می توانند رابط کاربری را ببینند، احتمالاً بلافاصله متوجه خشک شدن محتوای پویا خواهند شد. سپس آنها می توانند بلافاصله با تصحیح پرس و جو خود این را تصحیح کنند. همین کمک ها باید به افراد دارای معلولیت ارائه شود.

در مقاله خود، اسکات بیشتر در مورد تمام ملاحظات قابلیت استفاده که باید هنگام اجرای یک جزء جستجوی پویا در نظر داشته باشید، توضیح می دهد. سپس راه حلی ارائه می دهد که چگونه می توانید آن را به روشی قوی تر و فراگیرتر پیاده سازی کنید. من به شدت توصیه می کنم مقاله را بررسی کنید و اگر می توانید مدل استقرار او را دنبال کنید.

اسکات علاوه بر استفاده از یک توضیح قابل دسترس برای کادر جستجو و یک منطقه زنده برای گزارش در صورت یافتن هیچ نتیجه ای، همچنین پیشنهاد می کند تمرکز صفحه کلید کاربر را به عنوانی که نتایج را معرفی می کند، منتقل کنید. وارد کنید کلید فشرده شده است البته، اگر جزء جستجوی شما عنوانی را ارائه نمی کند، نیازی به انجام این کار نخواهید داشت. اما این یک افزودنی خوب است که تجربه کاربری را برای کاربران صفحه کلید بهبود می بخشد، و صفحه خوان ها تعداد نتایج یافت شده را هنگامی که تمرکز روی عنوان حرکت می کند، اعلام می کنند.

در اینجا نحوه کار دمو اسکات با NVDA در فایرفاکس آمده است:

در این ویدئو، NVDA فیلد جستجو و به دنبال آن توضیحات موجود را اعلام می کند، زمانی که تمرکز من به سمت میدان حرکت می کند. توضیحات قابل دسترس نشان می دهد که نتایج به عنوان تایپ من ظاهر می شوند. ابتدا کلمه کلیدی “یک” را در کادر جستجو وارد می کنم. سپس Enter را فشار می دهم. با فشار دادن Enter، فوکوس صفحه کلید به عنوانی منتقل می شود که نتایج را ارائه می دهد و تعداد نتایج یافت شده را گزارش می کند. سپس کلید Escape را فشار می دهم. با فشار دادن Escape، تمرکز من به قسمت جستجو برمی گردد. وقتی یک کلمه کلیدی با بیش از پنج کاراکتر تایپ می کنم، مثال ساختگی می گوید هیچ نتیجه ای یافت نشد. از آنجایی که اسکات از یک منطقه زنده برای برقراری ارتباط در صورت یافتن نتیجه استفاده می کند، NVDA اعلام می کند “نتیجه ای یافت نشد!”.

در اینجا یک جاسازی شده از نسخه ی نمایشی اسکات است:

به قلم نگاه کن
نسخه ی نمایشی سریع نمایش/گزارش نتایج پویا توسط اسکات (@scottohara) در CodePen.

مناطق زنده برای اعلان های دارای عناصر تعاملی مناسب نیستند

مناطق فعال نباید برای پیام‌ها یا اعلان‌هایی که حاوی عناصر تعاملی هستند استفاده شوند، به‌ویژه اگر کاربر ممکن است نیاز به انجام آن اعلان‌ها داشته باشد.

همانطور که قبلا ذکر شد، هنگامی که یک صفحه خوان محتوای یک منطقه زنده را اعلام می کند، محتوای متن خام در منطقه را بدون ساختار یا معنایی اعلام می کند. این بدان معنی است که معنای هر عنصر تعاملی منتقل نخواهد شد.

علاوه بر این، هنگامی که یک به روز رسانی در یک منطقه فعال رخ می دهد، صفحه خوان ها فقط محتوای منطقه فعال را اعلام می کنند، اما تمرکز کاربر به منطقه منتقل نمی شود. و هیچ مکانیزمی وجود ندارد که به کاربر اجازه دهد به راحتی به یک منطقه زنده حرکت کند تا با هر محتوایی که ممکن است در آن باشد تعامل داشته باشد.

بنابراین، مگر اینکه مسیر روشنی برای کاربران صفحه‌خوان و صفحه‌کلید فراهم کنید تا به اعلانی که حاوی عناصر تعاملی است (مثلاً یک میان‌بر صفحه‌کلید کاملاً مستند) برسند، بسته به موقعیت منطقه فعال در DOM، دسترسی کاربر به محتوای تعاملی در اعلان دشوار – اگر غیرممکن نباشد – می‌تواند، به خصوص اگر اعلان پس از مدت کوتاهی منتظر بماند.

به همین دلیل است که پیام های تست حاوی عناصر تعاملی مشکل ساز هستند. متأسفانه، پیام‌های تست حاوی عناصر تعاملی بسیار رایج هستند. شما می توانید نمونه هایی از این موارد را در سیستم طراحی متریال گوگل مشاهده کنید.

نمونه ای از پیام نان تست با یک عنصر تعاملی از سیستم طراحی مواد. پیام می گوید

اما این پیام‌ها برای کاربران صفحه‌خوان و همچنین سایر کاربران فناوری کمکی، مانند کاربرانی که در حال مرور وب با استفاده از ذره‌بین هستند، و همچنین کاربران صفحه‌کلید، مشکلات قابلیت استفاده و دسترسی دارند.

آدریان روزلی مرتبط‌ترین خطاهای WCAG را که پیام‌های تست تمایل به شکستن آن‌ها دارند، مستند و فهرست کرده است، به‌ویژه اگر حاوی عناصر تعاملی باشند. من به شدت توصیه می‌کنم اینجا توقف کنید و چند دقیقه وقت بگذارید و مقاله آدریان را بخوانید، به خصوص اگر در برنامه‌های خود از نان تست استفاده می‌کنید.

اگر اعلان حاوی یک عنصر تعاملی است، باید مطمئن شوید که کاربر می تواند به راحتی به آن پیمایش کند. و بهترین راه برای انجام این کار این است که تمرکز کاربر را روی آن قرار دهید.

را alert و status نقش‌های منطقه‌ای زنده برای نمایش پیام‌های کوتاهی در نظر گرفته شده‌اند که نیازی به تغییر تمرکز کاربر ندارند (یعنی حاوی کودکان تعاملی نیستند).

نویسندگان باید یک عنصر با نقش ارائه کنند status در نتیجه تغییر وضعیت فوکوس دریافت نمی کند.

[…]

نه نویسندگان و نه عوامل کاربر نیازی به تنظیم یا مدیریت تمرکز روی یک هشدار برای پردازش آن ندارند. از آنجایی که برای دریافت فوکوس نیازی به هشدارها نیست، نویسندگان نباید از کاربران بخواهند که هشدار را ببندند. اگر نویسنده ای بخواهد هنگام ارسال پیام، فوکوس به آن منتقل شود، نویسنده باید از آن استفاده کند alertdialog به جای هشدار

– مشخصات ARIA

اگر اعلان حاوی یک عنصر تعاملی باشد، نباید یک منطقه فعال باشد. و لازم نیست نان تست نیز باشد. در عوض، شما باید تمرکز کاربر را به سمت آن ببرید و آن را پایدار کنید.

برای اعلان‌های هشدار تعاملی، به جای استفاده از پیام نان تست، از کادر گفتگوی هشدار استفاده کنید. آریا alertdialog نقش برای نمایش یک نوع گفتگو که حاوی یک پیام هشدار است استفاده می شود.

همانطور که از نامش پیداست، alertdialog ترکیبی است از dialog و alert نقش ها این بدان معنی است که انتظار دارد تعاملات صفحه کلید مشابهی مانند دیالوگ های مدال را نیز داشته باشد. پیاده‌سازی گفتگوی هشدار فراتر از محدوده این فصل است، اما می‌توانید الزامات تعامل معنایی و صفحه‌کلید را برای اجرای گفتگوهای هشدار در دسترس مستند شده در وب‌سایت APG بیابید.

برای اعلان‌های وضعیتی که حاوی عناصر تعاملی هستند، می‌توانید به جای آن از یک گفتگوی مودال یا غیرمدال استفاده کنید و فوکوس را در آن دیالوگ‌ها هنگامی که ظاهر می‌شوند کنترل کنید، همانطور که در صفحه مثال گفتگوی مدال APG مستند شده است.

این را در نظر داشته باشید حرکت دادن فوکوس باید به عنوان پاسخی فوری به اقدام کاربر انجام شود. اگر چیزی به صورت ناهمزمان یا پس از تأخیر رخ دهد، مثلاً نان تستی ظاهر شود که کاربر آن را نخوانده است، نباید تمرکز او را روی آن قرار دهید، در غیر این صورت تجربه کاربر را مختل می کند. تصمیم بگیرید که آیا تمرکز را بر اساس انتظارات کاربران تغییر دهید یا خیر.

مناطق زنده جایگزینی برای ویژگی های ایالت ARIA نیستند

هنگامی که یک ویژگی ARIA برای انجام این کار وجود دارد، از مناطق زنده برای انتقال تغییرات حالت استفاده نکنید.

برای مثال، اگر دکمه ای قابلیت مشاهده برخی از محتواها را در یک صفحه تغییر می دهد (مانند یک “کشویی”)، از آن استفاده کنید. aria-expanded ویژگی برای انتقال وضعیت محتوا (خواه گسترش یافته یا کوچک شده) به کاربر. برای گزارش اینکه محتوا گسترش یافته یا جمع شده است، به یک منطقه فعال نیاز ندارید.


button aria-expanded="[ true | false ]">Terms of usebutton>

به همین ترتیب، برای مثال، اگر با استفاده از دکمه جابجایی، تغییر دهنده تم تیره می‌سازید، از آن استفاده کنید aria-pressed ویژگی برای اینکه به خوانندگان صفحه نمایش بگوید که تم تیره در حال حاضر “روشن” یا “خاموش” است.


button aria-pressed="[ true | false ]">Dark themebutton>

چه زمانی aria-pressed به الف اعلام می شود