2013-06-24 2 views
9

Есть ли способ использовать селектор CSS для получения среднего ребенка в списке элементов?Middle Child Pseudo-Class

Я знаю, что нет литерала :middle-child селектор, но есть ли другой способ, не прибегая к Javascript?

+0

Изменит ли количество детей? – jackweinbender

+0

Количество элементов задается при загрузке страницы и может варьироваться от пользователя к пользователю. – Jason

+1

Если вы работаете в PHP или Ruby или что-то еще, вы, безусловно, можете написать функцию для добавления класса к среднему элементу. – jackweinbender

ответ

0

Javascript - это единственный способ сделать эту клиентскую сторону.

+0

Должно быть решение sass – Muhammed

0

Вы попробовали :nth-child(#)?

В зависимости от того, какой из них вы хотите выбрать, вы просто замените # номером.

+0

Это работает только в том случае, если известно количество элементов. Я ищу что-то, что будет работать для списка неизвестной длины. – Jason

+0

Ну, я полагаю, если вы не знаете общее число, это тоже не поможет, но в случае, если вы это сделаете - взгляните на этот [CSS3-nth-child on SO] (http: // stackoverflow.com/questions/6692145/nth-child-css-matching-2nd-5th-8th-elements), это похоже на ваш вопрос. –

2

Если вы хотите применить стиль ко всем элементам, которые не являются ни первыми детьми, ни последними детьми, вы можете использовать :not(:first-child), применить стиль, а затем использовать :last-child, чтобы «удалить стиль» из последнего элемента. Но вам нужно подумать о том, что происходит, когда есть менее 3 элементов.

+0

Если вы хотите избежать дублирования (раздел «взять стиль вдалеке»), проверьте мой ответ, который объединяет два «не» селектора, чтобы уловить все средние элементы ... :-) –

9

Это работает хорошо для меня:

*:not(:first-child):not(:last-child) { 
    ... 
} 

Вы можете увидеть пример этого здесь: http://codepen.io/bentomas/pen/Gwqoe

Одно предостережение к этому является то, что он работает только в IE 9+: http://caniuse.com/#feat=css-sel3

+1

Разве это не работает, если есть три предмета? В то время я искал нечто большее, чем в нем. – Jason

+0

Нет, это выберет все элементы, которые не являются первым ребенком, а не последним. Вы можете увидеть это в действии здесь: http://codepen.io/bentomas/pen/Gwqoe – bentomas

+0

О, если вы не хотите * точного * среднего ребенка (т. Е. Только один элемент должен быть сопоставлен). Я думал, что вы хотите выбрать всех детей, которые посередине. По крайней мере, это то, что я ожидал от псевдо-класса ': middle-child', когда я искал его и нашел этот поток. – bentomas

9

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

Например, следующие правила будут выбирать средний элемент в наборе из 5, 7 или 9 элементов.

div:nth-child(3):nth-last-child(3) { 
    /* The middle element in a set of 5 is the 3rd element */ 
} 

div:nth-child(4):nth-last-child(4) { 
    /* The middle element in a set of 7 is the 4th element */ 
} 

div:nth-child(5):nth-last-child(5) { 
    /* The middle element in a set of 9 is the 5th element */ 
} 

Или с Sass:

@for $i from 3 through 5 { 
    div:nth-child(#{$i}):nth-last-child(#{$i}) { 
     /* The middle element */ 
    } 
} 
+0

Если может быть четное число элементов, можно включить 'div: nth-child (-1 + # {$ i}): nth-last-child (# {$ i})' и/или ' div: nth-child (# {$ i}): nth-last-child (-1 + # {$ i}) ', чтобы выбрать элемент слева или справа от центра, соответственно. – Blazemonger

1

Вы можете использовать "не первый и не последний" подход, например, так:

CSS

li:not(:first-child):not(:last-child) { 
    color:red; 
} 

HTML

<ul> 
    <li>First</li> 
    <li>Second</li> 
    <li>Third</li> 
</ul> 

Проверить JsFiddle

+1

Что делать если 5 шт. – Muhammed

+0

Это работает только при наличии 3 элементов. – RaajTram

+0

@RaajTram вы правы, но это был вопрос ... –

Смежные вопросы