Lietuvių

Atraskite CSS :has() selektorių, keičiantį tėvinio elemento pasirinkimo taisykles. Sužinokite praktinius pavyzdžius, naršyklių suderinamumą ir pažangias technikas, kurios pakeis jūsų CSS stilių.

CSS :has() Selektoriaus Įvaldymas: Atskleidžiant Tėvinio Elemento Pasirinkimo Galią

Daugelį metų CSS kūrėjai troško paprasto ir efektyvaus būdo pasirinkti tėvinius elementus pagal jų vaikinius elementus. Laukimas baigėsi! :has() pseudo-klasė pagaliau čia, ir ji iš esmės keičia tai, kaip rašome CSS. Šis galingas selektorius leidžia jums nukreipti tėvinį elementą, jei jame yra konkretus vaikinis elementas, atverdamas daugybę galimybių dinamiškam ir adaptyviam stiliavimui.

Kas yra :has() selektorius?

:has() pseudo-klasė yra CSS santykinė pseudo-klasė, kuri kaip argumentą priima selektorių sąrašą. Ji pasirenka elementą, jei bent vienas iš selektorių sąraše atitinka bent vieną elementą tarp to elemento palikuonių. Paprasčiau tariant, ji patikrina, ar tėvinis elementas turi konkretų vaikinį elementą, ir jei taip, tėvinis elementas yra pasirenkamas.

Pagrindinė sintaksė yra:

tėvinis:has(vaikinis) { /* CSS taisyklės */ }

Tai pasirenka tėvinį elementą tik tuo atveju, jei jame yra bent vienas vaikinis elementas.

Kodėl :has() yra toks svarbus?

Tradiciškai CSS galimybės pasirinkti tėvinius elementus pagal jų vaikinius elementus buvo ribotos. Šis apribojimas dažnai reikalavo sudėtingų JavaScript sprendimų ar apeities būdų, norint pasiekti dinamišką stiliavimą. :has() selektorius pašalina šių sudėtingų metodų poreikį, leisdamas rašyti švaresnį, lengviau prižiūrimą ir našesnį CSS kodą.

Štai kodėl :has() keičia žaidimo taisykles:

Pagrindiniai :has() selektoriaus pavyzdžiai

Pradėkime nuo kelių paprastų pavyzdžių, iliustruojančių :has() selektoriaus galią.

1 pavyzdys: Tėvinio Div stiliavimas pagal paveikslėlio buvimą

Tarkime, norite pridėti rėmelį <div> elementui tik tada, jei jame yra <img> elementas:

div:has(img) { border: 2px solid blue; }

Ši CSS taisyklė pritaikys mėlyną rėmelį bet kuriam <div> elementui, kuriame yra bent vienas <img> elementas.

2 pavyzdys: Sąrašo elemento stiliavimas pagal Span buvimą

Tarkime, turite elementų sąrašą ir norite paryškinti sąrašo elementą, jei jame yra <span> elementas su konkrečia klase:

li:has(span.highlight) { background-color: yellow; }

Ši CSS taisyklė pakeis bet kurio <li> elemento, kuriame yra <span> su klase „highlight“, fono spalvą į geltoną.

3 pavyzdys: Formos etiketės stiliavimas pagal įvesties lauko galiojimą

Galite naudoti :has() norėdami stilizuoti formos etiketę pagal tai, ar su ja susijęs įvesties laukas yra galiojantis ar negaliojantis (kartu su :invalid pseudo-klase):

label:has(+ input:invalid) { color: red; font-weight: bold; }

Dėl šios taisyklės etiketė taps raudona ir paryškinta, jei iškart po jos einantis įvesties laukas yra negaliojantis.

Pažangūs :has() selektoriaus naudojimo būdai

:has() selektorius tampa dar galingesnis, kai derinamas su kitais CSS selektoriais ir pseudo-klasėmis. Štai keletas pažangių naudojimo atvejų:

4 pavyzdys: Tuščių elementų pasirinkimas

