Selektorlar — attribute, pseudo-class, pseudo-element
Muammodan boshlaylik
Uchta vazifa:
- Tugma ustiga sichqoncha kelganda rangi o'zgarsin
- Ro'yxatning faqat birinchi elementi qalin bo'lsin
- Tashqi saytlarga olib boradigan havolalar yonida ↗ belgisi chiqsin
Bularning hech biri uchun HTML ga yangi class qo'shish shart emas. CSS elementlarni holati, joyi va atributlari bo'yicha ham topa oladi.
Attribute selektorlari
Atribut bo'yicha — kvadrat qavs [ ] ichida:
input[type="email"] {
border-color: #2563eb;
}
[disabled] {
opacity: 0.5;
cursor: not-allowed;
}
| Selektor | Mos keladi |
|---|---|
[href] |
href atributi bor |
[type="email"] |
Qiymati aniq teng |
[href^="https"] |
Qiymati bilan boshlanadi |
[href$=".pdf"] |
Qiymati bilan tugaydi |
[class*="icon"] |
Qiymatda bor (istalgan joyda) |
Darsning boshidagi 3-vazifa:
a[href^="http"]::after {
content: " ↗";
}
a[href$=".pdf"]::before {
content: "📄 ";
}
Tashqi havolalar va PDF fayllar — HTML ga tegmasdan belgilandi. (::after — pastda.)
Formalarda juda qulay:
input[type="text"],
input[type="email"],
input[type="password"] {
padding: 10px 12px;
border: 1px solid #cbd5e1;
border-radius: 6px;
}
Pseudo-class — holat va joy
Pseudo-class — elementning holati yoki o'rni bo'yicha. Bitta ikki nuqta : bilan.
Foydalanuvchi harakatlari
.btn:hover {
background: #1d4ed8; /* sichqoncha ustida */
}
.btn:active {
transform: scale(0.97); /* bosilib turganda */
}
input:focus {
outline: 2px solid #2563eb; /* fokusda (klaviatura yoki bosish) */
}
a:visited {
color: #7c3aed; /* ochilgan havola */
}
Havolalar uchun tartib muhim (keyingisi ustun — 1-dars): :link → :visited → :hover → :active. Eslab qolish: LoVe HAte.
:focus-visible — klaviatura uchun
.btn:focus-visible {
outline: 3px solid #f59e0b;
outline-offset: 2px;
}
:focus — sichqoncha bilan bosganda ham ramka chiqadi (ko'pchilikka yoqmaydi). :focus-visible — faqat klaviatura (Tab) bilan kelganda. Ko'zi ojiz va klaviaturadan foydalanuvchilar uchun ramka zarur — uni hech qachon butunlay olib tashlamang.
[!WARNING]
*:focus { outline: none; }— tez-tez uchraydigan yomon odat. Klaviatura foydalanuvchilari sahifada qayerda ekanini ko'ra olmay qoladi. Ramka xunuk tuyulsa — uni chiroyli qiling, o'chirmang.
Forma holatlari
input:disabled { background: #f1f5f9; }
input:checked + label { font-weight: 600; }
input:required { border-left: 3px solid #f59e0b; }
input:invalid { border-color: #dc2626; }
input:placeholder-shown { font-style: italic; }
Tartib bo'yicha
li:first-child { font-weight: 700; } /* birinchisi — 2-vazifa hal */
li:last-child { border-bottom: none; }
li:nth-child(2) { color: red; } /* ikkinchisi */
tr:nth-child(odd) { background: #f8fafc; } /* toq satrlar — "zebra" jadval */
tr:nth-child(even) { background: #fff; }
li:nth-child(3n) { color: blue; } /* har uchinchisi: 3, 6, 9... */
nth-child formulasi an+b: 2n+1 = toq, 3n = har 3-chi, -n+3 = birinchi uchtasi.
:first-of-type, :nth-of-type() — shu turdagi elementlar orasida sanaydi (aralash elementli konteynerlar uchun).
Mantiqiy pseudo-class lar
.btn:not(.btn-primary) { background: #e2e8f0; } /* asosiy bo'lmagan tugmalar */
:is(h1, h2, h3):hover { color: #2563eb; } /* guruhni qisqa yozish */
.card:has(img) { padding-top: 0; } /* ICHIDA rasm bor kartochka */
:has() — "ota selektor": ichidagi narsaga qarab ota elementni tanlash. Uzoq yillar CSS da imkonsiz edi, endi barcha zamonaviy brauzerlarda ishlaydi.
form:has(input:invalid) .submit-btn {
opacity: 0.5; /* formada xato bo'lsa — tugma xira */
}
Pseudo-element — elementning bir qismi
Pseudo-element — elementning qismi yoki HTML da yo'q qo'shimcha element. Ikki nuqta :: bilan.
::before va ::after
Element ichiga — boshiga yoki oxiriga — CSS orqali "virtual" element qo'shadi:
.required::after {
content: " *";
color: #dc2626;
}
<label class="required">Email</label>
<!-- Ko'rinishi: Email * -->
content— majburiy (bo'sh bo'lsa ham:content: ""), aks holda pseudo-element umuman chizilmaydi- Bezak uchun juda qulay: ikonkalar, chiziqlar, qo'shtirnoqlar, "badge" lar
.badge-new::before {
content: "YANGI";
font-size: 10px;
background: #dc2626;
color: white;
padding: 2px 6px;
border-radius: 4px;
margin-right: 6px;
}
[!INFO]
::before/::afterdagi matnni foydalanuvchi belgilay olmaydi va u qidiruv tizimlari uchun "haqiqiy" kontent emas. Muhim ma'lumotni (narx, ogohlantirish) u yerga yozmang — faqat bezak uchun.
Boshqa pseudo-element lar
p::first-line { font-weight: 600; } /* birinchi qator */
p::first-letter { font-size: 2em; float: left; } /* bosh harf — gazeta uslubi */
::selection { background: #fde68a; } /* belgilangan matn */
input::placeholder { color: #94a3b8; } /* placeholder matni */
li::marker { color: #2563eb; } /* ro'yxat nuqtasi/raqami */
Pseudo-class yoki pseudo-element?
| Pseudo-class | Pseudo-element | |
|---|---|---|
| Yozilishi | :hover (bitta :) |
::before (ikkita ::) |
| Nima tanlaydi | Butun element, ma'lum holatda | Elementning qismi yoki yangi element |
| Misollar | :hover, :focus, :first-child, :not() |
::before, ::after, ::placeholder, ::selection |
Birlashtirish mumkin:
.btn:hover::after {
content: " →"; /* sichqoncha ustida o'q paydo bo'ladi */
}
Nima uchun shunday?
Nima uchun holat va bezaklar uchun CSS da maxsus selektorlar bor — JavaScript bilan class qo'shib-olib tashlash ham mumkin-ku?
Mumkin, lekin bu sekinroq, murakkabroq va ishonchsizroq. :hover va :focus ni brauzer o'zi, eng optimal tarzda kuzatadi — JavaScript yuklanmagan bo'lsa ham, xato bilan to'xtagan bo'lsa ham ishlaydi. :nth-child element qo'shilsa yoki o'chirilsa o'zi qayta hisoblanadi — JavaScript da buni har safar qo'lda qilish kerak edi. ::before esa HTML ni bezak elementlari bilan ifloslantirmaydi. Qoida: ko'rinish va holatga bog'liq narsa — CSS da; ma'lumot va mantiq — JavaScript da. Shunda har biri o'z ishini eng yaxshi qiladi.
Xulosa
Eslab qoling:
- Attribute:
[type="email"],[href^="http"](boshlanadi),[href$=".pdf"](tugaydi),[class*="x"](bor) - Pseudo-class
:— holat va joy::hover,:active,:focus-visible,:checked,:disabled - Tartib:
:first-child,:last-child,:nth-child(odd/2n/3n) - Mantiq:
:not(),:is(),:has()— ota selektor - Pseudo-element
::—::before/::after(contentmajburiy!),::placeholder,::selection,::marker - Fokus ramkasini o'chirmang —
:focus-visiblebilan chiroyli qiling
Keyingi dars
4-dars: Kombinatorlar — descendant, child, sibling