2012-06-08 14 views
7

Używając CSS, czy istnieje sposób na wybranie najbliższego potomka elementu, który pasuje do wybranego selektora?CSS, aby wybrać najbliższego potomka?

<div class="foo"> <!-- if we're inside this --> 
    <div> 
    <br /> 
    <div class="bar"> <!-- match this --> 
     <div class="bar"> <!-- but not this --> 
     <div class="bar"> <!-- or this --> 
     </div> 
     </div> 
    </div> 
    <div class="bar"> <!-- I don't really care whether we match this --> 
    </div> 
    </div> 
</div> 

To jest coś, co wybrać pierwszą .bar w dowolnym .foo (bez względu na to ile dziecko lub rodzeństwo elementy są pomiędzy), ale nie drugi lub trzeci .bar.

+1

Jeśli masz drugi ".bar", który jest rodzajem dla tego, który chcesz wybrać, czy chcesz go również wybrać? – Paulpro

+0

Idealnie nie, ale byłoby to również do przyjęcia. –

+0

Czy będzie tylko jeden "słupek", z wszystkimi pozostałymi "kreskami" w nim zawartymi? – animuson

Odpowiedz

13

Oto mój hacktastic odpowiedź: http://jsfiddle.net/thirtydot/gqJdP/2/

/*repeat for as many levels as there could be*/ 
.foo > .bar, 
.foo > :not(.bar) > .bar, 
.foo > :not(.bar) > :not(.bar) > .bar { 
    border-color: blue; 
} 
.bar { 
    border: 1px solid red; 
    padding: 10px; 
} 

Powołując się od komentarza:

Moja sugestia jest opłacalne, chociaż niesmaczne, jeśli można umieścić górną granicę możliwej liczby rodziców między .foo a .bar, które chcesz dopasować. Nawet gdybyś musiał powtórzyć selektor (powiedzmy) 10 razy, nie jest tak źle.

+2

Fan-hackin'-tastic! Nienawidzę używać tego w moim własnym haha ​​haha ​​:) – Paulpro

+1

Ten jest również przy założeniu, że .bar jest bezpośrednim dzieckiem ... –

+0

@StephRose: Niezupełnie. Zbadaj ostrożnie selektor. Zakładam, że jest to bezpośrednie dziecko '.foo' lub bezpośrednie dziecko wszystkiego, co nie jest' .bar', które jest bezpośrednim potomkiem '.foo', lub * <żartem wprowadzającym tutaj> *. – thirtydot

2

Nie, nie ma sposobu, aby wykonać to, o co prosimy całkowicie przy użyciu tylko CSS. Można wybrać opcję nth-child lub nth-of-type, ale nie the-nth-item-matching-this-selector.

jako „dowód”, przejrzeć listę selektorów CSS3 dostępnych (która obejmuje wszystkie możliwości CSS1 i CSS2.1):
http://www.w3.org/TR/selectors/

Trzeba będzie użyć JavaScript (po stronie klienta lub serwera) -na manipulację (np. dodawanie adnotacji do pierwszego takiego przedmiotu specjalną klasą).


Edit: Na podstawie swojej zmiany, można zrobić:

.foo .bar  { font-weight:bold; color:red } 
.foo .bar .bar { font-weight:normal; color:black } 

to trzeba wyraźnie "cofnąć" stylizacji zastosowanego na przodków, które byłyby dziedziczone. To jest "delikatne", jeśli zmienisz styl na przodku, powinieneś także upewnić się, że zmienisz wartość na odpowiedniej "regule" —, ale skutecznej.

A jeśli @thirtydot umieszcza swój hack jako odpowiedź, wszyscy możemy to zaakceptować.

Chociaż prawdopodobnie nie pomaga, należy również pamiętać, że można osiągnąć ten cel with XPath.

+0

Powinniśmy uzyskać 'nth-matching' w CSS4 (ilekroć tak jest), ale nie widzę, jak by to mogło pomóc w tym przypadku. – animuson

+0

@animuson Przy 'nth-matching' będzie to po prostu' .foo .bar: nth-matching (1) ', prawda? – Phrogz

+0

Dobra sugestia dotycząca zguby. –

-3

ten powinien uzyskać tylko pierwszy element podrzędny .foo:

.foo > .bar 

I nie wybrać się dalej w dół łańcucha.

+1

-1 Jak pokazano w przykładowym kodzie, .bar jest ** nie ** koniecznie bezpośrednim potomkiem. – Phrogz

+0

Prawda. Nie widziałem tego. Nie, że divy powinny znajdować się wewnątrz znaczników p. –

+0

@StephRose: Tak, masz rację. Naprawiłem to w wersji demo w mojej odpowiedzi. – thirtydot

Powiązane problemy