طراحی اپلیکیشن

اصول طراحی رابط موبایل

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

  • درس ۳ از ۸
  • مقدماتی
  • رایگان، بدون ثبت نام

چهار ستون رابط موبایل

ستون اول عدد منتشر شده دارد. سه تای دیگر ندارند و با نگاه کردن به خود اپ چک می شوند.

رابط موبایل قابل استفادهبا یک شست، در حال راه رفتن، با احتمال قطع شدن در هر لحظه
  • دسترس شست

    عمل اصلی در ناحیه راحت. اندازه هدف دست کم ۲۴ در ۲۴ پیکسل CSS طبق WCAG و ۴۸ در ۴۸ واحد طبق راهنمای اندروید.

  • سلسله مراتب

    در هر صفحه یک عمل اصلی. صفحه کوچک جای دو عمل هم وزن ندارد.

  • بازخورد

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

  • ثبات

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

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

آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.

رابط موبایل با رابط دسکتاپ کجا فرق می کند؟

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

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

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

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

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

شست تا کجای صفحه می رسد و هدف لمسی چقدر باشد؟

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

اندازه هدف اما جای حدس زدن نیست، چون عدد دارد و عددها منتشر شده اند. استاندارد WCAG 2.2 در معیار ۲.۵.۸ می گوید هدف ورودی اشاره گر دست کم ۲۴ در ۲۴ پیکسل CSS باشد، با استثناهایی که خودش فهرست می کند: هدف کوچک تر اگر فاصله کافی دورش باشد، یا اگر همان کار از راه دیگری در همان صفحه شدنی باشد، یا وقتی هدف داخل یک جمله است. راهنمای دسترس پذیری خود اندروید عدد بزرگ تری می دهد: دست کم ۴۸ در ۴۸ پیکسل مستقل از چگالی، با دست کم ۸ واحد فاصله بین دو هدف، و توضیح می دهد که ۴۸ واحد روی هر صفحه ای تقریبا نه میلیمتر فیزیکی می شود.

همان صفحه گوگل نکته ای دارد که بیشتر از خود عدد به کار می آید: ناحیه لمسی از مرز دیداری المان بزرگ تر است. یک آیکن که ۲۴ واحد دیده می شود، با فاصله دور خودش هدف ۴۸ واحدی می سازد. یعنی لازم نیست دکمه را زشت و بزرگ کنید؛ باید ناحیه شنیدن لمس را بزرگ کنید.

و یک هشدار درباره عددی که همه نقل می کنند. «اپل می گوید ۴۴ در ۴۴ پوینت» جمله ای است که در هر مقاله فارسی و انگلیسی طراحی موبایل تکرار می شود. ما امروز صفحه های راهنمای رابط انسانی اپل را گشتیم: صفحه چیدمان، صفحه دسترس پذیری، صفحه دکمه ها، صفحه ژست ها. این عدد در هیچ کدام به عنوان حداقل هدف لمسی نوشته نشده است. تنها جایی که ۴۴ پوینت دیدیم، جدول اندازه دکمه در visionOS بود که چیز دیگری است. پس نه اینکه عدد غلط باشد؛ منبع زنده ای برایش پیدا نکردیم و ترجیح می دهیم بگوییم نمی دانیم تا اینکه به اپل حرفی نسبت بدهیم. عددی که می شود به آن استناد کرد همان دو عدد بالاست.

چهار ناحیه صفحه، از دید شست

  • ناحیه راحت

    پایین صفحه، سمت همان دست. جای عمل اصلی و نوار تب.

  • ناحیه کشش

    وسط و بالای نزدیک. برای محتوا خوب است، برای دکمه پرکاربرد نه.

  • گوشه دور

    برای رسیدن باید گوشی در دست بلغزد. جای مناسب عمل خطرناک مثل حذف.

  • نوار بالا

    روی گوشی بزرگ با یک دست عملا دسترس ناپذیر. عنوان بله، دکمه پرکاربرد نه.

یک دست

