IlmHamroh
JavaScript Full-stack/6-qism. CSS: harakat, zamonaviy CSS va dizayn43/57-dars22 daqiqa
Mundarija (34)

UI/UX asoslari: komponent holatlari, Fitts va Hick qonunlari, qulaylik

Qisqacha: Interfeys "chiroyli" bo'lishi yetmaydi — u har holatda nima bo'layotganini aytishi kerak. Har komponentning holatlari o'ylanadi: oddiy, hover, fokus, bosilgan, nofaol, yuklanmoqda, shuningdek bo'sh, xato va muvaffaqiyat. Idrok qonunlari qarorlarni asoslaydi: Fitts — nishon qancha katta va yaqin bo'lsa, shuncha tez bosiladi; Hick — tanlov qancha ko'p bo'lsa, qaror shuncha sekin; Jakob — odamlar saytingiz boshqa saytlardek ishlashini kutadi. Bosish maydoni kamida 24×24 piksel (WCAG 2.2 AA), yaxshisi 44×44. Xato xabari nima bo'lganini va qanday tuzatishni oddiy so'z bilan aytadi.

Bu darsda

  • Komponentning to'qqiz holatini sanaysiz va har biriga CSS selektorini topasiz.
  • Affordance va javob (feedback) nima ekanini, javob tezligi chegaralarini tushuntirasiz.
  • Fitts, Hick va Jakob qonunlarini manbasi bilan aytib, dizayn qaroriga aylantirasiz.
  • Kichik elementning bosish maydonini ko'rinishini o'zgartirmasdan kattalashtirasiz.
  • Bo'sh holat va xato xabarini yozasiz, sahifani Nielsen'ning 10 evristikasi bilan tekshirasiz.

Oldin bilishingiz kerak: Vizual ierarxiya, Holat pseudo-klasslari, O'lchamlar va bosish nishoni, Micro-interaktsiyalar, Tipografik shkala.

1. Nega bu kerak?

Juma kuni kechqurun Bobur «Bahor» saytida stol band qilyapti. Internet sekin. U "Yuborish" tugmasini bosadi — hech narsa o'zgarmaydi. Bosildimi? Yana bosadi. Uch soniyadan keyin sahifa ochiladi: ikkita bron qabul qilingan. Jasur aka endi bitta mehmonga ikkita stol ushlab turibdi.

Tugma chiroyli edi: yashil, yumaloq burchak, to'g'ri kontrast. Lekin u bitta savolga javob bermadi: "Hozir nima bo'lyapti?". Bu — UI va UX o'rtasidagi farq.

  • UI (user interface — foydalanuvchi interfeysi) — nima ko'rinadi: rang, shrift, tugma shakli. Oldingi to'rt dars shu haqda edi.
  • UX (user experience — foydalanuvchi tajribasi) — odam interfeys bilan ishlaganda nima his qiladi: tushunadimi, adashadimi, maqsadiga yetadimi.

Qulay interfeys — yaxshi ofitsiant kabi. Otabek buyurtmani olgach "yozib oldim, 15 daqiqada tayyor" deydi. Kechiksa, kelib aytadi. Taom tugagan bo'lsa, o'rniga nima borligini taklif qiladi. Mehmon hech qachon "meni unutishdimi?" deb o'ylamaydi.

2. Komponent holatlari

2.1 To'qqiz holat

