სელექტორები და ფსევდო კლასები

CSS-ის შესავალში განვიხილეთ მარტივი ტიპის სელექტორები, როგორებიცაა:

  • HTML ელემენტი.
  • კლასი.
  • id.

ამ სტატიაში განვიხილავთ უფრო სპეციფიკურ სელექტორებსა და ფსევდო კლასებს, რათა მეტი კონტროლო მოვიპოვოთ სტილიზაციაზე.

კომბინატორები

CSS კომბინატორების გამოყენებით, შეგვიძლია უფრო კონკრეტულად აღვწეროთ ის ელემენტები, რომელთა გასტილვაც გვინდა.

სიის კომბინატორი

სიის კომბინატორი გამოიყენება რამდენიმე ელემენტის ერთნაირად გასასტილად.

ფორმულა:

CSS
selector1,
selector2 {
  /* სტილიზაცია */
}

მაგალითად გვსურს გავსტილოთ სათაურის და პარაგრაფის ტექსტები ერთ ფერში:

HTML
<h6>ყველაზე პატარა სათაური</h6>
<p>პარაგრაფი</p>
CSS
h6,
p {
  color: red;
  font-size: 16px;
}

შთამომავალი კომბინატორი

შთამომავალი კომბინატორი (descendant combinator) გამოიყენება ისეთი ელემენტის მოსახელთებლად, რომელიც მოთავსებულია სხვა ელემენტებში. შთამომავალი კომბინატორისთვის საჭიროა ცარიელი ადგილის გამოყენება.

ფორმულა:

CSS
selector1 selector2 {
  /* სტილიზაცია */
}

მაგალითად გვსურს დავსტილოთ ისეთი ტიპის a ელემენტი, რომელიც მოთავსებულია სიის ელემენტში.

HTML
<ul>
  <li><a href="/index.html">მთავარი</a></li>
  <li><a href="/editor.html">ედიტორი</a></li>
  <li><a href="/guide.html">გზამკლევი</a></li>
</ul>
<a href="/article.html">სტატიის ბმული</a>
CSS
a {
  color: red;
}

ul li a {
  color: green;
}

ასე მივიღეთ 'სტატიის ბმული` წითელ ფერში, ხოლო სიაში მოთავსებული ბმულები მწვანე ფერში. მაშასადამე შთამომავლის კომბინატორი საშუალებას გვაძლევს მოვიხელთოთ ელემენტი მისი მშობელი ელემენტის მიხედვით.

შვილობილი კომბინატორი

შვილობილი კომბინატორი (child combinator) გამოიყენება კონკრეტული შვილობილი ელემენტების დასასტილად. შთამომავალი კომბინატორისგან განსხვავებით, შვილობილი კომბინატორი გულისხმობს უშუალო შვილს.

ფორმულა:

CSS
selector1 > selector2 {
  /* სტილიზაცია */
}

მაგალითად გვსურს ისეთი span-ის დასტილვა, რომელიც მოთავსებულია div-ში

HTML
<div>
  <span>პირველი span</span> <span>მეორე span <span>მესამე span</span></span>
</div>
<span>პირველი სპანი div-ის გარეთ</span>
CSS
div > span {
  color: red;
}
span {
  color: steelblue;
}

იმავე მაგალთში, შთამომავალი კომბინატორის გამოყენებით, მესამე span-იც დაისტილებოდა.

მეზობელი კომბინატორი

მეზობელი კომბინატორი (next sibling combinator) აკავშირებს ორ სელექტორს და იხელთებს მეორე ელემენტს, მხოლოდ იმ შემთხვევაში, თუ იგი მოყვება პირველ ელემენტს და ორივე ეკუთვნის ერთ მშობელ ელემენტს.

ფორმულა:

CSS
former_element + target_element {
  /* სტილიზაცია */
}

მაგალითად, გვსურს დავსტილოთ ისეთი პარაგრაფი, რომელიც მოთავსებულია სურათის შემდეგ:

HTML
<p>რა არის HTML?</p>
<img src="/assets/images/html-css.png" alt="HTML & CSS ლოგო" />
<p>HTML (HyperText Markup Language - ჰიპერტექსტური მარკაპის ენა) არის მარკაპის ენა, რომელიც მუითებებს ბრაუზერს, თუ როგორი სტრუქტურა მისცეს ვებგვერდს. HTML-ში გამოიყენება ელემენტები, რომ ტექსტური კონტენტი შევკრათ ან მოვნიშნოთ (mark up), რათა ამ კონტენტს გარკვეული გარეგნობა, ქცევა ან დანიშნულება შეეძინოს.</p>
<p>HTML შედგება ელემენტებისგან, რომლებიც გამოიყენება კონტენტის სხვადასხვა ნაწილის შესაფუთად, რათა მას მიენიჭოს განსხვავებული გარეგნობა ან დანიშნულება.</p>
CSS
img + p {
  color: orange;
}