این تقسیم بندی برای گرفتن گوشی با یک دست است. کاربری که با دو دست تایپ می کند نقشه دیگری دارد و شما نمی دانید کدامشان است.

قاعده پلتفرم را رعایت کنم یا طرح خودم را بگذارم؟

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

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

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

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

کدام تصمیم مال پلتفرم است و کدام مال شما

مال پلتفرم

  • رفتار دکمه برگشت و ژست کشیدن از لبه
  • جای نوار تب و ساختار ناوبری
  • رفتار صفحه کلید و انتخابگر تاریخ
  • حالت تیره و اندازه فونت سیستم
  • آینه شدن چیدمان در راست به چپ

مال شما

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

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

رابط فارسی روی گوشی کجا می شکند؟

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

اول، عددها. اپل می گوید ترتیب رقم های داخل یک عدد مشخص هرگز برعکس نمی شود: شماره تلفن و شماره کارت و عدد ۵۴۱ در هر جهتی همان ترتیب را دارند. اما ترتیب عددهایی که پیشرفت یا شمارش را نشان می دهند باید برعکس شود، چون خود کنترل آینه شده است. این دو قاعده شبیه هم به نظر می رسند و در عمل خلاف هم اند.

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

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

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

چیزهایی که فقط روی گوشی فارسی خودشان را نشان می دهند

برگه بازبینی رابط فارسی روی گوشیراست چین

این ها را چک کنید

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

این ها را نکنید

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

هیچ کدام از این ها را ابزار خودکار پیدا نمی کند. گوشی را به کسی بدهید که فارسی می خواند و بگویید یک بار ثبت نام کند.

حالت هایی که هیچ وقت در طرح اولیه کشیده نمی شوند

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

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

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

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

مسیر سریع با هوش مصنوعی

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

  1. با یک grep فهرست کاندیدها را دربیاورید، نه با چشم. الگوی کار: margin-left و margin-right و padding-left و padding-right و border-left و border-right و left و right تنها و text-align با مقدار left یا right.
  2. خروجی grep را با شماره خط به مدل بدهید و نسخه پایین را اجرا کنید. فایل کامل را ندهید؛ فقط خط های پیدا شده لازم است و جواب کوتاه تر و دقیق تر می شود.
  3. ستون سوم جواب، همان مرحله قضاوت است و مال شماست: هر خطی که مدل «باید فیزیکی بماند» علامت زده را خودتان تایید یا رد کنید. آیکن ها و فلش های چرخانده شده معمولا در همین ستون اند.
  4. تغییرها را اعمال کنید و صفحه را در هر دو جهت باز کنید، نه فقط در فارسی. تبدیل درست باید انگلیسی را هم دست نخورده نگه دارد؛ اگر چیزی در حالت چپ به راست جا به جا شد، جای درستش را عوض کرده اید نه جهتش را.

نسخه آماده کپی

این خط ها از یک فایل CSS اند و هر کدام یک خاصیت جهت دار فیزیکی دارند. هدف، راست به چپ شدن رابط بدون نوشتن فایل دوم است.

برای هر خط دقیقا سه ستون بده و هیچ توضیح اضافه ای ننویس:
۱) شماره خط و خود خط، بدون تغییر.
۲) جایگزین منطقی پیشنهادی، اگر وجود دارد. margin-inline-start و margin-inline-end و padding-inline-start و padding-inline-end و border-inline-start و border-inline-end و inset-inline-start و inset-inline-end و text-align با مقدار start یا end.
۳) یک کلمه: «منطقی» یا «فیزیکی بماند». هر خطی که به یک جهت فیزیکی واقعی اشاره می کند، مثل بردری که با rotate به فلش تبدیل شده یا آیکنی که معنایش «به راست» است، باید «فیزیکی بماند» بگیرد.

قاعده ها:
- خطی را که مطمئن نیستی، «فیزیکی بماند» بگذار و در ستون سوم دلیلش را در حداکثر ده کلمه بنویس.
- هیچ خطی را حذف نکن و هیچ خط تازه ای اضافه نکن.
- درباره رنگ و اندازه و نام کلاس ها نظر نده.

