Чи є селектор вибору CSS?


3175

Як вибрати <li>елемент, який є прямим батьківським елементом якоря?

Як приклад, мій CSS може бути приблизно таким:

li < a.active {
    property: value;
}

Очевидно, є способи зробити це за допомогою JavaScript, але я сподіваюся, що існує якийсь спосіб вирішення, який існує вродженому для рівня CSS.

Меню, яке я намагаюся стилізувати, формується CMS, тому я не можу перемістити активний елемент до <li>елемента ... (якщо я не зазначу тему модуля створення меню, який я б краще не робив).

Будь-які ідеї?

Відповіді:


2531

В даний час немає можливості вибрати батьківський елемент елемента в CSS.

Якби це було, це було б у будь-якому з поточних специфікацій селекторів CSS:

Однак, робочий проект селекторів 4 рівня включає :has()псевдоклас, який забезпечить цю можливість. Це буде схоже на реалізацію jQuery .

li:has(> a.active) { /* styles to apply to the li tag */ }

Однак станом на травень 2020 року це все ще не підтримується жодним браузером .

Тим часом вам доведеться вдатися до JavaScript, якщо вам потрібно вибрати батьківський елемент.


68
Здавалося б , що вже було запропоновано і відкинуто: stackoverflow.com/questions/45004 / ...
RobM

14
Схоже, переглядач теми було переглянуто, за винятком використання !зараз:The subject of the selector can be explicitly identified by appending an exclamation mark (!) to one of the compound selectors in a selector.
animuson

13
Претендент $виглядав краще для мене ... додаток !можна пропустити легше.
Крістоф

51
Основний сюжет поворот Селектори 4 WD просто оновлено сьогодні , щоб виключити показник суб'єкта від швидкого профілю, який буде використовуватися реалізаціями CSS. Якщо ця зміна залишається, це означає, що ви більше не зможете використовувати індикатор теми в таблицях стилів (якщо ви не додасте якийсь поліфайл, як описаний в іншій відповіді ) - використовувати його можна лише за допомогою API Selectors і будь-де інакше, що повний профіль може бути реалізований.
BoltClock

55
Ще одне важливе оновлення: схоже, вони думають взагалі відійти від синтаксису селектора теми і замінити його на :has()псевдо, який усі дізналися та люблять у jQuery. Остання ED видалила всі посилання на предметний індикатор і замінила його :has()псевдо. Я не знаю точних причин, але CSSWG провів опитування деякий час тому, і результати, мабуть, вплинули на це рішення. Це, швидше за все, сумісність з jQuery (тому він може використовувати qSA без змін), і тому що синтаксис індикатора теми виявився занадто заплутаним.
BoltClock

152

Я не думаю, що ви можете вибрати батьківського лише в CSS.

Але так як ви вже здаєтеся, що у вас є .activeклас, було б легше перемістити цей клас до li(замість a). Таким чином ви можете отримати доступ і до, liі aчерез CSS.


4
Ви не можете перемістити селектор псевдо в елемент списку, оскільки це не фокусируемый елемент. Він використовує перемикач: active, тому, коли якір активний, він хоче вплинути на предмет списку. Елементи списку ніколи не будуть у активному стані. Як убік, прикро, що такого селектора не існує. Отримати доступ до чистого меню CSS для повного доступу до клавіатури неможливо без нього (використовуючи селектори вибору, ви можете зробити підменю, створене за допомогою вкладених списків, щоб з’являтися, але як тільки список набуває фокус, він знову стає прихованим). Якщо в цьому конкретному конфіденції є якісь лише CSS рішення

12
@Dominic Aquilina Погляньте на питання, що ОП використовує клас, а не псевдоселектор.
jeroen

125

Ви можете використовувати цей сценарій :

