CSS для выбора ближайшего потомка?

используя CSS, есть ли способ выбрать ближайшего потомка элемента, который соответствует определенному селектору?

<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>

то есть то, что бы выбрать первое .bar в любом .foo (независимо от того, сколько дочерних или родственных элементов находится между ними), но не второй или третий .bar.

3 ответов


вот мой hacktastic ответ: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;
}

цитируя себя из комментария:

мое предложение жизнеспособно, хотя и неприятно,если вы можете установить верхний предел на возможное количество родителей между .foo и .bar вы хотите, чтобы соответствовать. Даже если вам пришлось повторить селектор (допустим) в 10 раз, это не так уж плохо.


нет, нет никакого способа сделать то, что вы просите полностью используя только CSS. Вы можете выбрать nth-child или nth-of-type, а не the-nth-item-matching-this-selector.

в качестве "доказательства" просмотрите список доступных селекторов CSS3 (который охватывает все возможности CSS1 и CSS2.1):
http://www.w3.org/TR/selectors/

вам нужно будет использовать JavaScript (на клиенте) или манипуляции на стороне сервера (например, аннотирование первого такого элемента специальным класс.)


редактировать: на основе вашего редактирования, вы можете сделать:

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

т. е. вам нужно явно "отменить" стиль, примененный к предкам, которые будут унаследованы. Это "хрупкое" - если вы меняете стиль на предке, вам нужно обязательно изменить значение соответствующего правила" переопределения", но эффективное.

и, если @thirtydot опубликует свой Хак в качестве ответа, мы все можем принять это тоже.

хотя вероятно, не помогает, обратите внимание также, что вы можете достичь этой цели С XPath.


Это должно получить только первый дочерний элемент .foo:

.foo > .bar

и не выбирайте дальше по цепочке.