Galite naudoti :not() pseudo-klasę kartu su :has(), kad pasirinktumėte elementus, kurie *neturi* konkretaus vaikinio elemento. Pavyzdžiui, norėdami stilizuoti div elementus, kuriuose *nėra* paveikslėlių:

div:not(:has(img)) { background-color: #f0f0f0; }

Tai pritaikys šviesiai pilką foną bet kuriam <div> elementui, kuriame nėra <img> elemento.

5 pavyzdys: Sudėtingų maketų kūrimas

:has() selektorius gali būti naudojamas kuriant dinamiškus maketus, atsižvelgiant į konteinerio turinį. Pavyzdžiui, galite keisti tinklelio maketą pagal tai, ar tinklelio langelyje yra tam tikro tipo elementas.

.grid-container { display: grid; grid-template-columns: repeat(3, 1fr); } .grid-item:has(img) { grid-column: span 2; }

Dėl to tinklelio elementas užims du stulpelius, jei jame yra paveikslėlis.

6 pavyzdys: Dinamiškas formų stiliavimas

Galite naudoti :has() norėdami dinamiškai stilizuoti formos elementus pagal jų būseną (pvz., ar jie sufokusuoti, užpildyti ar galiojantys).

.form-group:has(input:focus) { box-shadow: 0 0 5px rgba(0, 0, 255, 0.5); } .form-group:has(input:valid) { border-color: green; } .form-group:has(input:invalid) { border-color: red; }

Tai pridės mėlyną šešėlį, kai įvesties laukas bus sufokusuotas, žalią rėmelį, jei įvestis galiojanti, ir raudoną rėmelį, jei įvestis negaliojanti.

7 pavyzdys: Stiliavimas pagal vaikinių elementų skaičių

Nors :has() tiesiogiai neskaičiuoja vaikinių elementų skaičiaus, galite jį derinti su kitais selektoriais ir CSS savybėmis, kad pasiektumėte panašų efektą. Pavyzdžiui, galite naudoti :only-child norėdami stilizuoti tėvinį elementą, jei jis turi tik vieną tam tikro tipo vaikinį elementą.

div:has(> p:only-child) { background-color: lightgreen; }

Tai stilizuos <div> šviesiai žaliu fonu tik tuo atveju, jei jame yra vienas <p> elementas kaip tiesioginis vaikinis elementas.

Suderinamumas su naršyklėmis ir atsarginiai variantai

2023 metų pabaigoje :has() selektorius puikiai palaikomas moderniose naršyklėse, įskaitant Chrome, Firefox, Safari ir Edge. Tačiau prieš diegiant jį gamybinėje aplinkoje, ypač jei reikia palaikyti senesnes naršykles, labai svarbu patikrinti suderinamumą Can I use svetainėje.

Štai suderinamumo aspektų apžvalga:

Atsarginių variantų pateikimas

Jei reikia palaikyti senesnes naršykles, turėsite pateikti atsarginius variantus. Štai kelios strategijos:

Štai savybių užklausos naudojimo pavyzdys:

.parent { /* Pagrindinis stilius visoms naršyklėms */ border: 1px solid black; } @supports selector(:has(img)) { .parent:has(img) { /* Patobulintas stilius naršyklėms, kurios palaiko :has() */ border: 3px solid blue; } }

Šis kodas pritaikys juodą rėmelį .parent elementui visose naršyklėse. Naršyklėse, kurios palaiko :has(), jis pritaikys mėlyną rėmelį, jei .parent elemente yra paveikslėlis.

Našumo aspektai

Nors :has() suteikia didelių pranašumų, svarbu atsižvelgti į galimą poveikį našumui, ypač kai jis naudojamas plačiai arba su sudėtingais selektoriais. Naršyklėms reikia įvertinti selektorių kiekvienam puslapio elementui, o tai gali tapti skaičiavimams imliu procesu.

Štai keletas patarimų, kaip optimizuoti :has() našumą:

Dažniausios klaidos, kurių reikia vengti

Dirbant su :has() selektoriumi, lengva padaryti klaidų, kurios gali lemti netikėtus rezultatus. Štai keletas dažniausių spąstų, kurių reikia vengti:

Geriausios :has() naudojimo praktikos

Norėdami maksimaliai išnaudoti :has() selektoriaus privalumus ir išvengti galimų problemų, laikykitės šių geriausių praktikų:

Realūs pavyzdžiai ir naudojimo atvejai

Panagrinėkime keletą realių pavyzdžių, kaip :has() selektorius gali būti naudojamas sprendžiant įprastus dizaino iššūkius.

8 pavyzdys: Adaptyvių naršymo meniu kūrimas

Galite naudoti :has() kurdami adaptyvius naršymo meniu, kurie prisitaiko prie skirtingų ekrano dydžių, atsižvelgiant į konkrečių meniu elementų buvimą.

Įsivaizduokite scenarijų, kai norite rodyti skirtingą naršymo meniu priklausomai nuo to, ar vartotojas yra prisijungęs, ar ne. Jei jie prisijungę, galite rodyti profilio ir atsijungimo veiksmus, jei ne - prisijungimo/registracijos parinktis.

nav:has(.user-profile) { /* Stiliai prisijungusiems vartotojams */ } nav:not(:has(.user-profile)) { /* Stiliai neprisijungusiems vartotojams */ }

9 pavyzdys: Kortelių komponentų stiliavimas

:has() selektorius gali būti naudojamas stilizuoti kortelių komponentus pagal jų turinį. Pavyzdžiui, galite pridėti šešėlį kortelei tik tuo atveju, jei joje yra paveikslėlis.

.card:has(img) { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); }