მომდევნო კომბინატორი

მომდევნო კობინატორი (susbsequent sibling) აკავშირებს ორ სელექტორს და იხელთებს მეორე ელემენტის ყველა ინსტანციას, რომელიც (უშუალოდ თუ არაუშუალოდ) მოყვება პირველ ელემენტს და გააჩნიათ საერთო მშობელი. მეზობელი კომბინატორისგან განსხვავებით, არ არის სავალდებულო შემდეგი ელემენტი პირდაპირ ეწეროს - შესაძლებელია მათ შორის სხვა ელემენტებიც არსებობდნენ.

ფორმულა:

CSS
former_element ~ target_element {
  /* სტილიზაცია */
}

მაგალითად, გვსურს დავსტილოთ ისეთი პარაგრაფები, რომლებიც მოთავსებულია სურათის შემდეგ:

HTML
<p>პირველი პარაგრაფი</p>
<img src="/assets/images/js.png" alt="JS ლოგო" />
<p>მეორე პარაგრაფი</p>
<p>მესამე პარაგრაფი</p>
<h6>პირველი სათაური</h6>
<p>მეოთხე პარაგრაფი</p>
CSS
img ~ p {
  color: steelblue;
}

img + p {
  /* მხოლოდ პირველი პარაგრაფის დასტილვა, რომელიც მოთავსებულია სურათის შემდეგ */
  text-decoration: underline red;
}

p {
  color: green;
}
შესაძლებელია სხვადასხვა კომბინატორის ერთდროულად გამოყენება, იხილეთ ჭადრაკის დაფის აგების მაგალითი.

ფსევდო კლასები

ფსევდო კლასები CSS-ში საშუალებას გვაძლევს, სტილი დავუმატოთ ელემენტს მათი მდგომარეობისა ან ინტერაქციის საფუძველზე, დამატებითი კლასისა ან იდენტიფიკატორის გარეშე.

სინტაქსი:

CSS
selector:pseudo-class {
  სტილიზაცია
}

მაგალითად, გვსურს შევცვალოთ ღილაკის ტექსტსის ფერი მაუსის გადატარებისას:

HTML
<button>Hover me</button>
CSS
button:hover {
  color: red;
}

ამ მაგალითში გამოვიყენოთ :hover ფსევდო კლასი, რომელიც მოქმედებს მაშინ, როცა მომხარებელი მას გადაატარებს კურსორს (მაუსის მიმთითებელს).

touchscreen-ის შემთხვევაში :hover ფსევდო კლასი პრობლემატურია, ზოგჯერ შეიძლება ის საერთოდ არ გაეშვას, ან გაეშვას ელემენტზე შეხების შემდეგ.

CSS-ს ბევრი ფსევდო კლასი გააჩნია, თუმცა ამ სტატიაში ჩვენ განვიხილავთ ძირითად ნაწილს. იხილეთ სრული სია MDN-ის სტატიაში.

ინტერაქციის ფსევდო კლასები

active

:active ფსევდო კლასი ეშვება, როცა მომხარებელი დააკლიკებს ელემენტს.

HTML
<button>გააგზავნე</button>
CSS
button {
  color: red;
}

button:hover {
  color: blue;
}

button:active {
  color: green;
}

focus

:focus ფსევდო კლასი ეშვება, როცა ელემენტი ფოკუსშია.

HTML
<input placeholder="სახელი" />
CSS
input:focus {
  background-color: antiquewhite;
}

focus-visible

:focus-visible მოქმედებს მხოლოდ იმ ელემენტებზე, რომლებსაც ფოკუსი აქვთ მაგრამ მხოლოდ მაშინ, როცა ეს ფოკუსი კლავიატურით ან დამხმარე ტექნოლოგიებით (არა მაუსით) მიიღეს.

HTML
<button>შეეცადე <kbd>tab</kbd> ღილაკით ფოკუსი</button>
CSS
button:focus-visible {
  outline: none;
  border: 1px solid red;
}

focus-within

:focus-within მოქმედებს მშობელ ელემენტზე თუ მისი რომელიმე შვილობილი ელემენტი ფოკუსშია.

HTML
<form>
  <label for="nameInput">სახელი:</label> <br />
  <input id="nameInput" name="name" placeholder="თქვენი სახელი" /> <br />
  <button>გაგზავნა</button>
</form>
CSS
form {
  width: max-content;
  margin: auto;
  padding: 16px;
  border: 1px solid black;
}

form * {
  margin-top: 15px;
}

form:focus-within {
  border: 1px dashed red;
}

form input:focus,
form button:focus {
  background-color: antiquewhite;
}

form input:focus-visible,
form button:focus-visible {
  outline: none;
  border: 1px solid red;
}

