Načrtovanje in razvoj spletnih aplikacij

Psevdorazredi in psevdoelementi v CSS

Psevdorazredi in psevdoelementi omogočajo, da v CSS izberemo element v posebnem stanju ali pa poseben del elementa. Tako lahko določimo slog povezave, ko je nad njo kazalec, slog polja, ko je v fokusu, ali pa posebej oblikujemo prvo črko odstavka.

Psevdorazredi se zapisujejo z enim dvopičjem, psevdoelementi pa v sodobnem CSS praviloma z dvojnim dvopičjem. Pri nekaterih starejših psevdoelementih se zaradi združljivosti še vedno pojavlja tudi starejši zapis z enim dvopičjem, vendar je dvojni zapis preglednejši.

 

Pomni: Psevdorazred izbere element glede na stanje, položaj ali lastnost. Psevdoelement pa izbere določen del elementa ali ustvari navidezni del vsebine.

Osnovna pravila

  • Psevdorazredi se zapisujejo z enim dvopičjem, na primer :hover.
  • Psevdoelementi se v sodobnem CSS zapisujejo z dvojnim dvopičjem, na primer ::before.
  • Psevdorazredi pogosto opisujejo stanje elementa, na primer fokus, aktivnost ali položaj med sorodnimi elementi.
  • Psevdoelementi pogosto omogočajo oblikovanje dela besedila ali dodajanje dekorativne vsebine.
  • Pri uporabi obeh skupin moramo paziti, ali izbiramo element kot celoto ali samo njegov poseben del.

Pozor: Psevdoelement ne pomeni novega HTML elementa. Gre samo za poseben del prikaza ali za navidezno dodano vsebino.

Psevdorazredi

Psevdorazred izbere element glede na njegovo stanje, položaj ali lastnosti. Primer je :hover, ki izbere element, ko je nad njim kazalec.

Sintaksa psevdorazreda:

selektor:psevdorazred {
   lastnost: vrednost;
}

Pogosto uporabljeni psevdorazredi so:

Selektor Primer Opis
:link a:link izbere neobiskane povezave
:visited a:visited izbere obiskane povezave
:hover a:hover izbere element, ko je nad njim kazalec
:active a:active izbere element v trenutku aktivacije
:focus input:focus izbere element, ki je trenutno v fokusu
:focus-visible input:focus-visible izbere element v fokusu takrat, ko je smiselno prikazati poudarjen fokusni obris
:focus-within form:focus-within izbere element, če je v fokusu on sam ali kateri od njegovih potomcev
:first-child p:first-child izbere element, ki je prvi otrok svojega starša
:last-child p:last-child izbere element, ki je zadnji otrok svojega starša
:first-of-type p:first-of-type izbere prvi element dane vrste pri istem staršu
:last-of-type p:last-of-type izbere zadnji element dane vrste pri istem staršu
:nth-child(n) tr:nth-child(2) izbere n-ti otrok svojega starša
:nth-of-type(n) p:nth-of-type(2) izbere n-ti element dane vrste pri istem staršu
:not(selektor) p:not(.poseben) izbere elemente, ki ne ustrezajo podanemu selektorju
:checked input:checked izbere označene potrditvene ali izbirne elemente
:disabled input:disabled izbere onemogočene obrazčne elemente
:enabled input:enabled izbere omogočene obrazčne elemente
:required input:required izbere obvezna polja obrazca
:optional input:optional izbere neobvezna polja obrazca
:valid input:valid izbere polja z veljavno vrednostjo
:invalid input:invalid izbere polja z neveljavno vrednostjo
:target #odsek:target izbere element, na katerega kaže sidro v URL-ju
:root :root izbere korenski element dokumenta, v HTML je to navadno html

Psevdorazred :focus-visible je posebej uporaben pri dostopnosti, ker omogoča, da poudarjen fokus prikažemo takrat, ko ga uporabnik dejansko potrebuje, na primer pri uporabi tipkovnice.

Primer uporabe psevdorazreda :nth-child():

<table>
   <tr>
       <td>1</td>
       <td>1</td>
       <td>1</td>
   </tr>
   <tr>
       <td>2</td>
       <td>2</td>
       <td>2</td>
   </tr>
   <tr>
       <td>3</td>
       <td>3</td>
       <td>3</td>
   </tr>
   <tr>
       <td>4</td>
       <td>4</td>
       <td>4</td>
   </tr>
   <tr>
       <td>5</td>
       <td>5</td>
       <td>5</td>
   </tr>
