სელექტორები და ფსევდო კლასები
CSS-ის შესავალში განვიხილეთ მარტივი ტიპის სელექტორები, როგორებიცაა:
- HTML ელემენტი.
კლასი
.id
.
ამ სტატიაში განვიხილავთ უფრო სპეციფიკურ სელექტორებსა და ფსევდო კლასებს, რათა მეტი კონტროლო მოვიპოვოთ სტილიზაციაზე.
კომბინატორები
CSS კომბინატორების გამოყენებით, შეგვიძლია უფრო კონკრეტულად აღვწეროთ ის ელემენტები, რომელთა გასტილვაც გვინდა.
სიის კომბინატორი
სიის კომბინატორი გამოიყენება რამდენიმე ელემენტის ერთნაირად გასასტილად.
ფორმულა:
selector1,
selector2 {
/* სტილიზაცია */
}
მაგალითად გვსურს გავსტილოთ სათაურის და პარაგრაფის ტექსტები ერთ ფერში:
<h6>ყველაზე პატარა სათაური</h6>
<p>პარაგრაფი</p>
h6,
p {
color: red;
font-size: 16px;
}
შთამომავალი კომბინატორი
შთამომავალი კომბინატორი (descendant combinator) გამოიყენება ისეთი ელემენტის მოსახელთებლად, რომელიც მოთავსებულია სხვა ელემენტებში. შთამომავალი კომბინატორისთვის საჭიროა ცარიელი ადგილის გამოყენება.
ფორმულა:
selector1 selector2 {
/* სტილიზაცია */
}
მაგალითად გვსურს დავსტილოთ ისეთი ტიპის a
ელემენტი, რომელიც მოთავსებულია სიის ელემენტში.
<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>
a {
color: red;
}
ul li a {
color: green;
}
ასე მივიღეთ 'სტატიის ბმული` წითელ ფერში, ხოლო სიაში მოთავსებული ბმულები მწვანე ფერში. მაშასადამე შთამომავლის კომბინატორი საშუალებას გვაძლევს მოვიხელთოთ ელემენტი მისი მშობელი ელემენტის მიხედვით.
შვილობილი კომბინატორი
შვილობილი კომბინატორი (child combinator) გამოიყენება კონკრეტული შვილობილი ელემენტების დასასტილად. შთამომავალი კომბინატორისგან განსხვავებით, შვილობილი კომბინატორი გულისხმობს უშუალო შვილს.
ფორმულა:
selector1 > selector2 {
/* სტილიზაცია */
}
მაგალითად გვსურს ისეთი span
-ის დასტილვა, რომელიც მოთავსებულია div
-ში
<div>
<span>პირველი span</span> <span>მეორე span <span>მესამე span</span></span>
</div>
<span>პირველი სპანი div-ის გარეთ</span>
div > span {
color: red;
}
span {
color: steelblue;
}
იმავე მაგალთში, შთამომავალი კომბინატორის გამოყენებით, მესამე span
-იც დაისტილებოდა.
მეზობელი კომბინატორი
მეზობელი კომბინატორი (next sibling combinator) აკავშირებს ორ სელექტორს და იხელთებს მეორე ელემენტს, მხოლოდ იმ შემთხვევაში, თუ იგი მოყვება პირველ ელემენტს და ორივე ეკუთვნის ერთ მშობელ ელემენტს.
ფორმულა:
former_element + target_element {
/* სტილიზაცია */
}
მაგალითად, გვსურს დავსტილოთ ისეთი პარაგრაფი, რომელიც მოთავსებულია სურათის შემდეგ:
<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>
img + p {
color: orange;
}
მომდევნო კომბინატორი
მომდევნო კობინატორი (susbsequent sibling) აკავშირებს ორ სელექტორს და იხელთებს მეორე ელემენტის ყველა ინსტანციას, რომელიც (უშუალოდ თუ არაუშუალოდ) მოყვება პირველ ელემენტს და გააჩნიათ საერთო მშობელი. მეზობელი კომბინატორისგან განსხვავებით, არ არის სავალდებულო შემდეგი ელემენტი პირდაპირ ეწეროს - შესაძლებელია მათ შორის სხვა ელემენტებიც არსებობდნენ.
ფორმულა:
former_element ~ target_element {
/* სტილიზაცია */
}
მაგალითად, გვსურს დავსტილოთ ისეთი პარაგრაფები, რომლებიც მოთავსებულია სურათის შემდეგ:
<p>პირველი პარაგრაფი</p>
<img src="/assets/images/js.png" alt="JS ლოგო" />
<p>მეორე პარაგრაფი</p>
<p>მესამე პარაგრაფი</p>
<h6>პირველი სათაური</h6>
<p>მეოთხე პარაგრაფი</p>
img ~ p {
color: steelblue;
}
img + p {
/* მხოლოდ პირველი პარაგრაფის დასტილვა, რომელიც მოთავსებულია სურათის შემდეგ */
text-decoration: underline red;
}
p {
color: green;
}
ფსევდო კლასები
ფსევდო კლასები CSS-ში საშუალებას გვაძლევს, სტილი დავუმატოთ ელემენტს მათი მდგომარეობისა ან ინტერაქციის საფუძველზე, დამატებითი კლასისა ან იდენტიფიკატორის გარეშე.
სინტაქსი:
selector:pseudo-class {
სტილიზაცია
}
მაგალითად, გვსურს შევცვალოთ ღილაკის ტექსტსის ფერი მაუსის გადატარებისას:
<button>Hover me</button>
button:hover {
color: red;
}
ამ მაგალითში გამოვიყენოთ :hover
ფსევდო კლასი,
რომელიც მოქმედებს მაშინ, როცა მომხარებელი მას გადაატარებს კურსორს (მაუსის მიმთითებელს).
:hover
ფსევდო კლასი პრობლემატურია, ზოგჯერ შეიძლება ის საერთოდ არ გაეშვას,
ან გაეშვას ელემენტზე შეხების შემდეგ.CSS-ს ბევრი ფსევდო კლასი გააჩნია, თუმცა ამ სტატიაში ჩვენ განვიხილავთ ძირითად ნაწილს. იხილეთ სრული სია MDN-ის სტატიაში.
ინტერაქციის ფსევდო კლასები
active
:active
ფსევდო კლასი ეშვება, როცა მომხარებელი
დააკლიკებს ელემენტს.
<button>გააგზავნე</button>
button {
color: red;
}
button:hover {
color: blue;
}
button:active {
color: green;
}
focus
:focus
ფსევდო კლასი ეშვება, როცა ელემენტი ფოკუსშია.
<input placeholder="სახელი" />
input:focus {
background-color: antiquewhite;
}
focus-visible
:focus-visible
მოქმედებს მხოლოდ იმ ელემენტებზე,
რომლებსაც ფოკუსი აქვთ მაგრამ მხოლოდ მაშინ, როცა ეს ფოკუსი კლავიატურით ან დამხმარე ტექნოლოგიებით (არა მაუსით) მიიღეს.
<button>შეეცადე <kbd>tab</kbd> ღილაკით ფოკუსი</button>
button:focus-visible {
outline: none;
border: 1px solid red;
}
focus-within
:focus-within
მოქმედებს მშობელ ელემენტზე თუ მისი რომელიმე
შვილობილი ელემენტი ფოკუსშია.
<form>
<label for="nameInput">სახელი:</label> <br />
<input id="nameInput" name="name" placeholder="თქვენი სახელი" /> <br />
<button>გაგზავნა</button>
</form>
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
ფსევდო კლასი ამოიღებს პირველ შვილობილ ელემენეტს.
<p>პირველი პარაგრაფი</p>
<p>მეორე პარაგრაფი</p>
p:first-child {
color: red;
}
last-child
:last-child
ფსევდო კლასი ამოიღებს ბოლო შვილობილ ელემენეტს.
<p>პირველი პარაგრაფი</p>
<p>მეორე პარაგრაფი</p>
p:last-child {
color: red;
}
nth-child
:nth-child
ფსევდო კლასი ამოიღებს ელემენტებს
გადაცემული ინდექსიდან გამომდინარე. გადაცემული ინდექსი შეიძლება იყოს დინამიური n
მნიშვნელობა ან სტატიკური რიცხვი.
n
მნიშვნელობის ჩაწერა შეიძლება მათემატიკური მიმდევრობის სახითიაც.<ul>
<li>პირველი ელემენტი</li>
<li>მეორე ელემენტი</li>
<li>მესამე ელემენტი</li>
<li>მეოთხე ელემენტი</li>
<li>მეხუთე ელემენტი</li>
<li>მეექვსე ელემენტი</li>
<li>მეშვიდე ელემენტი</li>
<li>მერვე ელემენტი</li>
<li>მეცხრე ელემენტი</li>
<li>მეათე ელემენტი</li>
</ul>
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
-ის გარეშე, მოგვიწევდა თითოეული უჯრისთვის სხვადასხვა კლასების მინიჭება.
<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>
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
.
<ul>
<li>პირველი ელემენტი</li>
<li>მეორე ელემენტი</li>
<li>მესამე ელემენტი</li>
<li>მეოთხე ელემენტი</li>
</ul>
ul li:nth-of-type(3) {
color: red;
}
ul li:nth-of-type(even) {
color: blue;
}
:nth-child
უყურებს მთელ სტრუქტურას (ითვლის ყველა ტიპის ელემენტს), ხოლო nth-of-type
უყურებს მხოლოდ
მინიჭებული ტიპის ელემენტებს (აიგნორებს სხვა ელემენტებს).
განვიხილოთ შემდეგი მაგალითი:
<ul>
<li>პირველი ელემენტი</li>
<p>პარაგრაფი</p>
<li>მეორე ელემენტი</li>
<li>მესამე ელემენტი</li>
<li>მეოთხე ელემენტი</li>
</ul>
ul li:nth-of-type(2) {
color: blue;
}
ul li:nth-child(2) {
color: red;
}
რადგან მეორე ელემენტი იყო პარაგრაფის ტიპის, :nth-child
-ის ლოგიკა აღარ გავრცელდა მასზე,
ხოლო :nth-of-type
ფსევდო კლასმა ამოიღო რიგით მეორე li
ელემენტი.
შეჯამება
ამ სტატიაში განვიხილეთ CSS-ის სელექტორების და ფსევდო კლასების გამოყენების ძირითადი პრინციპები, ელემენტების შერჩევა კომბინატორებით, ელემენტის დასტილვა მომხარებლის ინტერაქციის დროს და სხვადასხვა სიტუაციური ფსევდო კლასები.