Czy można zdefiniować styl CSS dla elementu, który jest stosowany tylko wtedy, gdy dopasowany element zawiera określony element (jako bezpośredni element potomny)?
Myślę, że najlepiej to wyjaśnić na przykładzie.
Uwaga : staram się stylizować element nadrzędny , w zależności od tego, jakie elementy potomne zawiera.
<style>
/* note this is invalid syntax. I'm using the non-existing
":containing" pseudo-class to show what I want to achieve. */
div:containing div.a { border: solid 3px red; }
div:containing div.b { border: solid 3px blue; }
</style>
<!-- the following div should have a red border because
if contains a div with class="a" -->
<div>
<div class="a"></div>
</div>
<!-- the following div should have a blue border -->
<div>
<div class="b"></div>
</div>
Uwaga 2 : Wiem, że mogę to osiągnąć za pomocą javascript, ale zastanawiałem się, czy jest to możliwe przy użyciu nieznanych (dla mnie) funkcji CSS.
ol < li:nth-child(n+10) { margin-left: 2rem; } ol < li:nth-child(n+100) { margin-left: 3rem; } ol < li:nth-child(n+1000) { margin-left: 4rem; }
w idealnym świecie zwiększyłoby to marginesol
zależny od liczbyli
zawartych w nim dzieci, tak że margines po lewej stronie byłby tak szeroki, jak to tylko możliwe. musiał być.Odpowiedzi:
O ile mi wiadomo, stylowanie elementu nadrzędnego na podstawie elementu podrzędnego nie jest dostępną funkcją CSS. Prawdopodobnie będziesz potrzebować do tego skryptu.
Byłoby wspaniale, gdybyś mógł zrobić coś takiego
div[div.a]
lubdiv:containing[div.a]
jak powiedziałeś, ale nie jest to możliwe.Możesz rozważyć spojrzenie na jQuery . Jego selektory działają bardzo dobrze z typami „zawierającymi”. Możesz wybrać div, na podstawie jego zawartości potomnej, a następnie zastosować klasę CSS do elementu nadrzędnego w jednym wierszu.
Jeśli użyjesz jQuery, coś w tym stylu może działać (niesprawdzone, ale teoria istnieje):
lub
w połączeniu z klasą CSS:
Oto dokumentacja selektora jQuery „ma” .
źródło
:has
selektora zaleca użycie.has()
metody ( api.jquery.com/has ) => zastosowanej do bieżącego pytania, które dałoby na przykład$('div').has('div.a').css('border', '1px solid red');
:has
selektor może działać, ale jest w wersji roboczej i żadna przeglądarka go nie obsługuje.Zasadniczo nie. Dodaje , że być to, czego szukali w teorii:
Niestety nie istnieje.
Istnieje kilka opisów w stylu „dlaczego, do diabła, nie”. Dobrze rozwinięty Shaun Inman jest całkiem niezły:
http://www.shauninman.com/archive/2008/05/05/css_qualified_selectors
źródło
:has()
pseudoklasy, ale będziemy mogli jej używać tylko w CSS4. Na dzień dzisiejszy (koniec 2019 r.) JS jest nadal jedynym sposobem na osiągnięcie tej funkcjonalności.Oprócz odpowiedzi @ kp:
Mam do czynienia z tym iw moim przypadku muszę pokazać element potomny i odpowiednio skorygować wysokość obiektu nadrzędnego (automatyczne dostosowywanie nie działa w nagłówku bootstrap z jakiegoś powodu, dla którego nie mam czasu na debugowanie) .
Ale zamiast używać javascript do modyfikowania elementu nadrzędnego, myślę, że dynamicznie dodam klasę CSS do elementu nadrzędnego i odpowiednio wybiję elementy podrzędne przez CSS. Pozwoli to zachować decyzje w logice, a nie na podstawie stanu CSS.
tl; dr; zastosuj style
a
ib
do rodzica<div>
, a nie dziecka (oczywiście nie każdy będzie w stanie to zrobić, tj. komponenty kątowe podejmujące własne decyzje).źródło
W moim przypadku musiałem zmienić wypełnienie komórki elementu zawierającego pole wyboru danych wejściowych dla tabeli dynamicznie renderowanej za pomocą DataTables:
Po zaimplementowaniu następującego kodu wiersza w ramach funkcji initComplete byłem w stanie wyprodukować poprawne wypełnienie, które naprawiło wyświetlanie wierszy o nienormalnie dużej wysokości
Teraz możesz zobaczyć, że poprawne style są stosowane do elementu nadrzędnego:
Zasadniczo ta odpowiedź jest rozszerzeniem odpowiedzi @ KP, ale im więcej współpracy przy wdrażaniu, tym lepiej. Podsumowując, mam nadzieję, że to pomoże komuś innemu, ponieważ działa! Na koniec dziękuję bardzo @KP za poprowadzenie mnie we właściwym kierunku!
źródło