</table>
table { width: 400px; border-collapse: collapse; }
td { border: 1px solid gray; height: 40px; text-align: center; }
tr:nth-child(even) td { background-color: #FCCC88; }
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5

Fokus in dostopnost

Psevdorazredi :focus, :focus-visible in :focus-within so zelo pomembni pri obrazcih in dostopnosti. :focus izbere element, ki je trenutno v fokusu, :focus-visible pa se uporablja takrat, ko mora biti fokusni poudarek jasno viden. :focus-within izbere nadrejeni element, če je v fokusu on sam ali kateri od njegovih potomcev.

<form class="obrazec">
   <label for="ime">Ime:</label>
   <input id="ime" type="text" placeholder="Vnesi ime" />
</form>
.obrazec {
   padding: 10px;
   border: 1px solid #ccc;
}

input:focus-visible {
   outline: 3px solid orange;
   outline-offset: 2px;
}

.obrazec:focus-within {
   background-color: #FEF3D0;
}

Pozor: Fokusnega obrisa ne odstranjujemo brez ustrezne zamenjave. Uporabnik, ki uporablja tipkovnico, mora jasno videti, kateri element je trenutno izbran.

Strukturni psevdorazredi

Strukturni psevdorazredi izbirajo elemente glede na njihov položaj med sorodnimi elementi. Sem sodijo na primer :first-child, :last-child, :first-of-type, :last-of-type, :nth-child() in :nth-of-type(). Uporabni so, kadar želimo določene elemente izbrati brez dodatnih razredov v HTML kodi.

Pomni: :nth-child(n) upošteva položaj med vsemi otroki istega starša, :nth-of-type(n) pa položaj samo med elementi iste vrste.

Psevdoelementi

Psevdoelement izbere določen del elementa ali pa ustvari navidezni del vsebine, ki ga v HTML kodi ni. Tako lahko oblikujemo prvo črko, prvo vrstico ali dodamo dekorativno vsebino pred oziroma za elementom.

Sintaksa psevdoelementa:

selektor::psevdoelement {
   lastnost: vrednost;
}

Zakaj uporabljamo dvojno dvopičje ::?

V starejših različicah CSS so se psevdoelementi pogosto zapisovali z enim dvopičjem. V sodobnem CSS se za psevdoelemente uporablja dvojno dvopičje ::, da jih lažje ločimo od psevdorazredov.

Najpogosteje uporabljeni psevdoelementi so:

Selektor Primer Opis
::before p::before vstavi vsebino pred element
::after p::after vstavi vsebino za element
::first-letter p::first-letter izbere prvi znak elementa
::first-line p::first-line izbere prvo vrstico elementa
::selection p::selection oblikuje del besedila, ki ga je uporabnik označil

Pozor: Psevdoelementa ::before in ::after uporabljamo predvsem za dekorativno ali pomožno vsebino. Z njima ne nadomeščamo pomembne vsebine, ki bi morala biti zapisana v HTML.

Primer uporabe psevdoelementa ::first-letter:

<div>
  <p>To je odstavek Paragraph 1 v elementu div.</p>
  <p>To je odstavek Paragraph 2 v elementu div.</p>
  <p>To je odstavek Paragraph 3 v elementu div.</p>
</div>
p::first-letter { 
   font-size: 2em;
   font-weight: bold;
}

To je odstavek Paragraph 1 v elementu div.

To je odstavek Paragraph 2 v elementu div.

To je odstavek Paragraph 3 v elementu div.

Primer uporabe psevdoelementov ::before in ::after:

p::before { 
   content: "➜ ";
   padding-right: 6px; 
}
p::after {
   content: " Pregledano!";
   color: red;
   font-style: italic;
}

To je prvi odstavek. Pregledano!

To je drugi odstavek. Pregledano!

Primerjava

Vrsta Izbira Primer
psevdorazred element v določenem stanju ali položaju a:hover, input:focus
psevdoelement poseben del elementa ali navidezna vsebina p::first-letter, p::before

Priporočila

  • Za stanje elementa uporabi psevdorazred, za del elementa pa psevdoelement.
  • Pri interaktivnih elementih ohrani jasno viden fokus.
  • Strukturne psevdorazrede uporabi takrat, ko želiš izbirati elemente po položaju brez dodatnih razredov.
  • ::before in ::after uporabljaj predvsem za dekorativno vsebino.
  • Pri psevdoelementih v sodobni kodi uporabljaj zapis z dvojnim dvopičjem.

Pogoste napake

  • Zamenjevanje psevdorazredov in psevdoelementov.
  • Odstranjevanje fokusnega obrisa brez ustrezne nadomestne rešitve.
  • Napačno razumevanje razlike med :nth-child() in :nth-of-type().
  • Uporaba ::before in ::after za vsebino, ki bi morala biti del HTML dokumenta.