خط ها:
{خروجی grep}

قبل از اعتماد به خروجی: ستون سوم را باور نکنید، بخوانید. مدل نمی داند کدام بردر با rotate به فلش تبدیل شده و کدام یک خط تزئینی است، چون فقط یک خط از فایل را دیده. ما همین grep را روی استایل خود این سایت اجرا کردیم و دقیقا یک مورد باقی ماند که باید فیزیکی می ماند؛ پیدا کردنش کار آدم بود نه کار مدل. تبدیل درست را هم آخرش با چشم چک کنید، در هر دو جهت.

هوش مصنوعی در این کار

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

ابزارهایی که واقعا کمک می کنند

  • Gemini برای پاس مکانیکی روی خط های استایل انتخاب مقرون به صرفه ای است و تصویر را هم می خواند. صفحه خود گوگل می گوید اپ وب جمنای در بیش از دویست و سی کشور و منطقه کار می کند و ایران در آن فهرست نیست.
  • Claude وقتی می خواهید حالت های فراموش شده یک کامپوننت را با کد بنویسید، بهتر جواب می دهد. ایران در هیچ کدام از دو فهرست کشورهای پشتیبانی شده انتروپیک نیست؛ این را از صفحه خود انتروپیک خوانده ایم.
  • Accessibility Scanner هوش مصنوعی نیست و عمدا اینجاست: اندازه هدف لمسی را روی گوشی اندروید واقعا اندازه می گیرد. صفحه خود گوگل می گوید این ابزار فقط از اندروید ۱۰ به بعد استفاده از TouchDelegate را تشخیص می دهد، پس روی نسخه های قدیمی تر ممکن است هدف بزرگ شده را هم گزارش کند.

کجا نتیجه معکوس می دهد

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

منبع ها: W3C: Understanding SC 2.5.8 Target Size (Minimum) W3C WAI: Easy Checks Android Accessibility Help: Touch target size Anthropic: supported countries Google: where Gemini Apps are available

حد این توصیه

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

از تجربه خود ما

یک تصمیم بصری روی سایت خودمان، عرض منوی موبایل را پنجاه پیکسل کم کرد و ما مجبور شدیم آن تصمیم را به دسکتاپ محدود کنیم. نوار هدر rgb.ir یک افکت شیشه ای دارد که با backdrop-filter ساخته شده و در فایل main.css فقط بالای ۱۱۰۱ پیکسل روشن است. دلیلش در کامنت همان بلوک نوشته شده و اندازه گیری شده است: backdrop-filter المان را به containing block تبدیل می کند، و منوی کشویی موبایل که position: absolute و inset-inline: 0 دارد، به جای عرض کامل صفحه به داخل خود نوار می چسبد. عدد در کامنت هست: ۳۹۰ پیکسل تبدیل شد به ۳۴۰.
مثال دوم از جنس همین درس است. جدول های سه ستونه به بالای این سایت زیر ۷۸۰ پیکسل به کارت تبدیل می شوند، و انتخابشان با :has(thead th:nth-child(3)) در CSS است نه با کلاسی که جاوااسکریپت اضافه کند. علتش دقیقا همان بازخوردی است که در این درس گفتیم: اگر چیدمان منتظر اسکریپت بماند، صفحه بعد از اولین رنگ تکان می خورد. برچسب هر سلول را جاوااسکریپت می نویسد، ولی ارتفاعش را از قبل min-height رزرو کرده است تا قبل و بعد از اجرای اسکریپت ارتفاع یکی باشد.

سوال هایی که واقعا پرسیده می شوند

طراحی رابط موبایل با طراحی سایت واکنشگرا یکی است؟

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

دکمه اصلی را بالای صفحه بگذارم یا پایین؟

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

برای راست چین کردن اپ باید یک نسخه دوم از رابط بسازیم؟

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