CSS властивості
ГлавнаяВерсткаСтруктурні псевдокласи :only-child і :only-of-type

Структурні псевдокласи :only-child і :only-of-type

389

Псевдоклас :only-child вибирає дочірній елемент, тільки якщо він є єдиним у свого батька. У прикладі 1 зеленим кольором виділяється текст усередині першого <section>, оскільки він містить лише один елемент <div>. Другий <section> містить уже два елементи (<div> та <p> ;) і :only-child не спрацьовує.

Приклад 1. Використання :only-child

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>:only-child</title> <style> section :only-child { color: green; /* Зелений колір тексту */
}
</style>
</head>
<body> <section> <div>Я завжди Один</div>
</section> <section> <div>Ти не Один</div> <p>Ти не Один</p>
</section>
</body>
</html>

Селектор p:only-child знаходить елемент лише при дотриманні двох умов: це єдиний дочірній елемент і це елемент <p>. У прикладі 1 таких комбінацій немає — перший <section> містить єдиний дочірній елемент, але це не <p> ;, а <div>; другий <section> містить два елементи і <p> не єдиний.

Псевдоклас :only-of-type вибирає дочірній елемент певного типу, лише якщо він є єдиним у свого батька. У прикладі 2 зеленим кольором будуть виділені всі <div>, оскільки всередині <section> вони зустрічаються один раз. При цьому наявність інших елементів, на зразок <p>, не враховується.

Приклад 2. Використання :only-of-type

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>:only-of-type</title> <style> section div:only-of-type { color: green; /* Зелений колір тексту */
}
</style>
</head>
<body> <section> <div>Я завжди Один</div>
</section> <section> <div>Ти не Один</div> <p>Ти не Один</p>
</section>
</body>
</html>

Таким чином, p:only-child знаходить тільки єдиний елемент і лише якщо це <p>, а p:only-of-type знаходить елемент <p> і дивиться, чи є <p> єдиним.

:only-child і :only-of-type знаходять застосування під час створення різних меню. На мал. 1 показано спадне меню: при наведенні на пункти меню розкривається підменю з посиланнями. Не всі пункти є розкриваючими і щоб користувач не плутався, до пунктів, що розкриваються, додана стрілочка.

Спадаюче меню

Мал. 1. Спадне меню

Саме меню робиться за допомогою вкладеного списку <ul>, а для відображення та приховування пунктів використовується псевдоклас :hover та властивість display. Псевдоклас :only-child прибирає стрілку для єдиного елементу <a> всередині списку, тобто. для пункту, в якому немає підменю (приклад 3).

Приклад 3. У спадному меню

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Меню</title> <style> .menu, .menu ul { /* Обнулюємо відступи та прибираємо маркери у списків */
list-style: none; margin: 0; padding: 0; } 
.menu { font: 0.8rem Arial, sans-serif; /* Параметри шрифту */
} 
.menu > li { display: inline-block; /* Вишиковуємо по горизонталі */
position: relative; /* Відносне позиціонування */
} 
.menu a { color: #4c4c4c; /* Колір посилань */
display: block; /* Блокові посилання */
padding: 5px 10px; /* Поля */
text-decoration: none; /* Забираємо підкреслення */
} 
.menu ul { position: absolute; /* Абсолютне позиціонування */
display: none; /* Ховаємо підменю */
width: 200px; /* Ширина підменю */
} 
.menu ul a:hover { background: #f05347; /* Червоний колір тла */
color: #fff; /* Колір тексту */
} 
.menu > li:hover > a, .menu li:hover ul { background: #f0f0f0; /* Сірий колір фону */
} 
.menu li:hover ul { display: block; /* Показуємо підменю при наведенні */
} 
.menu > li > a::after { content: '▼'; /* Додаємо стрілочку */
padding-left: 5px; /* Відстань ліворуч */
} 
.menu > li > a:only-child::after { content: ''; /* */
}
</style>
</head>
<body> <ul class="menu"> <li><a href="#">Російська кухня</a> <ul> <li><a href="#">Бефстроганів</a></li> <li><a href="#">Гусь з яблуками</a></li> <li><a href="#">Крупеник новгородський</a></li> <li><a href="#">Раки російською</a></li>
</ul>
</li> <li><a href="#">Українська кухня</a> <ul> <li><a href="#">Вареники</a></li> <li><a href="#">Спекотне по-харківськи</a></li> <li><a href="#">Капустняк чернігівський</a></li> <li><a href="#">Потапці з помідорами</a></li>
</ul>
</li> <li><a href="#">Кавказька кухня</a></li>
</ul>
</body>
</html>