სტრუქტურული ფსევდო კლასები

first-child

:first-child ფსევდო კლასი ამოიღებს პირველ შვილობილ ელემენეტს.

HTML
<p>პირველი პარაგრაფი</p>
<p>მეორე პარაგრაფი</p>
CSS
p:first-child {
  color: red;
}

last-child

:last-child ფსევდო კლასი ამოიღებს ბოლო შვილობილ ელემენეტს.

HTML
<p>პირველი პარაგრაფი</p>
<p>მეორე პარაგრაფი</p>
CSS
p:last-child {
  color: red;
}

nth-child

:nth-child ფსევდო კლასი ამოიღებს ელემენტებს გადაცემული ინდექსიდან გამომდინარე. გადაცემული ინდექსი შეიძლება იყოს დინამიური n მნიშვნელობა ან სტატიკური რიცხვი.

n მნიშვნელობის ჩაწერა შეიძლება მათემატიკური მიმდევრობის სახითიაც.
HTML
<ul>
  <li>პირველი ელემენტი</li>
  <li>მეორე ელემენტი</li>
  <li>მესამე ელემენტი</li>
  <li>მეოთხე ელემენტი</li>
  <li>მეხუთე ელემენტი</li>
  <li>მეექვსე ელემენტი</li>
  <li>მეშვიდე ელემენტი</li>
  <li>მერვე ელემენტი</li>
  <li>მეცხრე ელემენტი</li>
  <li>მეათე ელემენტი</li>
</ul>
CSS
ul li:nth-child(2) {
  text-decoration: underline red;
}

ul li:nth-child(even) {
  color: red;
}

ul li:nth-child(odd) {
  color: orange;
}

ul li:nth-child(3n) {
  color: blue;
}
odd (კენტი) და even (ლუწი) ჩაშენებული მნიშვნელობებია, რომლებიც შეიძლება ასევე წარმოვადგინოთ, როგორც: 2n+1 (კენტი) და 2n (ლუწი).

მაგალითისთვის, ავაგოთ ჭადრაკის დაფა. nth-child-ის გარეშე, მოგვიწევდა თითოეული უჯრისთვის სხვადასხვა კლასების მინიჭება.

HTML
<div class="board">
  <div class="row">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
  </div>
  <!-- მსგავსი 7 row div -->
</div>
CSS
div.board {
  width: 400px;
  height: 400px;
  display: grid;
  grid-template-columns: repeat(8, 1fr);
  grid-template-rows: repeat(8, 1fr);
  border: 1px solid black;
}

div.board div.square {
  width: 100%;
  height: 100%;
  background-color: #ebecd0;
}

div.board div.row:nth-child(odd) div.square:nth-child(even),
div.board div.row:nth-child(even) div.square:nth-child(odd) {
  background-color: #739552;
}
grid არის დალაგების სისტემა, რომელსაც შემდეგ სტატიებში გავარჩევთ.

nth-of-type

:nth-of-type ფსევდო კლასი ამოიღებს ერთნაირი ტიპის ელემენტებს, გადაცემული ინდექსიდან გამომდინარე. იგი ისე გამოიყენება, როგორც nth-child.

HTML
<ul>
  <li>პირველი ელემენტი</li>
  <li>მეორე ელემენტი</li>
  <li>მესამე ელემენტი</li>
  <li>მეოთხე ელემენტი</li>
</ul>
CSS
ul li:nth-of-type(3) {
  color: red;
}

ul li:nth-of-type(even) {
  color: blue;
}

:nth-child უყურებს მთელ სტრუქტურას (ითვლის ყველა ტიპის ელემენტს), ხოლო nth-of-type უყურებს მხოლოდ მინიჭებული ტიპის ელემენტებს (აიგნორებს სხვა ელემენტებს).

განვიხილოთ შემდეგი მაგალითი:

HTML
<ul>
  <li>პირველი ელემენტი</li>
  <p>პარაგრაფი</p>
  <li>მეორე ელემენტი</li>
  <li>მესამე ელემენტი</li>
  <li>მეოთხე ელემენტი</li>
</ul>
CSS
ul li:nth-of-type(2) {
  color: blue;
}

ul li:nth-child(2) {
  color: red;
}

რადგან მეორე ელემენტი იყო პარაგრაფის ტიპის, :nth-child-ის ლოგიკა აღარ გავრცელდა მასზე, ხოლო :nth-of-type ფსევდო კლასმა ამოიღო რიგით მეორე li ელემენტი.

შეჯამება

ამ სტატიაში განვიხილეთ CSS-ის სელექტორების და ფსევდო კლასების გამოყენების ძირითადი პრინციპები, ელემენტების შერჩევა კომბინატორებით, ელემენტის დასტილვა მომხარებლის ინტერაქციის დროს და სხვადასხვა სიტუაციური ფსევდო კლასები.