17 β Responsive dizayn¶
β¬ οΈ Oldingi: 16 β CSS Grid Β· π README Β· Keyingi: 18 β Transitions, transforms va animatsiyalar β‘οΈ
Bu bobda: bitta sahifani har qanday ekranga β telefon, planshet, desktop β moslashtirishni o'rganamiz: media query, mobile-first yondashuv, fluid layout va
clamp()bilan moslashuvchan tipografiya.
17.1 Responsive nima va nega kerak?¶
Tasavvur qil: sen chiroyli sahifa yasading va u 27 dyumli monitoringda ajoyib ko'rinadi. Keyin do'sting uni telefonida ochadi β matn mayda, tugmalar bir-biriga yopishgan, sahifani o'qish uchun ikki barmoq bilan kattalashtirish kerak. Tanish holat, to'g'rimi?
Responsive dizayn (responsive design β "javob beradigan dizayn") β bu bitta sahifaning o'zi ekran o'lchamiga qarab o'zgarishi. Telefonda bir ustun, planshetda ikki ustun, desktopda uch ustun β lekin HTML bitta, sahifa ham bitta.
Nega bu shunchalik muhim?
- Foydalanuvchilarning yarmidan ko'pi telefon orqali kiradi. Agar saytingiz telefonda noqulay bo'lsa, ular ketadi.
- Bitta kod β barcha qurilmalar. "Mobil versiya" va "desktop versiya" deb ikki alohida sayt qilish β eskirgan, qimmat va xatolarga to'la usul.
- Google mobil-do'stlikni reyting omili sifatida ko'radi. Yomon moslashgan sayt qidiruvda pastroq turadi.
π Atamalar: viewport β brauzer oynasining sahifa ko'rinadigan qismi (ko'rinish maydoni). breakpoint β layout o'zgaradigan ekran eni (sindirish nuqtasi). fluid β qattiq piksel o'rniga foiz/nisbat bilan "oqadigan" o'lcham.
Quyidagi diagramma uchta asosiy qurilma sinfini va tipik breakpoint chiziqlarini ko'rsatadi:
17.2 Viewport meta tegi β birinchi qadam (eslatma)¶
7-bobda viewport meta tegini ko'rgan eding. Bu β responsive dizaynning poydevori, shuning uchun qisqacha eslatib o'tamiz: usiz hech qanday media query ishlamaydi.
Bu nima qiladi? Telefon brauzerlari tarixiy sabablarga ko'ra sahifani 980px keng deb hisoblab, keyin uni kichraytirib ko'rsatadi (shuning uchun moslashmagan saytlar telefonda kichkina ko'rinadi). width=device-width brauzerga: "sahifa eni qurilmaning haqiqiy eni bilan teng bo'lsin" deb aytadi. initial-scale=1.0 esa boshlang'ich kattalashtirishni 1:1 qilib qo'yadi.
β οΈ Eng keng tarqalgan xato: responsive CSS yozasiz, lekin viewport tegini <head> ga qo'shishni unutasiz. Natijada media query'lar telefonda umuman ishlamaydi, chunki brauzer eni hali ham 980px deb o'ylaydi. Yangi sahifa boshlaganda bu teg birinchi yoziladigan narsalardan bo'lsin.
17.3 Media query β sintaksis¶
Media query (media so'rovi) β bu CSS'ga "agar ekran shu shartga mos kelsa, mana bu stillarni qo'lla" deyish usuli. Sintaksis @media bilan boshlanadi:
/* Asosiy stil β barcha ekranlarga */
.menu {
display: block;
}
/* Faqat eni 768px va undan KATTA ekranlarda */
@media (min-width: 768px) {
.menu {
display: flex;
}
}
Ichidagi qoidalar faqat shart bajarilganda kuchga kiradi. Yuqorida: .menu odatda block (har element alohida qatorda), lekin ekran 768px dan keng bo'lsa β flex (yonma-yon).
Asosiy shartlar¶
| Shart | Ma'nosi |
|---|---|
(min-width: 768px) |
eni 768px va undan katta bo'lsa |
(max-width: 767px) |
eni 767px va undan kichik bo'lsa |
screen |
media turi: ekran (chop etish emas) |
and, or va vergul¶
Shartlarni birlashtirish mumkin:
/* HAM min, HAM max β ya'ni 768px dan 1023px gacha bo'lgan oraliq */
@media (min-width: 768px) and (max-width: 1023px) {
.karta { background: #f8fafc; }
}
/* YOKI β vergul "or" vazifasini bajaradi */
@media (max-width: 600px), (orientation: portrait) {
.panel { display: none; }
}
andβ ikkala shart ham bajarilishi kerak.- Vergul (
,) β or (yoki): shartlardan bittasi bajarilsa kifoya. screen and (min-width: 768px)β media turini ham qo'shsangiz bo'ladi, lekin amaldascreenni ko'pincha tushirib qoldiramiz, chunki standart shart shunday ham yetarli.
π‘ Eslatma: zamonaviy CSS yangi sintaksisni ham qo'llab-quvvatlaydi: @media (width >= 768px). Bu (min-width: 768px) bilan bir xil, faqat o'qish osonroq. Brauzer qo'llab-quvvatlashini tekshirib, bemalol foydalansangiz bo'ladi.
17.4 Mobile-first yondashuv β nega aynan shunday?¶
Endi muhim falsafiy savol: media query'larni qaysi tomondan yozish kerak β kichikdan kattagami yoki kattadan kichikkami? Ikki yo'l bor.
Desktop-first (kattadan kichikka): asosiy stilni desktop uchun yozasiz, keyin max-width bilan kichik ekranlar uchun ustidan o'zgartirasiz.
Mobile-first (kichikdan kattaga): asosiy stilni eng sodda β mobil β holatga yozasiz, keyin min-width bilan kattaroq ekranlarga murakkablik qo'shasiz.
Zamonaviy amaliyot β mobile-first. Nega?
- Sodda asos. Mobil layout odatda eng oddiy (bir ustun, vertikal). Murakkab narsani qo'shish, murakkabni soddalashtirishdan oson.
- Tezlik. Eski/zaif telefonlar
max-widthichidagi murakkab desktop qoidalarini baribir o'qib, keyin bekor qiladi. Mobile-first'da telefon faqat o'ziga kerakli sodda qoidalarni oladi. - Mantiqiy o'sish. "Ekran kattalashdi β endi nima qo'shaman?" deb fikrlash, "ekran kichrayd β nimani olib tashlayman?" dan tabiiyroq.
Mobile-first ko'rinishi:
/* ASOS: mobil (media query'siz) */
.grid {
display: grid;
grid-template-columns: 1fr; /* bitta ustun */
gap: 16px;
}
/* Planshet va undan katta: ikki ustun */
@media (min-width: 768px) {
.grid {
grid-template-columns: 1fr 1fr;
}
}
/* Desktop: uch ustun */
@media (min-width: 1024px) {
.grid {
grid-template-columns: 1fr 1fr 1fr;
}
}
Natija: telefonda kartalar tik bir ustun bo'lib chiqadi, planshetda ikkitadan, desktopda uchtadan. Diqqat qil β asos qoidasi eng sodda, har breakpoint faqat o'zgargan narsani qo'shadi.
17.5 Tipik breakpoint'lar¶
Qaysi enlarda breakpoint qo'yish kerak? Sehrli raqamlar yo'q, lekin amaliyotda quyidagilar keng tarqalgan (ko'p framework'lar shularga yaqin):
| Breakpoint | Tipik qurilma |
|---|---|
480px |
katta telefon |
640px |
telefon / kichik planshet chegarasi |
768px |
planshet (portret) |
1024px |
planshet (landshaft) / kichik laptop |
1280px |
desktop |
π‘ Eng yaxshi maslahat β tarkibga qarab breakpoint qo'ying, qurilmaga emas. Brauzer oynasini asta torting: layout qayerda xunuklashadi (matn juda cho'zilib ketdi, kartalar siqildi), o'sha joyda breakpoint qo'ying. Aniq telefon modeliga moslashishga urinish behuda β har yili yangi o'lchamlar chiqadi.
β οΈ Xato: o'nlab breakpoint qo'yib, har biriga alohida stil yozish. Bu kodni boshqarib bo'lmas holga keltiradi. Odatda 2β3 ta yaxshi tanlangan breakpoint yetarli. Eng yaxshi responsive layout β breakpoint kam talab qiladigan layout (keyingi bo'limlarda buni qanday qilishni ko'ramiz).
17.6 Fluid layout β "oqadigan" tartib¶
Media query β bu sakrash: 767px da bir ko'rinish, 768px da boshqasi. Lekin orada-chi? Bu yerda fluid layout yordamga keladi: qattiq piksel o'rniga nisbiy o'lchamlar ishlatamiz, shunda tartib har enga silliq moslashadi.
Foiz (%) bilan¶
.container {
width: 90%; /* ota elementning 90% i β har enda mos */
max-width: 1200px; /* lekin 1200px dan oshmasin */
margin: 0 auto; /* markazga */
}
width: 90% β eni har doim ota elementning 90% i bo'ladi, ya'ni ekran bilan birga oqadi. max-width: 1200px esa juda keng monitorlarda matn cheksiz cho'zilib ketishining oldini oladi.
π Bu naqsh β width: 90% + max-width + margin: 0 auto β eng ko'p ishlatiladigan "konteyner" retsepti. Yodlab oling.
Flexbox va Grid bilan (eng kuchli usul)¶
15- va 16-boblarda o'rgangan flexbox/grid o'zi tabiatan fluid. fr birligi va flex xossasi joyni nisbatda taqsimlaydi:
/* Grid: ustunlar joyga avtomatik moslashadi, media query'siz! */
.galereya {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 16px;
}
Bu sehrli qatorni ochib beraylik:
minmax(200px, 1fr)β har ustun kamida 200px, joy bo'lsa 1fr gacha cho'ziladi.auto-fillβ joyga qancha ustun sig'sa, shunchasini yaratadi.
Natija: ekran kengaysa, ustunlar soni o'zi ko'payadi; torayganda β kamayadi. Bitta ham @media yozmadik! Aynan shu β modern responsive'ning go'zalligi: layoutni o'zi moslashuvchan qil, breakpoint'larga kamroq tayan.
17.7 Fluid tipografiya: clamp(), min(), max()¶
Tartib oqadi β yaxshi. Ammo shrift o'lchami-chi? Telefonda 32px sarlavha juda katta, desktopda 18px sarlavha juda kichik. Eski yechim: har breakpointda font-size ni qo'lda o'zgartirish. Zamonaviy yechim β clamp().
clamp() uchta qiymat oladi:
- MIN β eng kichik ruxsat etilgan qiymat (pol).
- AFZAL β odatda ekranga bog'liq qiymat (masalan
2.5vw), u o'sib boradi. - MAX β eng katta ruxsat etilgan qiymat (shift).
Brauzer AFZAL qiymatni hisoblaydi, lekin uni MIN dan past, MAX dan baland chiqishiga yo'l qo'ymaydi.
Natija: kichik telefonda sarlavha 1.5rem (24px), ekran kengaygan sari 5vw bilan silliq o'sadi, katta ekranda 3rem (48px) da to'xtaydi. Bitta ham media query yo'q.
π vw nima? vw (viewport width) β viewport enining 1% i. 5vw = ekran enining 5% i. Shuning uchun u ekran bilan birga o'sadi.
min() va max() β yakka tartibda ham foydali¶
clamp() ning yarim aka-ukalari:
/* Kenglik: 90% YOKI 600px β qaysi KICHIK bo'lsa */
.matn { width: min(90%, 600px); }
/* Padding: 16px YOKI 3vw β qaysi KATTA bo'lsa */
.qism { padding: max(16px, 3vw); }
min(a, b)β ikkisidan kichigini tanlaydi (shift vazifasi: "bundan kattalashmasin").max(a, b)β ikkisidan kattasini tanlaydi (pol vazifasi: "bundan kichiklashmasin").
π‘ Aslida clamp(A, B, C) aynan max(A, min(B, C)) bilan teng β clamp() shunchaki uni qisqaroq yozish usuli.
β οΈ Xato: font-size'da faqat vw ishlatish (font-size: 5vw). Juda kichik ekranda matn o'qib bo'lmas darajada mayda, juda katta ekranda esa ulkan bo'ladi. Doim clamp() bilan chegaralang.
17.8 Responsive rasmlar β qisqacha eslatma¶
3-bobda batafsil ko'rgan edik, shuning uchun bu yerda faqat eslatib o'tamiz: responsive sahifada rasmlar ham ekranga moslashishi kerak.
Eng asosiy qadam β har rasm konteyneridan oshib ketmasin:
max-width: 100% β rasm hech qachon ota elementidan keng bo'lmaydi. height: auto β nisbat saqlanadi (rasm cho'zilmaydi).
Tezlik uchun esa har qurilmaga mos o'lchamdagi faylni yuborish kerak β bu srcset va <picture> bilan qilinadi (3-bobni eslang):
<img src="rasm-800.jpg"
srcset="rasm-400.jpg 400w, rasm-800.jpg 800w, rasm-1600.jpg 1600w"
sizes="(max-width: 600px) 100vw, 50vw"
alt="Tog' manzarasi">
Brauzer ekran eni va sizes ga qarab srcset dan eng mos faylni tanlaydi β telefonga kichik fayl, desktopga katta fayl. Bu trafikni tejaydi va sahifani tezlashtiradi.
17.9 Container queries β element o'lchamiga qarash¶
Mana, responsive'ning eng yangi va kuchli quroli. Media query'ning bitta cheklovi bor: u doim butun viewport o'lchamiga qaraydi. Lekin ko'pincha bizga kerakli narsa β komponentning o'zi joylashgan joyning o'lchami.
Misol: bir "mahsulot kartasi" komponenti bor. U keng asosiy hududda turganda β gorizontal (rasm chapda, matn o'ngda). Tor yon ustunda turganda β vertikal (rasm tepada). Media query bu yerda ojiz: viewport bir xil bo'lsa-da, kartaning eni ikki joyda har xil!
Container query aynan shu muammoni hal qiladi: u stilni viewport'ga emas, ota konteyner o'lchamiga qarab qo'llaydi.
Ikki qadamda ishlaydi. Avval ota elementni "konteyner" deb e'lon qilamiz:
Keyin @container bilan farzandni konteyner eniga qarab o'zgartiramiz:
/* Asos: vertikal (rasm tepada) */
.karta {
display: grid;
grid-template-columns: 1fr;
}
/* Konteyner eni 400px dan oshsa: gorizontal */
@container (min-width: 400px) {
.karta {
grid-template-columns: 150px 1fr; /* rasm | matn */
}
}
Natija: bitta .karta komponenti keng joyda gorizontal, tor joyda vertikal ko'rinadi β viewport emas, o'z konteyneri qancha keng ekaniga qarab. Endi shu kartani saytning istalgan joyiga qo'ysangiz, u o'zini to'g'ri tutadi.
π‘ Nega bu o'yinni o'zgartiradi? Komponentlar endi chinakam mustaqil bo'ladi. Avval har komponent "men sahifaning qayerida turibman?" deb bosh qotirardi; endi u faqat "menga qancha joy berildi?" deb so'raydi. Bu β qayta ishlatiladigan komponentlar uchun ideal.
π Container query'lar 2023 yildan barcha yirik brauzerlarda qo'llab-quvvatlanadi. Eski brauzerlarni qo'llab-quvvatlash zarur bo'lsa, media query'ni zaxira sifatida qoldiring.
17.10 Foydalanuvchi afzalliklari: prefers-color-scheme va prefers-reduced-motion¶
Media query faqat ekran o'lchamini emas, foydalanuvchining tizim sozlamalarini ham o'qiy oladi. Ikkitasi ayniqsa muhim.
prefers-color-scheme β qorong'i/yorug' rejim¶
Foydalanuvchi telefonini "tungi rejim"ga qo'ygan bo'lsa, saytingiz ham unga moslashishi mumkin:
/* Asos: yorug' rejim */
body {
background: #ffffff;
color: #1e293b;
}
/* Foydalanuvchi qorong'i rejimni tanlagan bo'lsa */
@media (prefers-color-scheme: dark) {
body {
background: #1e293b;
color: #f8fafc;
}
}
Natija: tizimi qorong'i rejimda bo'lgan foydalanuvchi saytni ham qorong'i ko'radi β ko'zga qulay, batareyani tejaydi.
prefers-reduced-motion β kamroq harakat¶
Ba'zi odamlar uchun ekrandagi animatsiyalar bosh aylanishi yoki ko'ngil aynishiga sabab bo'ladi (vestibulyar buzilish). Ular tizimida "harakatni kamaytir" ni yoqishadi. Bunga hurmat ko'rsatamiz:
/* Asos: silliq animatsiya */
.tugma {
transition: transform 0.3s;
}
/* Foydalanuvchi kamroq harakat so'ragan bo'lsa: animatsiyani o'chir */
@media (prefers-reduced-motion: reduce) {
.tugma {
transition: none;
}
}
π‘ Bu β accessibility (qulaylik) masalasi. Responsive dizayn faqat ekran o'lchami emas β bu har bir foydalanuvchiga uning ehtiyojiga ko'ra moslashishdir.
17.11 Amaliy: bitta layoutni mobil va desktopga moslash¶
Endi o'rgangan hamma narsani birlashtirib, to'liq, ishlaydigan responsive sahifa quramiz. Maqsad: mobil-first, fluid, clamp() bilan tipografiya.
<!DOCTYPE html>
<html lang="uz">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Responsive sahifa</title>
</head>
<body>
<header class="sayt-bosh">
<div class="logo">Mening Saytim</div>
<nav class="menu">
<a href="#">Bosh</a>
<a href="#">Mahsulotlar</a>
<a href="#">Aloqa</a>
</nav>
</header>
<main class="grid">
<article class="karta">Karta 1</article>
<article class="karta">Karta 2</article>
<article class="karta">Karta 3</article>
</main>
</body>
</html>
/* ===== ASOS: mobil (media query'siz) ===== */
* { box-sizing: border-box; margin: 0; }
body {
font-family: system-ui, sans-serif;
color: #1e293b;
}
/* Sarlavha tipografiyasi β fluid, clamp bilan */
.logo {
font-size: clamp(1.25rem, 4vw, 2rem);
font-weight: bold;
}
/* Header: mobilda tik (logo tepada, menyu pastda) */
.sayt-bosh {
display: flex;
flex-direction: column;
gap: 8px;
padding: max(16px, 3vw);
background: #f8fafc;
}
.menu {
display: flex;
flex-direction: column;
gap: 8px;
}
/* Konteyner: fluid, lekin chegaralangan */
.grid {
width: min(92%, 1100px);
margin: 24px auto;
display: grid;
grid-template-columns: 1fr; /* mobilda 1 ustun */
gap: 16px;
}
.karta {
padding: 24px;
background: #e2e8f0;
border-radius: 8px;
}
/* ===== PLANSHET: 768px+ ===== */
@media (min-width: 768px) {
.sayt-bosh {
flex-direction: row; /* logo va menyu yonma-yon */
justify-content: space-between;
align-items: center;
}
.menu { flex-direction: row; } /* menyu gorizontal */
.grid { grid-template-columns: 1fr 1fr; } /* 2 ustun */
}
/* ===== DESKTOP: 1024px+ ===== */
@media (min-width: 1024px) {
.grid { grid-template-columns: 1fr 1fr 1fr; } /* 3 ustun */
}
Natija va tahlil:
- Telefonda: logo va menyu tik joylashadi, kartalar bir ustun bo'lib chiqadi. Sarlavha
clamp()tufayli mos o'lchamda. - Planshetda (768px+): header gorizontal bo'ladi (
flex-direction: row), menyu yonma-yon, kartalar ikki ustun. - Desktopda (1024px+): kartalar uch ustun.
- Hamma yerda: konteyner
min(92%, 1100px)bilan oqadi, lekin 1100px dan oshmaydi.
Diqqat qil β asos stil butunlay mobil uchun yozilgan va media query'siz ham mukammal ishlaydi. Har breakpoint faqat kerakli o'zgarishni qo'shadi. Aynan shu β mobile-first'ning amaliy ko'rinishi.
π‘ Sinab ko'rish: bu kodni faylga saqlang, brauzerda oching va oyna chetidan asta torting. Layoutning har breakpointda o'zgarishini o'z ko'zingiz bilan ko'rasiz. DevTools'dagi "qurilma rejimi" (device mode) ham buning uchun ajoyib vosita.
Mashqlar¶
1-mashq. Quyidagi sahifa telefonda buzilib ko'rinadi β matn mayda, gorizontal scroll chiqadi. <head> ga bitta qator qo'shib tuzating.
Yechim
Viewport meta tegi yetishmayapti. Usiz brauzer sahifani 980px deb hisoblaydi:
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mening saytim</title>
</head>
Bu β responsive dizaynning birinchi va eng muhim qadami. Usiz hech qanday media query ishlamaydi.
2-mashq. .qator klassiga shunday CSS yozing: ekran 600px dan keng bo'lsa, display: flex bo'lsin; aks holda (sukut bo'yicha) display: block qolsin. Mobile-first usulda yozing.
Yechim
/* Asos (mobil): block */
.qator {
display: block;
}
/* 600px+ : flex */
@media (min-width: 600px) {
.qator {
display: flex;
}
}
Asos qoidasi sodda holatga, media query esa kattaroq ekranga murakkablik qo'shadi β bu mobile-first naqshining mohiyati.
3-mashq. h1 sarlavhasiga fluid tipografiya bering: hech qachon 20px (1.25rem) dan kichik va 40px (2.5rem) dan katta bo'lmasin, orada 6vw bo'yicha o'ssin.
Yechim
Tartib: clamp(MIN, AFZAL, MAX). MIN β pol, MAX β shift, o'rtadagi 6vw β silliq o'sib boruvchi afzal qiymat. Bironta ham media query kerak emas.
4-mashq. Grid galereya yarating: ustunlar kamida 220px, joy bo'lsa avtomatik ko'paysin, oralig'i 20px. Bitta ham media query ishlatmang.
Yechim
.galereya {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 20px;
}
auto-fill + minmax(220px, 1fr) kombinatsiyasi joyga qarab ustunlar sonini o'zi hisoblaydi β bu media query'siz responsive layoutning klassik usuli.
5-mashq. Konteyner shunday bo'lsin: eni ota elementning 90% i, lekin hech qachon 800px dan oshmasin, gorizontal markazda tursin. Avval ikki xossa bilan, keyin min() bilan bitta qatorda yozing.
Yechim
An'anaviy usul:
min() bilan en bitta qatorda:
min(90%, 800px) β ikkisidan kichigini tanlaydi: tor ekranda 90% (kichik), keng ekranda 800px (kichik). Natija width + max-width bilan bir xil.
6-mashq. Foydalanuvchi tizimida qorong'i rejimni tanlagan bo'lsa, body foni #1e293b, matn rangi #f8fafc bo'lsin. Yorug' rejim asos bo'lib qolsin.
Yechim
/* Asos: yorug' rejim */
body {
background: #ffffff;
color: #1e293b;
}
/* Qorong'i rejim */
@media (prefers-color-scheme: dark) {
body {
background: #1e293b;
color: #f8fafc;
}
}
prefers-color-scheme foydalanuvchining tizim sozlamasini o'qiydi β ekran o'lchamiga aloqasi yo'q, lekin u ham media query orqali ishlaydi.
7-mashq (qiyinroq). .karta-joyi ni eni kuzatiladigan konteynerga aylantiring, so'ng ichidagi .karta shu konteyner eni 350px dan oshganda ikki ustunli grid (120px 1fr) bo'lsin. Boshqa hollarda bir ustunli qolsin.
Yechim
/* 1) Otani konteyner deb e'lon qilamiz */
.karta-joyi {
container-type: inline-size;
}
/* 2) Asos: bir ustun */
.karta {
display: grid;
grid-template-columns: 1fr;
}
/* 3) Konteyner 350px dan oshsa: ikki ustun */
@container (min-width: 350px) {
.karta {
grid-template-columns: 120px 1fr;
}
}
E'tibor bering: @container viewport'ga emas, .karta-joyi ning eniga qaraydi. Shuning uchun bu kartani saytning keng yoki tor istalgan joyiga qo'ysangiz, u o'zini o'sha joyga moslab tutadi.
8-mashq (debugging). Quyidagi media query telefonda umuman ishlamayapti, garchi CSS sintaksisi to'g'ri bo'lsa ham. HTML faylda nima yetishmayotganini toping.
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<link rel="stylesheet" href="style.css">
</head>
...
Yechim
CSS to'g'ri β muammo HTML'da: viewport meta tegi yo'q. Usiz telefon brauzeri sahifa enini 980px deb hisoblaydi, shuning uchun max-width: 600px sharti hech qachon bajarilmaydi (980 > 600).
Tuzatish β <head> ga qo'shish:
Bu eng tez-tez uchraydigan responsive xato: CSS to'g'ri yozilgan, lekin viewport tegi unutilgan. Media query "ishlamayotgani"da birinchi shuni tekshiring.
β¬ οΈ Oldingi: 16 β CSS Grid Β· π README Β· Keyingi: 18 β Transitions, transforms va animatsiyalar β‘οΈ