*! > input[type=text] { background: #000; }

Це дозволить вибрати будь-який батько введення тексту. Але зачекайте, є ще набагато більше. Якщо ви хочете, ви можете вибрати вказаний батьківський:

.input-wrap! > input[type=text] { background: #000; }

Або виберіть його, коли він активний:

.input-wrap! > input[type=text]:focus { background: #000; }

Перевірте цей HTML:

<div class="input-wrap">
    <input type="text" class="Name"/>
    <span class="help hide">Your name sir</span>
</div>

Ви можете вибрати це, span.helpколи inputактивний, і показати його:

.input-wrap! .help > input[type=text]:focus { display: block; }

Є ще багато можливостей; просто ознайомтеся з документацією плагіна.

До речі, він працює в Internet Explorer.


5
припустимо, використання jquery patent()було б швидше. Це тестування необхідно, однак
Dan

2
@Iidd Це не вдається, якщо у вас є CSS-декларація суб'єкта Selector без дочірнього селектора ( #a!окремо видає помилку, #a! pпрацює), і тому інші не працюватимуть також через Uncaught TypeError: Cannot call method 'split' of undefined: див. Jsfiddle.net/HerrSerker/VkVPs
yunzen

3
@HerrSerker Я думаю, що #a! це недійсний селектор, що його слід вибрати?
Обмежений

2
@Змінено, я не знаю. Спеціалізація не каже, що це незаконно. #a! повинен вибрати себе. Принаймні їх не повинно бути помилок у JavaScript
yunzen

5
Згідно з моїм коментарем до прийнятої відповіді, схоже, що поліфіл може знадобитися навіть найближчим часом, тому що браузер у CSS може ніколи не реалізовуватися.
BoltClock

108

Як згадує декілька інших, не існує способу стилізації батьків / s елементів за допомогою лише CSS, але наступні роботи з jQuery :

$("a.active").parents('li').css("property", "value");

21
<Селектор не існує (перевірено з допомогою JQuery 1.7.1).
Роб Ш

6
Можливо, цей <синтаксис працював у 2009 році, але я оновив його (за 2013 рік).
Аластер

5
Ще краще, якщо використовувати вбудований в JQuery в :has()селектор : $("li:has(a.active)").css("property", "value");. Він читає аналогічно запропонованому !селектором CSS 4 . Дивіться також: :parentселектор , .parents()метод , .parent()метод .
Rory O'Kane

7
І замість того, щоб використовувати .css("property", "value")для стилювання вибраних елементів, зазвичай, ви повинні .addClass("someClass")мати їх у своєму CSS .someClass { property: value }( через ). Таким чином, ви можете помітити стиль з усією потужністю CSS та будь-якими препроцесорами, якими ви користуєтесь.
Rory O'Kane


69

Немає батьківського селектора; так само, як немає попереднього селектора. Однією з вагомих причин відсутності цих селекторів є те, що браузер повинен пройти через всі діти елемента, щоб визначити, чи слід застосовувати клас чи ні. Наприклад, якщо ви написали:

body:contains-selector(a.active) { background: red; }

Тоді веб-переглядачу доведеться почекати, поки він завантажиться і проаналізує все до тих пір, поки він </body>не визначить, повинна бути сторінка червоною або ні.

Стаття Чому ми не маємо батьківського селектора, це детально пояснює.


11
тому зробіть браузер швидшим. Інтернет швидше. цей селектор, безумовно, потрібен, і причина його не застосовувати, на жаль, тому що ми живемо у повільному, примітивному світі.
vsync

11
насправді, селектор дуже швидко зробив би браузер повільним.
Салман

5
Я вірю, що розробники браузерів придумають реалізацію, яка є (принаймні) такою ж швидкою, як версію javascript, яку люди все-таки використовують.
Марк.2377,

"ми живемо в повільному, примітивному світі" кашель кашель новий яблучний годинник дивляться кашель кашель
Марвін

@ Marc.2377 Якщо ви спробуєте наведений вище приклад у JS на своєму веб-сайті, я ніколи його не відвідуватиму. З іншого боку, я б сказав, що більшу частину часу ви дбаєте лише про найближчих дітей, тож якби вона була обмежена лише найближчими дітьми, це було б гарним доповненням без особливого впливу.
xryl669

54

Неможливо зробити це в CSS 2. Ви можете додати клас до liта посилатися на a:

li.active > a {
    property: value;
}

3
роблячи відображення елементів: block, ви можете стилювати його так, щоб відповідати всій області li. якщо ви можете пояснити, який стиль ви шукаєте, можливо, я міг би допомогти з рішенням.
Джош

це насправді просте і елегантне рішення, і в багатьох випадках має сенс встановити клас на батьківському.
Рікардо

35

Спробуйте переключитися aна blockпоказ, а потім використовуйте будь-який стиль, який ви хочете. aЕлемент заповнює liелемент, і ви будете мати можливість змінювати свій зовнішній вигляд , як ви хочете. Не забудьте встановити liнакладки на 0.

li {
  padding: 0;
  overflow: hidden;
}
a {
  display: block;
  width: 100%;
  color: ..., background: ..., border-radius: ..., etc...
}
a.active {
  color: ..., background: ...
}

31

Селектор CSS " Загальний комбінататор братів " може бути використаний для того, що ви хочете:

E ~ F {
    property: value;
}

Це відповідає будь-якому Fелементу, якому передує Eелемент.


24
Це просто вибір сестер, це не дитина, батько ... не дуже відповідав на питання товариша
Аліреза

26

Наскільки я не знаю в CSS 2. CSS 3 має більш надійні селектори, але послідовно не застосовується у всіх браузерах. Навіть із покращеними селекторами, я не вірю, що це виконає саме те, що ви вказали у своєму прикладі.


24

Я знаю, що ОП шукала рішення CSS, але досягти цього просто за допомогою jQuery. У моєму випадку мені потрібно було знайти <ul>батьківський тег для <span>тегу, що міститься в дитині <li>. jQuery має :hasселектор, тому можна ідентифікувати батьків за дітьми, які він містить:

$("ul:has(#someId)")

вибере ulелемент, який містить дочірній елемент з id someId . Або щоб відповісти на початкове запитання, щось подібне повинно зробити трюк (неперевірений):

$("li:has(.active)")

3
Або скористайтеся, $yourSpan.closest("ul")і ви отримаєте батьківський UL вашого елемента "span". Тим не менш, ваша відповідь є абсолютно офтопічним імхо. Ми можемо відповісти на всі питання, розміщені в CSS, за допомогою рішення jQuery.
Робін ван Бален

1
Як визначено в інших відповідях, немає можливості зробити це за допомогою CSS 2. Враховуючи це обмеження, я запропонував відповідь, яку я знаю, є ефективною і є найпростішим способом відповісти на питання за допомогою JavaScript imho.
Девід Кларк

З огляду на ваші результати, деякі люди згодні з вами. Але єдиною відповіддю залишається прийнята; простий і простий "це не можна зробити так, як ти хочеш". Якщо питання полягає в тому, як досягти 60 км / год на велосипеді, і ви відповідаєте на це "просто; сідайте в машину і натисніть на газ"., Це все ще не відповідь. Звідси мій коментар.
Робін ван Бален

1
Такий підхід зробить SO майже повністю марною. Я шукаю ТАК, як вирішити проблеми, а не знайти "єдину відповідь" не вирішує питання. Ось чому SO настільки приголомшливий, тому що завжди існує більше, ніж один спосіб зіштувати кішку.
Девід Кларк

23

Елемент псевдо :focus-withinдозволяє вибрати батьків, якщо нащадок має фокус.

Елемент можна зосередити, якщо він має tabindexатрибут.

Підтримка браузера для фокусування всередині

Табіндекс

Приклад

.click {
  cursor: pointer;
}

.color:focus-within .change {
  color: red;
}

.color:focus-within p {
  outline: 0;
}
<div class="color">
  <p class="change" tabindex="0">
    I will change color
  </p>
  <p class="click" tabindex="1">
    Click me
  </p>
</div>


2
Це добре працює в моєму випадку, дякую! Просто ні, приклад був би більш наочним, якщо ви зміните колір на батьківський, а не на побратимів, це замінить .color:focus-within .changeна .color:focus-within. У моєму випадку я використовую bootstrap nav-bar, який додає клас дітям, коли він активний, і я хочу додати клас до батьківського .nav-bar. Я думаю, що це досить поширений сценарій, коли я володію розміткою, але компонент css + js - це завантажувальна програма (або інша), тому я не можу змінити поведінку. Хоча я можу додати tabindex і використовувати цей css. Дякую!
онкоберо

22

Це найбільш обговорюваний аспект специфікації селекторів 4 рівня . За допомогою цього селектор зможе стилізувати елемент відповідно до його дочірніх, використовуючи знак оклику після заданого селектора (!).

Наприклад:

body! a:hover{
   background: red;
}

встановить червоний колір фону, якщо користувач наводить курсор на будь-який якір.

Але нам доведеться чекати впровадження браузерів :(


21

Ви можете спробувати використовувати гіперпосилання як батьківське, а потім змінити внутрішні елементи на наведення курсору. Подобається це:

a.active h1 {color:red;}

a.active:hover h1 {color:green;}

a.active h2 {color:blue;}

a.active:hover h1 {color:yellow;}

Таким чином ви можете змінити стиль у кількох внутрішніх тегах, спираючись на перекидання батьківського елемента.


1
Це правильно, але обмежує код розмітки в aтезі лише певними елементами, якщо ви хочете відповідати стандартам XHTML. Наприклад, ви не можете використовувати divвнутрішню a, не отримуючи попередження про порушення схеми.
Івайло Славов

2
Цілком прав Івайло! "a" - це неблоковий елемент, тому не можна використовувати елементи блоку всередині нього.
річкова буря

1
У HTML5 ідеально розміщувати елементи блоку всередині посилань.
Меттью Джеймса Тейлора

2
... якби це було семантично неправильно, вони не допустили б його в HTML5 там, де раніше не було.
BoltClock

14

В даний час немає батьківського селектора, і він навіть не обговорюється в жодному з переговорів W3C. Вам потрібно зрозуміти, як CSS оцінюється браузером, щоб насправді зрозуміти, потрібен він нам чи ні.

Тут є багато технічних пояснень.

Джонатан Снук пояснює, як оцінюється CSS .

Кріс Койєр на переговорах селекціонера батьків .

Гаррі Робертс знову написав ефективні селектори CSS .

Але Ніколь Салліван має кілька цікавих фактів про позитивні тенденції .

Ці люди - це найвищий клас у галузі розробки фронту.


12
Визначення needвизначається вимогами веб-розробників, чи матиме його у специфікації, вирішують інші фактори.
nicodemus13

14

Просто ідея для горизонтального меню ...

Частина HTML

<div class='list'>
  <div class='item'>
    <a>Link</a>
  </div>
  <div class='parent-background'></div>
  <!-- submenu takes this place -->
</div>

Частина CSS

/* Hide parent backgrounds... */
.parent-background {
  display: none; }

/* ... and show it when hover on children */
.item:hover + .parent-background {
  display: block;
  position: absolute;
  z-index: 10;
  top: 0;
  width: 100%; }

Оновлено демонстраційну версію та решту коду

Ще один приклад, як використовувати його з текстовими вводами - виберіть батьківський набір полів


3
Мені зовсім не зрозуміло, як ви маєте на увазі узагальнити це для деяких / багатьох / більшості випадків використання батьківського селектора, або навіть саме, які саме частини цього CSS роблять для чого. Чи можете ви додати ґрунтовне пояснення?
Натан Туггі

2
Я не намагався застосувати це до реальних сценаріїв, тому я кажу "Не для виробництва". Але я думаю, що його можна застосувати до дворівневого меню лише з фіксованою шириною елементів. "які частини цього CSS роблять" - .test-sibling тут насправді є фоном батьківського елемента (останній рядок CSS).
Ілля Б.

2
Додано пояснення (розділ css jsfiddle, починаючи з "ОСНОВНА ЧАСТИНА") ... І я помилився - може бути будь-яка кількість підрівнів.
Ілля Б.

13

Ось хак , використовуючи pointer-eventsз hover:

<!doctype html>
<html>
	<head>
		<title></title>
		<style>
/* accessory */
.parent {
	width: 200px;
	height: 200px;
	background: gray;
}
.parent, 
.selector {
	display: flex;
	justify-content: center;
	align-items: center;
}
.selector {
	cursor: pointer;
	background: silver;
	width: 50%;
	height: 50%;
}
		</style>
		<style>
/* pertinent */
.parent {
	background: gray;
	pointer-events: none;
}
.parent:hover {
	background: fuchsia;
}
.parent 
.selector {
	pointer-events: auto;
}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="selector"></div>
		</div>
	</body>
</html>


12

Існує плагін, який розширює CSS і включає деякі нестандартні функції, які дійсно можуть допомогти при розробці веб-сайтів. Це називається EQCSS .

Одна з речей, яку додає EQCSS, - це вибір батьків. Він працює у всіх браузерах, Internet Explorer 8 і новіших версій. Ось формат:

@element 'a.active' {
  $parent {
    background: red;
  }
}

Отже, тут ми відкрили запит елементів на кожному елементі a.active, а для стилів всередині цього запиту такі речі $parentмають сенс, оскільки є опорна точка. Веб-переглядач може знайти батьків, оскільки він дуже схожий на parentNodeJavaScript.

Ось демонстрація$parent та ще одна $parentдемонстрація, яка працює в Internet Explorer 8 , а також скріншот, якщо у вас немає Internet Explorer 8 навколо, щоб тестувати .

EQCSS також включає мета-селектори : $prevдля елемента перед обраним елементом і $thisлише для тих елементів, які відповідають запиту елементів тощо.


11

Наразі 2019 рік, і останній проект модуля вкладення CSS насправді має щось подібне. Представляємо @nestправила.

3.2. Правила введення: @nest

Хоча пряме гніздування виглядає красиво, воно дещо крихке. Деякі дійсні селектори вкладки, як-от. Крім того, деякі люди вважають гніздовим складним завдання візуально відрізняти декларації від навколишніх.

Щоб допомогти у вирішенні цих питань, ця специфікація визначає правило @nest, яке встановлює менші обмеження щодо правильності застосування правил гніздування. Його синтаксис:

@nest = @nest <selector> { <declaration-list> }

Правило @nest функціонує ідентично правилу стилю: воно починається з селектора і містить декларації, що стосуються елементів, які відповідає селектору. Єдина відмінність полягає в тому, що селектор, що використовується в правилі @nest, повинен містити гніздо, а це означає, що він десь містить гніздовий селектор. Список селекторів містить гніздо, якщо всі його окремі складні селектори містять гніздо.

(Скопіюйте та вставте з вказаної вище URL-адреси).

Приклад дійсних селекторів відповідно до цієї специфікації:

.foo {
  color: red;
  @nest & > .bar {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   .foo > .bar { color: blue; }
 */

.foo {
  color: red;
  @nest .parent & {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   .parent .foo { color: blue; }
 */

.foo {
  color: red;
  @nest :not(&) {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   :not(.foo) { color: blue; }
 */

10

Технічно немає прямого способу зробити це. Однак ви можете впорядкувати це за допомогою jQuery або JavaScript.

Однак ви можете зробити щось подібне.

a.active h1 {color: blue;}
a.active p {color: green;}

jQuery

$("a.active").parents('li').css("property", "value");

Якщо ви хочете досягти цього, використовуючи jQuery, ось посилання на селектор вибору jQuery .


9

W3C виключив такий селектор через величезний вплив на його роботу на браузер.


27
помилковий. оскільки DOM - це дерево, вони повинні йти до батька, перш ніж потрапити до дитини, тому просто поверніться на один вузол. oo
NullVoxPopuli

9
CSS-селектори є чергою, тому оцінюється порядок вибору, а не ієрархія документа XPath або DOM.
Пол Sweatte

3
@rgb Принаймні саме так нам сказали.
юнзен

9

Коротка відповідь - НІ ; у нас parent selectorна цьому етапі у CSS немає, але якщо вам все одно не потрібно міняти елементами або класами, другий варіант - це JavaScript. Щось на зразок цього:

var activeATag = Array.prototype.slice.call(document.querySelectorAll('a.active'));

activeATag.map(function(x) {
  if(x.parentNode.tagName === 'LI') {
    x.parentNode.style.color = 'red'; // Your property: value;
  }
});

Або коротшим способом, якщо ви використовуєте jQuery у своїй програмі:

$('a.active').parents('li').css('color', 'red'); // Your property: value;

5

Хоча в стандартному CSS наразі немає батьківського селектора, я працюю над (персональним) проектом під назвою ax (тобто. Доповнений синтаксис CSS Selector / ACSSSS ), який серед 7 нових селекторів включає обидва:

  1. безпосередній батьківський селектор <(який дозволяє вибрати протилежний >)
  2. будь-селектор предка ^ (який дозволяє вибрати протилежний [SPACE])

Сокира в даний час знаходиться на порівняно ранній стадії BETA.

Дивіться демонстрацію тут:

http://rounin.co.uk/projects/axe/axe2.html

(порівняйте два списки зліва в стилі зі стандартними селекторами та два списки праворуч із стимуляторами сокири)


3
Наразі проект знаходиться на ранній бета-стадії. Ви можете (принаймні на даний момент) активувати селектори сокир у своїх стилях CSS, включивши <script src="https://rouninmedia.github.io/axe/axe.js"></script>в самому кінці вашого html-документа, безпосередньо перед цим </body>.
Рунін

4

Принаймні до CSS 3, включаючи CSS 3, ви не можете вибрати такий. Але це зараз можна зробити досить легко в JavaScript, вам просто потрібно додати трохи ванільного JavaScript, зауважте, що код досить короткий.

cells = document.querySelectorAll('div');
[].forEach.call(cells, function (el) {
    //console.log(el.nodeName)
    if (el.hasChildNodes() && el.firstChild.nodeName=="A") {
        console.log(el)
    };
});
<div>Peter</div>
<div><a href="#">Jackson link</a></div>
<div>Philip</div>
<div><a href="#">Pullman link</a></div>


4

Будь-які ідеї?

CSS 4 буде фантазійним, якщо він додасть кілька гачків у ходьбу назад . До цього можна (хоча НЕ рекомендується) використовувати checkboxі / або radio inputS , щоб зламати звичний спосіб , яким речі пов'язані, і через які також дозволяють CSS працювати поза свого нормального обсягу ...

/* Hide things that may be latter shown */
.menu__checkbox__selection,
.menu__checkbox__style,
.menu__hidden {
  display: none;
  visibility: hidden;
  opacity: 0;
  filter: alpha(opacity=0); /* Old Microsoft opacity */
}


/* Base style for content and style menu */
.main__content {
  background-color: lightgray;
  color: black;
}

.menu__hidden {
  background-color: black;
  color: lightgray;
  /* Make list look not so _listy_ */
  list-style: none;
  padding-left: 5px;
}

.menu__option {
  box-sizing: content-box;
  display: block;
  position: static;
  z-index: auto;
}

/* &#9660; - \u2630 - Three Bars */
/*
.menu__trigger__selection::before {
  content: '\2630';
  display: inline-block;
}
*/

/* &#9660; - Down Arrow */
.menu__trigger__selection::after {
  content: "\25BC";
  display: inline-block;
  transform: rotate(90deg);
}


/* Customize to look more `select` like if you like */
.menu__trigger__style:hover,
.menu__trigger__style:active {
  cursor: pointer;
  background-color: darkgray;
  color: white;
}


/**
 * Things to do when checkboxes/radios are checked
 */

.menu__checkbox__selection:checked + .menu__trigger__selection::after,
.menu__checkbox__selection[checked] + .menu__trigger__selection::after {
  transform: rotate(0deg);
}

/* This bit is something that you may see elsewhere */
.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
  display: block;
  visibility: visible;
  opacity: 1;
  filter: alpha(opacity=100); /* Microsoft!? */
}


/**
 * Hacky CSS only changes based off non-inline checkboxes
 * ... AKA the stuff you cannot unsee after this...
 */
.menu__checkbox__style[id="style-default"]:checked ~ .main__content {
  background-color: lightgray;
  color: black;
}

.menu__checkbox__style[id="style-default"]:checked ~ .main__content .menu__trigger__style[for="style-default"] {
  color: darkorange;
}

.menu__checkbox__style[id="style-one"]:checked ~ .main__content {
  background-color: black;
  color: lightgray;
}

.menu__checkbox__style[id="style-one"]:checked ~ .main__content .menu__trigger__style[for="style-one"] {
  color: darkorange;
}

.menu__checkbox__style[id="style-two"]:checked ~ .main__content {
  background-color: darkgreen;
  color: red;
}

.menu__checkbox__style[id="style-two"]:checked ~ .main__content .menu__trigger__style[for="style-two"] {
  color: darkorange;
}
<!--
  This bit works, but will one day cause troubles,
  but truth is you can stick checkbox/radio inputs
  just about anywhere and then call them by id with
  a `for` label. Keep scrolling to see what I mean
-->
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-default">
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-one">
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-two">


<div class="main__content">

  <p class="paragraph__split">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
  </p>

  <input type="checkbox"
         class="menu__checkbox__selection"
         id="trigger-style-menu">
  <label for="trigger-style-menu"
         class="menu__trigger__selection"> Theme</label>

  <ul class="menu__hidden">
    <li class="menu__option">
      <label for="style-default"
             class="menu__trigger__style">Default Style</label>
    </li>

    <li class="menu__option">
      <label for="style-one"
             class="menu__trigger__style">First Alternative Style</label>
    </li>

    <li class="menu__option">
      <label for="style-two"
             class="menu__trigger__style">Second Alternative Style</label>
    </li>
  </ul>

  <p class="paragraph__split">
    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
    proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </p>

</div>

... досить грубо , але лише за допомогою CSS та HTML можна торкатися та повторно торкатися будь-чого, крім того, bodyі :rootмайже з будь-якого місця, пов'язуючи idта forвластивості radio/ checkbox inputs та label тригери ; швидше за все, хтось покаже, як повторно торкнутися їх.

Одним із додаткових застережень є те, що лише один input із конкретних, idможливо, використаних, перший checkbox/ radio перемагає змінений стан іншими словами ... Але кілька міток можуть вказувати на одне inputі те ж , хоча це зробить і HTML, і CSS вигляд ще більш виразним.


... Я сподіваюся, що існує якийсь спосіб вирішення, який існує вродженому для рівня CSS 2 ...

Я не впевнений, що стосується інших :селекторів, але я :checkedза попередній CSS 3. Якщо я пам'ятаю правильно, це було щось на зразок [checked], чому саме ви можете знайти його у наведеному вище коді, наприклад,

.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
 /* rules: and-stuff; */
}

... але для таких речей , як ::afterі :hoverя не зовсім впевнений , в якому CSS версії тих перших з'явилися.

Коли все сказане, будь ласка, ніколи не використовуйте це у виробництві, навіть у гніві. Як на жарт, або іншими словами лише тому, що щось можна зробити, це не завжди означає, що воно повинно .


3

Ні, ви не можете вибрати батьківського лише в CSS.

Але так як ви вже здаєтеся, що у вас є .activeклас, було б легше перемістити цей клас до li(замість a). Таким чином ви можете отримати доступ і до, liі aчерез CSS.


1

Зміна батьківського елемента на основі дочірнього елемента в даний час може відбутися лише тоді, коли у нас є <input>елемент всередині батьківського елемента. Коли вхід отримує фокус, його відповідний батьківський елемент може вплинути за допомогою CSS.

Наступний приклад допоможе вам зрозуміти використання :focus-withinв CSS.

.outer-div {
  width: 400px;
  height: 400px;
  padding: 50px;
  float: left
}

.outer-div:focus-within {
  background: red;
}

.inner-div {
  width: 200px;
  height: 200px;
  float: left;
  background: yellow;
  padding: 50px;
}
<div class="outer-div">
  <div class="inner-div">
    I want to change outer-div(Background color) class based on inner-div. Is it possible?
    <input type="text" placeholder="Name" />
  </div>
</div>


1

Це можливо за допомогою ampersand в Sass :

h3
  font-size: 20px
  margin-bottom: 10px
  .some-parent-selector &
    font-size: 24px
    margin-bottom: 20px

CSS вихід:

h3 {
  font-size: 20px;
  margin-bottom: 10px;
}
.some-parent-selector h3 {
  font-size: 24px;
  margin-bottom: 20px;
}

2
це правда, але тільки якщо ви знаєте селектора заздалегідь.
Шахар

11
Це не вибирає h3батька, що було метою. Це вибрало б h3, які є нащадками .some-parent-selector.
Джейкоб Форд

1

Я б найняв якийсь код JavaScript для цього. Наприклад, в React, коли ви повторюєте масив, додайте ще один клас до батьківського компонента, який вказує, що він містить ваших дітей:

<div className={`parent ${hasKiddos ? 'has-kiddos' : ''}`}>
    {kiddos.map(kid => <div key={kid.id} />)}
</div>

А потім просто:

.parent {
    color: #000;
}

.parent.has-kiddos {
    color: red;
}

0

Немає батьківського селектора css (і, отже, у препроцесорах css) через "Основні причини, коли Робоча група CSS раніше відхиляла пропозиції для батьківських селекторів, пов'язана з роботою браузера та проблемами додаткового відображення".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.