Dizayner maketda tugmani bitta holatda chizadi — oddiy. Haqiqiy tugma esa kamida olti holatda yashaydi. Ma'lumot ko'rsatadigan blok (ro'yxat, forma) yana uchtasini qo'shadi:

Holat Qachon CSS
Oddiy (default) Hech narsa bo'lmayapti —
Hover Sichqoncha ustida :hover (hover: hover ichida)
Fokus Klaviatura bilan tanlangan :focus-visible
Bosilgan (active) Bosish paytida :active
Nofaol (disabled) Hozir ishlamaydi :disabled, [aria-disabled="true"]
Yuklanmoqda (loading) Javob kutilmoqda [aria-busy="true"]
Bo'sh (empty) Ko'rsatadigan narsa yo'q :not(:has(li))
Xato (error) Nimadir noto'g'ri :user-invalid
Muvaffaqiyat (success) Amal bajarildi xabar bloki

Selektorlarning ko'pi sizga tanish: Holat pseudo-klasslari, Mantiqiy pseudo-klasslar, Mobil qurilma tuzoqlari (hover faqat sichqonchada). Yuklanish holatini JavaScript qo'yadi (aria-busy atributi) — tilni 08-qismdan, sahifadagi atributlarni almashtirishni 09-qismdan o'rganasiz; hozir CSS tomoni yetadi.

2.2 Holatlar yonma-yon

Professional jamoalar holatlarni holat matritsasi (state matrix) qilib bir joyda ko'radi. «Bahor» bron tugmasining olti holati:

html
<style>
  body { font-family: system-ui, sans-serif; background: #fffaf0; }
  .qator {
    display: flex;
    flex-wrap: wrap;
    align-items: end;
    gap: 1rem;
  }
  figure { margin: 0; }
  figcaption {
    margin-top: 0.375rem;
    font-size: 0.8rem;
    color: #5b6660;
  }
  button {
    min-block-size: 2.75rem;
    padding-inline: 1.25rem;
    border: 0;
    border-radius: 0.5rem;
    font: inherit;
    background: oklch(47.5% 0.1 147.7);
    color: #fffaf0;
  }
  .hover { background: oklch(42% 0.1 147.7); }
  .fokus {
    outline: 3px solid oklch(42% 0.12 143.1);
    outline-offset: 2px;
  }
  .bosilgan {
    background: oklch(35% 0.085 147.7);
    scale: 0.97;
  }
  button:disabled {
    background: oklch(90% 0.01 162);
    color: oklch(49.9% 0.016 162);
  }
  button[aria-busy="true"] {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
  }
  button[aria-busy="true"]::before {
    content: "";
    width: 1em;
    height: 1em;
    border: 2px solid currentColor;
    border-inline-end-color: transparent;
    border-radius: 50%;
  }
  @media (prefers-reduced-motion: no-preference) {
    button[aria-busy="true"]::before {
      animation: aylan 0.8s linear infinite;
    }
  }
  @keyframes aylan { to { rotate: 1turn; } }
</style>
<div class="qator">
  <figure><button type="button">Yuborish</button>
    <figcaption>Oddiy</figcaption></figure>
  <figure><button type="button" class="hover">Yuborish</button>
    <figcaption>Hover</figcaption></figure>
  <figure><button type="button" class="fokus">Yuborish</button>
    <figcaption>Fokus</figcaption></figure>
  <figure><button type="button" class="bosilgan">Yuborish</button>
    <figcaption>Bosilgan</figcaption></figure>
  <figure><button type="button" disabled>Yuborish</button>
    <figcaption>Nofaol</figcaption></figure>
  <figure><button type="button" aria-busy="true">Yuborilmoqda</button>
    <figcaption>Yuklanmoqda</figcaption></figure>
</div>

Nimaga qarang: hover va bosilgan holat — shkalaning keyingi qadamlari (Rang nazariyasi: 600 → 700 → 800), yangi rang ixtiro qilinmagan. Fokusda tugma atrofida to'q halqa. Nofaol tugma kulrang — "bor, lekin hozir ishlamaydi". Yuklanishda so'z o'zgardi va yonida aylanuvchi belgi paydo bo'ldi (harakatni kamaytirish yoqilgan bo'lsa — belgi aylanmaydi, lekin so'z baribir aytadi). .hover, .fokus, .bosilgan — holatlarni "muzlatib" ko'rsatish uchun namoyish class'lari. Haqiqiy kodda ular :hover, :focus-visible, :active bo'ladi.

2.3 Holat tuzoqlari

  • Yuklanishda tugma eni sakraydi. "Yuborish" → "Yuborilmoqda" — matn uzunroq, tugma kengayadi va yonidagi elementlarni suradi. Yechim: min-inline-size yoki matnni o'zgartirmasdan faqat belgi qo'shish. Bu mavzuni Tugmalar tizimi darsida to'liq quramiz.
  • Nofaol tugma — sababsiz. Foydalanuvchi "nega bosilmayapti?" deb qoladi. Iloji bo'lsa tugmani faol qoldirib, bosilganda nima yetishmayotganini ayting. Nofaol qilsangiz — yonida sababini yozing ("Avval sanani tanlang").
  • disabled va klaviatura. disabled tugmaga Tab bilan borib bo'lmaydi — ekran o'quvchi foydalanuvchisi uni umuman topmasligi mumkin. aria-disabled="true" esa tugmani fokusda qoldiradi, lekin bosishni skript to'xtatishi kerak.
  • Hover — yagona signal. Telefonda hover yo'q (Mobil qurilma tuzoqlari). Muhim ma'lumot faqat hover'da ko'rinsa, telefon foydalanuvchisi uni hech qachon ko'rmaydi.

Tekshirib ko'ring: «Bahor» bron formasi bor-yo'g'i bitta "Yuborish" tugmasiga ega. Qaysi holatlar unga albatta kerak va qaysilari — ixtiyoriy?

Javob

Albatta: oddiy, fokus (klaviatura — Bobur!), bosilgan (bosildi degan javob), yuklanmoqda (sekin internetda ikki marta bosishning oldini oladi). Hover — sichqonchali qurilmada foydali, lekin majburiy emas. Nofaol — ixtiyoriy va ehtiyotkorlik bilan: forma to'lmaguncha tugmani o'chirib qo'ygandan ko'ra, bosilganda xato maydonlarni ko'rsatgan yaxshiroq. Formaning o'zi esa xato va muvaffaqiyat holatlariga ega bo'lishi shart.

3. Affordance va javob

3.1 Affordance

Affordance (inglizcha, "imkon berish") — narsaning o'zi qanday ishlatilishini "aytishi". Eshikdagi tutqich "torting" deydi, tekis metall plastinka — "itaring". Atamani psixolog James Gibson kiritgan, dizaynga Don Norman "The Design of Everyday Things" (1988) kitobi bilan olib kirgan. Keyingi nashrlarda Norman ko'rinadigan belgini alohida atadi: signifier (ishora belgisi) — "bu yerni bosish mumkin" degan ko'rinadigan ishora. Farqi oddiy: affordance — "bosish mumkin", signifier — "bosish mumkinligi ko'rinib turibdi".

Vebda signifier'lar:

  • Havolaning tagidagi chiziq va o'z rangi.
  • Tugmaning to'liq foni yoki ramkasi, yumaloq burchagi.
  • Maydonning chegarasi (bo'sh to'rtburchak — "bu yerga yozing").
  • cursor: pointer va hover'dagi o'zgarish (faqat sichqonchada).

"Tekis dizayn" (flat design) davrida ko'p saytlar bu belgilarni olib tashladi: havola chiziqsiz, tugma — oddiy rangli matn. Natijada foydalanuvchi nimani bosish mumkinligini qidirib yuradi. Vizual ierarxiya darsidagi uchinchi darajali harakat ham baribir havola kabi ko'rinishi kerak edi — shuning uchun tagiga chiziq qoldirdik.

3.2 Javob va vaqt chegaralari

Javob (feedback) — tizim har amalga ko'rinadigan reaksiya berishi. Jakob Nielsen "Usability Engineering" (1993) kitobida javob tezligining uchta chegarasini keltiradi:

Vaqt Foydalanuvchi his qiladi Nima kerak
0.1 s gacha Tizim darhol javob berdi Hech narsa — natija o'zi
1 s gacha Fikr uzilmadi, lekin kechikishni sezdi Yengil ishora (tugma holati)
10 s gacha Diqqat saqlanadi Yuklanish belgisi, yaxshisi — progress

1 soniyadan uzoq har amal — yuklanish holati bilan. 10 soniyadan uzoq — foiz yoki qadamlar ("2/3: to'lov tekshirilmoqda") va bekor qilish imkoni. Bobur voqeasidagi xato aynan shu: 3 soniya — hech qanday javob.

Micro-interaktsiyalar darsidagi tugma bosilishi (scale: 0.97) — 0.1 soniyadagi javob. Skeleton va spinner — 1–10 soniya uchun.

Tekshirib ko'ring: «Bahor» menyusidagi "Batafsil" havolasi oddiy qora matn, tagida chiziq yo'q, rangi atrofdagi matn bilan bir xil. Qaysi tushuncha yetishmayapti — affordance yoki signifier?

Javob

Signifier. Havolani bosish mumkin (affordance bor), lekin buni ko'rsatadigan belgi yo'q. Tagidagi chiziq yoki o'z rangi — o'sha yetishmagan ishora. Nega muhim: foydalanuvchi bosish mumkinligini bilmasa, u uchun havola yo'q bilan barobar.

4. Idrok qonunlari

Bu qonunlar psixologiya tajribalaridan chiqqan. Ular aniq formulalar beradi, lekin interfeysda ulardan asosan yo'nalish olinadi: "kattaroq", "yaqinroq", "kamroq". Jon Yablonski'ning "Laws of UX" sayti (lawsofux.com) va shu nomli kitobi ularni dizayn tilida to'plagan.

4.1 Fitts qonuni

Paul Fitts 1954-yilgi tajribasida odam nishonga qo'lini qanchalik tez yetkazishini o'lchadi. Xulosa: vaqt nishongacha masofa oshgan sari o'sadi, nishon o'lchami oshgan sari kamayadi. Bugun ko'p ishlatiladigan shakli (MacKenzie, 1992):

text
T = a + b × log₂(D ÷ W + 1)

T — vaqt, D — nishongacha masofa, W — nishonning (harakat yo'nalishidagi) eni, a va b — tajribada o'lchanadigan sonlar. log₂ — "ikkini necha marta ko'paytirsa, shu son chiqadi": log₂8 = 3, chunki 2 × 2 × 2 = 8. Formulani yodlash shart emas. Muhimi — D ÷ W nisbati: nishonni ikki barobar kattalashtirish uni ikki barobar yaqinlashtirish bilan bir xil ta'sir qiladi.

Interfeysdagi xulosalar:

  • Muhim tugma — katta. «Bahor»ning telefondagi "Stolni band qilish" tugmasi butun en bo'ylab (Mobile-first darsida o'lchagan edik: 344 × 45 piksel).
  • Tegishli narsalar — yaqin. "Yuborish" tugmasi formaning oxirgi maydoni ostida, sahifaning boshqa burchagida emas.
  • Telefonda — bosh barmoq zonasi. Telefonni bir qo'lda ushlaganda ekranning pastki qismiga barmoq oson yetadi. Asosiy harakatlar pastroqda qulay.
  • Xavfli tugma — uzoqroq. "Bronni bekor qilish" "Tasdiqlash" yonida yopishib tursa, tasodifan bosiladi. Fitts qonunini teskari ishlatamiz.

4.2 Hick qonuni

William Hick (1952) va Ray Hyman (1953) tajribalari: tanlash vaqti variantlar soni bilan logarifmik o'sadi:

text
T = b × log₂(n + 1)

n — teng ehtimolli variantlar soni (har biri bir xil tez-tez tanlanadi). 3 ta variantdan 7 taga o'tish vaqtni ikki barobar emas, taxminan 1.5 barobar oshiradi (log₂4 = 2, log₂8 = 3). Lekin o'sish to'xtamaydi.

Xulosalar:

  • Asosiy menyuda kam band. «Bahor» menyusida 4 ta havola: Menyu, Bron, Aloqa, Blog. 12 ta bo'lsa — har kirishda odam qaror qilishga ko'proq vaqt sarflaydi.
  • Ko'p variant — guruhlarga. 40 ta taomni bitta ro'yxatda emas, "Issiq taomlar", "Salatlar", "Ichimliklar" bo'limlarida.
  • Tavsiya etilgan variant. Ko'p tanlovda bittasini ajratish (masalan, "Eng ko'p buyurtma qilinadi") qarorni tezlashtiradi.

Diqqat: Hick qonuni oddiy tanlov uchun: odam hamma variantni biladi va bittasini tanlaydi. Uzun ro'yxatni ko'zdan kechirish (masalan, alifbo bo'yicha shaharlar ro'yxati) boshqacha ishlaydi — u yerda qidiruv va tartib yordam beradi. Qonunni "menyuda 5 tadan ortiq band bo'lmasin" degan qat'iy raqamga aylantirmang.

4.3 Jakob qonuni

Jakob Nielsen 2000-yilda shunday yozgan: foydalanuvchilar vaqtining ko'p qismini boshqa saytlarda o'tkazadi. Demak ular sizning saytingiz ham o'zlari biladigan saytlardek ishlashini kutadi. Bu Jakob qonuni nomi bilan tarqalgan.

Xulosa — konventsiyalarni buzmang:

  • Logotip — chap yuqorida, bosh sahifaga havola.
  • Havola — tagi chizilgan yoki aniq ajralgan rangda.
  • Savat — o'ng yuqorida.
  • Qidiruv maydonida lupa belgisi.
  • Formadagi * — majburiy maydon.

«Bahor» saytida "yangicha" menyu o'ylab topish mumkin — masalan, ekran chetida aylanadigan g'ildirak. Lekin Jasur akaning mehmonlari har kuni Telegram va Instagram'da boshqa menyularni ko'radi. Tanish naqsh o'rganishni talab qilmaydi. Yangilik — mazmunda (osh, xizmat), navigatsiyada emas.

Tekshirib ko'ring: Dizayner «Bahor» telefon versiyasida "Stolni band qilish" tugmasini sahifaning eng tepasiga, logotip yoniga kichik ikonka qilib qo'ymoqchi. Qaysi ikki qonun bunga qarshi?

Javob

Fitts — kichik ikonka (kichik W) va ekranning yuqori burchagi, bir qo'lda ushlagan telefonda bosh barmoqdan eng uzoq joy (katta D). Jakob — odamlar asosiy harakatni kontent ichida yoki pastda, so'z bilan yozilgan tugma ko'rinishida kutadi; tepadagi ikonka ko'pincha menyu yoki profil deb o'qiladi. Yana bir muammo — Vizual ierarxiya: sahifaning asosiy harakati eng kuchsiz ko'rinishda bo'lib qoladi.

5. Bosish maydoni

5.1 Raqamlar

O'lchamlar darsida asosni qo'ygan edik, endi hammasini bir joyga yig'amiz:

Manba Minimal o'lcham Daraja
WCAG 2.2, 2.5.8 24 × 24 CSS piksel AA — talab
WCAG 2.2, 2.5.5 44 × 44 CSS piksel AAA — yuqori daraja
Apple Human Interface Guidelines 44 × 44 pt iOS tavsiyasi
Material Design 48 × 48 dp Android tavsiyasi

pt va dp — CSS'dagi px bilan bir ma'noda (Spacing tizimi). Kursdagi qaror o'zgarmaydi: talab — 24, maqsad — 44. Portfolio menyusi Flex naqshlari darsida 21 dan 32 pikselga ko'tarilgan edi — talabdan o'tadi, maqsadga yetmaydi. Asosiy tugmalar esa 44 (min-block-size: 2.75rem).

5.2 Ko'rinishni o'zgartirmasdan kattalashtirish

Ba'zan element ko'rinishda kichik bo'lishi kerak: jadvaldagi kichik "×" (o'chirish) belgisi, footer'dagi ijtimoiy tarmoq ikonkasi. Bosish maydonini kattalashtirishning ikki yo'li:

  1. Padding — element kattalashadi, lekin foni bo'lmasa, ko'zga farq sezilmaydi (Flex naqshlari menyusi shunday).
  2. Pseudo-element — elementning ustiga ko'rinmas, kattaroq "qatlam" qo'yiladi:
html
<style>
  body { font-family: system-ui, sans-serif; }
  .qator { display: flex; gap: 3rem; padding: 1.5rem; }
  a.belgi {
    position: relative;
    display: inline-grid;
    place-items: center;
    width: 1.25rem;
    height: 1.25rem;
    border-radius: 50%;
    background: #2f6b3a;
    color: #fffaf0;
    font-size: 0.75rem;
    text-decoration: none;
  }
  a.belgi::before {
    content: "";
    position: absolute;
    inset: -0.75rem;
  }
  .korsat::before { outline: 2px dashed #b4461a; }
</style>
<div class="qator">
  <a class="belgi" href="https://t.me/sizning_kanal"
    aria-label="Telegram">T</a>
  <a class="belgi korsat" href="https://t.me/sizning_kanal"
    aria-label="Telegram (bosish maydoni ko'rsatilgan)">T</a>
</div>

Nimaga qarang: ikkala belgi ko'rinishda bir xil — 20 piksellik yashil doira. O'ngdagisida qizg'ish punktir bilan bosish maydoni ko'rsatildi: inset: -0.75rem uni har tomondan 12 pikselga kengaytirdi, jami 44 × 44. Chrome'da tekshirdik: doiradan 10 piksel chetga bosish ham havolani ochadi, chunki ::before havolaning bir qismi. position: relative shart — usiz ::before boshqa ota-elementga nisbatan joylashib ketadi (position).

Diqqat: Kengaytirilgan maydonlar bir-birini yopmasin. Ikki qo'shni ikonka 24 piksel oraliqda tursa-yu, har birining maydoni 12 piksel chiqsa — ular ustma-ust tushadi va keyingisi oldingisini "yutadi". gap ni maydonga qarab tanlang.

Tekshirib ko'ring: Ikonka 20 piksel, ::before da inset: -0.75rem (12 piksel). Bosish maydoni eni: 20 + 12 + 12 = piksel. Ikonka 16 piksel bo'lsa-yu, maydonni 44 ga yetkazmoqchi bo'lsangiz, har tomonga necha piksel kerak?

Javob

(44 − 16) ÷ 2 = 14 piksel, ya'ni inset: -0.875rem. Nega ikkiga bo'lamiz: kengaytma ikki tomonga — chapga ham, o'ngga ham — qo'shiladi.

6. Bo'sh holat

Bo'sh holat (empty state) — ko'rsatadigan ma'lumot yo'q payt: savat bo'sh, qidiruv hech narsa topmadi, bugun bron yo'q. Ko'p saytlar bu yerda oq ekran yoki "Ma'lumot yo'q" deb qo'yadi. Foydalanuvchi esa "buzilganmi?" deb o'ylaydi.

Yaxshi bo'sh holat uchta narsani aytadi:

  1. Nima bo'ldi — "Savatingiz hozircha bo'sh".
  2. Nega (kerak bo'lsa) — "Siz hali taom tanlamadingiz".
  3. Keyin nima qilish kerak — tugma: "Menyuni ochish".

CSS'da bo'sh holatni :has() bilan ko'rsatish mumkin — ro'yxatda element qolmasa, xabar chiqadi:

html
<style>
  body { font-family: system-ui, sans-serif; background: #fffaf0; }
  .savat {
    max-width: 20rem;
    padding: 1rem;
    border-radius: 0.5rem;
    background: white;
  }
  .savat h2 { margin: 0 0 0.5rem; font-size: 1.2rem; }
  .savat ul { margin: 0; padding-left: 1.25rem; }
  .bosh-holat { display: none; margin: 0; text-align: center; }
  .savat:not(:has(li)) ul { display: none; }
  .savat:not(:has(li)) .bosh-holat { display: block; }
  .bosh-holat a {
    display: inline-block;
    margin-top: 0.75rem;
    padding: 0.625rem 1rem;
    border-radius: 0.5rem;
    background: #2f6b3a;
    color: #fffaf0;
    text-decoration: none;
  }
</style>
<section class="savat">
  <h2>Buyurtmangiz</h2>
  <ul></ul>
  <p class="bosh-holat">Savatingiz hozircha bo'sh.<br>
    <a href="menyu/">Menyuni ochish</a></p>
</section>

Nimaga qarang: ul da bitta ham li yo'q — shuning uchun ro'yxat yashirindi, o'rniga xabar va yashil tugma chiqdi. "Tahrirlab ko'rish" bilan ul ichiga <li>Osh</li> yozing: xabar yo'qoladi, ro'yxat paydo bo'ladi. .savat va .bosh-holat — faqat namoyish class'lari; «Bahor»da savat hozircha yo'q.

Bo'sh holat — bir martalik "salomlashish" ham: yangi foydalanuvchi ilovani birinchi ochganda ko'radigan narsa. Yaxshi yozilgan bo'sh holat qo'llanmaning o'rnini bosadi.

7. Xato xabarlari

Nielsen Norman Group'ning xato xabarlari bo'yicha tavsiyalari qisqacha: xabar ko'rinadigan (xato joyi yonida), tushunarli (texnik kodsiz), aniq (qaysi maydon, nima noto'g'ri) va yo'l ko'rsatuvchi (qanday tuzatish) bo'lsin. Foydalanuvchini ayblamang.

Yomon Yaxshi
"Invalid input" "Telefon raqamini to'liq yozing: +998 90 000 00 00"
"Xato 422" "Bu sanada bo'sh stol qolmadi. Boshqa kunni tanlang"
"Siz noto'g'ri kiritdingiz!" "Odamlar soni 1 dan 20 gacha bo'lsin"
Faqat qizil chegara Belgi, matn va chegara birga

CSS tomonida Holat pseudo-klasslari darsidagi :user-invalid bor: xato faqat foydalanuvchi maydon bilan ishlab bo'lgach ko'rsatiladi, sahifa ochilganda hamma maydon qizarib turmaydi. «Bahor» bron formasida har maydon yonida yordam matni bor (id="<maydon>-yordam", 04-qismdan). Xato bo'lganda aynan shu matnni xato rangiga o'tkazish — eng sodda va to'g'ri yo'l: foydalanuvchi qoidani oldindan ham, xatodan keyin ham bir joyda o'qiydi. Buni portfolio qadamida qilamiz.

Xato matnini ekran o'quvchi ham eshitishi kerak. aria-describedby (Qulay va accessible forma) yordam matnini maydonga bog'laydi. Dinamik xabarlar (serverdan kelgan xato) esa JavaScript va aria-live bilan e'lon qilinadi — buni forma validatsiyasi darslarida ko'rasiz.

Tekshirib ko'ring: Nega "Faqat qizil chegara" yomon xato xabari hisoblanadi, chegara ko'rinib turgan bo'lsa ham?

Javob

Uch sabab. Rangni farqlamaydigan odam qizilni ajratmasligi mumkin. Ekran o'quvchi rangni o'qimaydi. Chegara "nimadir noto'g'ri" deydi, lekin nima noto'g'ri va qanday tuzatishni aytmaydi. Shuning uchun belgi, matn va chegara birga ishlatiladi.

8. Nielsen'ning 10 evristikasi

Jakob Nielsen 1990-yilda Rolf Molich bilan birga interfeysni tekshirish qoidalarini tuzgan, 1994-yilda ularni 10 ta evristika (tajribadan chiqqan qoida) qilib yakunlagan. NN/g saytidagi maqola 2024-yilda yangilangan, lekin muallifning aytishicha, qoidalarning o'zi 1994-yildan beri o'zgarmagan. Ular bilan har qanday sahifani 15 daqiqada "ko'rikdan" o'tkazish mumkin:

# Evristika «Bahor»da
1 Tizim holati ko'rinsin "Yuborilmoqda…" tugmasi
2 Real dunyo tili "Stol band qilish", "booking" emas
3 Boshqaruv va erkinlik Bronni bekor qilish havolasi
4 Izchillik va standartlar Hamma sahifada bir xil menyu (Jakob)
5 Xatoning oldini olish type="tel", max="20"
# Evristika «Bahor»da
6 Eslab qolish emas, tanib olish Sana — kalendar, qo'lda yozish emas
7 Moslashuvchanlik va tezlik Tez-tez beriladigan buyurtma bir tugmada
8 Estetik va minimal dizayn Kartada faqat nom, narx, tavsif
9 Xatoni tanish va tuzatishga yordam "Odamlar soni 1 dan 20 gacha"
10 Yordam va hujjat "Bron qanday ishlaydi?" savol-javobi

Evristikalar — ro'yxat, ball emas. Ular bilan har sahifani ko'rib chiqib, "buzilgan" joylarni yozasiz: qaysi evristika, qayerda, qanchalik jiddiy. Bu usul evristik baholash (heuristic evaluation) deb ataladi va foydalanuvchi testidan arzonroq, tezroq.

9. Ko'p uchraydigan xatolar

9.1 Faqat oddiy holat

Maketda bitta tugma — kodda ham bitta holat. Fokusda hech narsa ko'rinmaydi, yuklanishda javob yo'q. Tuzatish: holat matritsasi — har komponent uchun to'qqiz holat jadvali.

9.2 outline: none

"Chiroyli emas" deb fokus halqasi o'chirilgan. Klaviatura foydalanuvchisi qayerdaligini bilmaydi. Tuzatish: :focus-visible bilan o'z halqangizni chizing — CSS'da accessibility darsida to'liq.

9.3 Kichik bosish maydoni

16 piksellik ikonka, atrofida hech narsa. Tuzatish: padding yoki ::before bilan kamida 24, maqsad 44.

9.4 Javobsiz amal

Tugma bosildi — hech narsa. Tuzatish: 0.1 soniyada ko'rinadigan o'zgarish (:active), 1 soniyadan uzoqda — yuklanish holati.

9.5 Ayblovchi xato matni

"Siz xato qildingiz!" Tuzatish: nima noto'g'ri va qanday tuzatish — neytral ohangda.

9.6 Konventsiyani buzish

Havola chiziqsiz va matn rangida, logotip bosilmaydi. Tuzatish: Jakob qonuni — tanish naqshlar.

10. Mashqlar

1-mashq (oson): holatlar jadvali

«Bahor» bosh sahifasidagi "Stolni band qilish" havolasi (.bron-havola) uchun holatlar jadvalini yozing: har holat uchun CSS selektori va nima o'zgaradi. Qaysi holatlar havolaga kerak emas?

Ishora: "To'qqiz holat" jadvali. Havola — a, button emas: unda disabled atributi yo'q.

Yechim
Holat Selektor O'zgarish
Oddiy .bron-havola 600 fon
Hover @media (hover: hover) ichida :hover 700 fon
Fokus .bron-havola:focus-visible Halqa, 2px offset
Bosilgan .bron-havola:active 800 fon, scale: 0.97

Kerak emas: nofaol (havola yo boshqa sahifaga olib boradi, yo umuman bo'lmaydi), yuklanish (havola sahifani almashtiradi — yuklanishni brauzer ko'rsatadi), bo'sh/xato/muvaffaqiyat (bu ma'lumot bloklari holati). Havola va tugma farqi — Tugmalar tizimi darsida.

2-mashq (o'rta): xato xabarlarini qayta yozing

«Bahor» bron formasining eski xabarlari: "Error!", "Maydon noto'g'ri to'ldirilgan", "Sana xato", "Siz juda ko'p odam yozdingiz". Har birini "Xato xabarlari" bo'limidagi qoidalar bo'yicha qayta yozing.

Ishora: bron formasining maydonlari va chegaralari — ism, telefon, email, odam (≤ 20), sana, vaqt (ish vaqti 7:00–23:00).

Yechim
  1. "Error!" → "Bron yuborilmadi. Internet aloqasini tekshirib, qayta urinib ko'ring." — nima bo'ldi va nima qilish kerak.
  2. "Maydon noto'g'ri to'ldirilgan" → "Email to'liq emas. Namuna: ali@example.com" — qaysi maydon va namuna.
  3. "Sana xato" → "Bugundan oldingi sanani tanlab bo'lmaydi. Bugun yoki keyingi kunni tanlang."
  4. "Siz juda ko'p odam yozdingiz" → "Onlayn bron 20 kishigacha. Kattaroq davra uchun qo'ng'iroq qiling: +998 90 000 00 00." — ayblash yo'q, chegara va muqobil yo'l bor.

Diqqat qiling: to'rttasining ham ikkinchi gapi — harakat. Xabar faqat muammoni emas, chiqish yo'lini ham beradi.

3-mashq (qiyin): Fitts va Hick bilan menyu

«Bahor» telefon versiyasida pastki panel (bottom navigation) qilinmoqchi. Dizayner 7 ta bandni taklif qildi: Bosh sahifa, Menyu, Bron, Aksiyalar, Blog, Aloqa, Biz haqimizda. Ekran eni 360 piksel.

  1. 7 ta bandning har biri necha piksel keng bo'ladi? Material Design tavsiyasiga mosmi?
  2. Hick qonuni bo'yicha nima taklif qilasiz?
  3. Qaysi band pastki panelda eng qulay joyda turishi kerak — Fitts qonuni va bosh barmoq zonasi bo'yicha?

Ishora: "Bosish maydoni" jadvali; "Hick qonuni" bo'limidagi guruhlash g'oyasi.

Yechim
  1. 360 ÷ 7 ≈ 51 piksel. 48 dp tavsiyasidan formal o'tadi, lekin yonma-yon yettita so'z ("Biz haqimizda"!) 51 pikselga sig'maydi — matn juda kichrayadi yoki qirqiladi. Mashhur mobil ilovalarning pastki panellarida odatda 3–5 band bo'ladi.
  2. Bandlarni kamaytirish: pastki panelda 4 ta — Bosh sahifa, Menyu, Bron, "Yana". Qolgan uchtasi (Blog, Aloqa, Biz haqimizda) "Yana" ichida. Aksiyalar — bosh sahifada banner. Har kirishda tanlov 7 tadan 4 taga tushadi.
  3. "Bron" — asosiy harakat. Bir qo'lda ushlaganda o'ng qo'lning bosh barmog'i pastki panelning o'rtasi va o'ng tomoniga oson yetadi. "Bron" ni o'rtaga yoki o'ngdan ikkinchi joyga qo'ying va uni vizual ajrating (Vizual ierarxiya). Chap qo'l bilan ishlatadiganlar ham borligini unutmang — o'rta eng xavfsiz joy.

Pastki panelning CSS tomonini (position: fixed, xavfsiz zona) Navbar va mobil menyu darsida quramiz.

4-mashq: Portfolio qadami — aloqa formasining holatlari

Portfolio'ning aloqa sahifasini holatlar bo'yicha tekshiring va bo'shliqlarni to'ldiring:

  1. Holat jadvalini tuzing: button, maydonlar (input, textarea), radio tugmalar, details[name="savollar"] ning summary si. Har biri uchun: hover, fokus, bosilgan, xato — bormi?
  2. Tugma hover'i yo'q — qo'shing (faqat sichqonchali qurilmada).
  3. Xato faqat rangda — hozir :user-invalid maydonga qizg'ish chegara, yorlig'iga qizg'ish rang beradi. Maydon ostidagi yordam matni (span[id$="-yordam"]) xato bo'lganda ham xato rangida, boshida belgi bilan chiqsin. Belgi ekran o'quvchida "Xato:" deb o'qilsin.
  4. summary — sichqonchada bosiladigandek ko'rinsin (rang va kursor).

Ishora: :has() bilan maydonning ota-p sini topasiz (Mantiqiy pseudo-klasslar). content ning muqobil matni — Pseudo-elementlar. Tugmaning bosilgan holati Micro-interaktsiyalar darsida qo'shilgan edi.

Yechim
  1. Holat jadvali (namunaviy yechimdagi holat):
Element Bor Yo'q
button fokus, bosilgan hover
input, textarea fokus, xato (chegara) xato matni
Radio fokus, xato (legend rangi) —
summary fokus hover, "bosiladi" ishorasi

Bosilgan holat Micro-interaktsiyalar darsida qo'shilgan.

Fokus hamma joyda bor — Yakuniy loyiha darsidagi umumiy :focus-visible qoidasi tufayli.

2–4. komponentlar.css ga:

css
/* Holatlar (UI/UX asoslari darsi) */
@media (hover: hover) {
  button:hover {
    background-color:
      color-mix(in oklch, var(--rang-asosiy), black 10%);
  }

  details[name="savollar"] summary:hover {
    color: var(--rang-asosiy);
    cursor: pointer;
  }
}

/* Xato: rang + belgi + so'z */
p:has(> :user-invalid) span[id$="-yordam"] {
  color: var(--rang-urgu);
}

p:has(> :user-invalid) span[id$="-yordam"]::before {
  content: "⚠ " / "Xato: ";
}
  • Hover — 10% qora: bosilgan holat (15%) undan to'qroq, uchala holat bir-biridan farq qiladi. Hover blokini faylda button:active qoidasidan oldin yozing: og'irligi bir xil, pastdagisi yutadi — aks holda bosish paytida hover rangi bosilgan rangni yopib qo'yadi (Kaskad).
  • p:has(> :user-invalid) — xato maydonning ota-p si. Yordam matni o'sha p ichida: "Javobni shu manzilga yozaman." endi qizg'ish va "" belgili. Matnning o'zi xato sababini to'liq aytmaydi — uni aniqroq qilish (masalan, "Email'ni to'liq yozing: ali@example.com") HTML'da, matnni o'zgartirish bilan qilinadi.
  • cursor: pointer ham hover bloki ichida. Baseline ma'lumotiga ko'ra cursor Baseline emas: telefon brauzerlarida sichqoncha kursori umuman yo'q. Zaxira kerak emas — qoida ishlamagan qurilmada hech narsa buzilmaydi, shunchaki kursor bo'lmaydi.
  • Belgi / "Xato: " muqobil matni bilan: ekran o'quvchi "Xato: Javobni shu manzilga yozaman" deb o'qiydi.
  • Qorong'i rejimda ham ishlaydi: --rang-urgu qorong'ida och g'isht rangiga o'tadi (Qorong'i rejim).

Chrome'da tekshiring: email maydoniga ali@ yozib, Tab bosing — chegara, yorliq va yordam matni birga qizaradi, boshida belgi paydo bo'ladi. Muvaffaqiyat holati (xabar yuborildi) server javobiga bog'liq — uni backend qismida, Express'ga kirish darsidan boshlab qurasiz.

11. Real ishda

  • Dizayn tizimlari har komponent sahifasida holatlar jadvalini beradi: Material'da "States" bo'limi (hover, focus, pressed, dragged, disabled), GitHub Primer'da har tugma variantining holatlari. Figma'da holatlar — komponent variantlari (Figma dasturchi uchun 2).
  • Kod ko'rigi. "Loading holati qani?", "Bo'sh ro'yxatda nima ko'rinadi?", "Klaviatura bilan sinab ko'rdingmi?" — frontend kod ko'rigidagi odatiy savollar.
  • UX tadqiqot. Katta kompaniyalarda UX tadqiqotchilar foydalanuvchi testlarini o'tkazadi. Dasturchi esa evristik baholashni o'zi qila oladi — 10 evristika va shu darsdagi holatlar yetarli boshlanish.
  • Intervyuda so'raladi: "Tugmaning qanday holatlari bor?", "Fitts qonuni nima deydi?", "disabled va aria-disabled farqi?", "Yaxshi xato xabari qanday bo'ladi?".

Xulosa

  • UI — ko'rinish, UX — tajriba; qulay interfeys har payt "nima bo'lyapti?" savoliga javob beradi.
  • To'qqiz holat: oddiy, hover, fokus, bosilgan, nofaol, yuklanmoqda, bo'sh, xato, muvaffaqiyat — har biri uchun CSS selektori bor.
  • Javob: 0.1 s — darhol, 1 s — ishora, 10 s gacha — yuklanish belgisi (Nielsen, 1993).
  • Fitts — katta va yaqin nishon tez bosiladi; Hick — kam tanlov tez qaror; Jakob — tanish naqshlar.
  • Bosish maydoni: talab 24×24 (WCAG 2.5.8), maqsad 44×44; ::before bilan ko'rinishni o'zgartirmasdan kengaytirish.
  • Bo'sh holat va xato xabari: nima bo'ldi, nega, nima qilish kerak — ayblovsiz.

Keyingi dars: CSS'da accessibility: kontrast, fokus va yashirin matn — WCAG kontrast qoidalarini, fokus halqasi dizaynini va ekran o'quvchi uchun yashirin matnni to'liq o'rganamiz.

Manbalar

  • Paul M. Fitts: "The information capacity of the human motor system in controlling the amplitude of movement", Journal of Experimental Psychology, 47(6), 1954
  • I. Scott MacKenzie: "Fitts' law as a research and design tool in human-computer interaction", Human-Computer Interaction, 7(1), 1992
  • W. E. Hick: "On the rate of gain of information", Quarterly Journal of Experimental Psychology, 4(1), 1952; R. Hyman: "Stimulus information as a determinant of reaction time", Journal of Experimental Psychology, 45(3), 1953
  • Jakob Nielsen: "10 Usability Heuristics for User Interface Design" (1994, yangilangan 2024) — nngroup.com; "Response Times: The 3 Important Limits" (1993) — nngroup.com
  • Jon Yablonski: "Laws of UX" — lawsofux.com
  • Donald A. Norman: "The Design of Everyday Things" (1988; qayta ishlangan nashr 2013)
  • W3C: "Understanding SC 2.5.8: Target Size (Minimum)", "Understanding SC 2.5.5: Target Size (Enhanced)" — w3.org/WAI/WCAG22/Understanding
  • Apple: "Human Interface Guidelines — Accessibility"; Material Design: "Accessibility — touch targets"
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
UI/UX asoslari: komponent holatlari, Fitts va Hick qonunlari, qulaylik — IlmHamroh