10 pavyzdys: Dinamiškų temų įgyvendinimas

Galite naudoti :has() norėdami įgyvendinti dinamiškas temas, pagrįstas vartotojo nuostatomis ar sistemos nustatymais. Pavyzdžiui, galite pakeisti puslapio fono spalvą priklausomai nuo to, ar vartotojas įjungė tamsųjį režimą.

body:has(.dark-mode) { background-color: #333; color: #fff; }

Šie pavyzdžiai iliustruoja :has() selektoriaus universalumą ir jo gebėjimą spręsti įvairius dizaino iššūkius.

CSS Ateitis: Kas toliau?

:has() selektoriaus įdiegimas žymi svarbų žingsnį į priekį CSS evoliucijoje. Jis suteikia kūrėjams galimybę kurti dinamiškesnius, adaptyvesnius ir lengviau prižiūrimus stilių aprašus, mažiau priklausomus nuo JavaScript. Kadangi naršyklių palaikymas :has() toliau auga, galime tikėtis dar daugiau inovatyvių ir kūrybiškų šio galingo selektoriaus panaudojimo būdų.

Žvelgiant į ateitį, CSS darbo grupė tiria kitas įdomias funkcijas ir patobulinimus, kurie dar labiau išplės CSS galimybes. Tarp jų:

Būdami atnaujinti su naujausiais CSS pokyčiais ir priimdami naujas funkcijas, tokias kaip :has(), kūrėjai gali atskleisti visą CSS potencialą ir sukurti išties išskirtines interneto patirtis.

Išvada

:has() selektorius yra galingas papildymas CSS įrankių rinkiniui, leidžiantis pasirinkti tėvinius elementus ir atveriantis naujas galimybes dinamiškam ir adaptyviam stiliavimui. Nors labai svarbu atsižvelgti į naršyklių suderinamumą ir našumo pasekmes, :has() naudojimo privalumai, siekiant švaresnio, lengviau prižiūrimo ir našesnio CSS kodo, yra neabejotini. Priimkite šį žaidimą keičiantį selektorių ir pakeiskite savo CSS stiliavimą jau šiandien!

Nepamirškite atsižvelgti į prieinamumą ir pateikti atsarginių mechanizmų senesnėms naršyklėms. Laikydamiesi šiame vadove aprašytų geriausių praktikų, galite išnaudoti visą :has() selektoriaus potencialą ir sukurti išties išskirtines interneto patirtis vartotojams visame pasaulyje.