ні: селектор першої дитини


811

У мене є divтег, що містить кілька ulтегів.

Я можу встановити властивості CSS лише для першого ulтегу:

div ul:first-child {
    background-color: #900;
}

Однак мої наступні спроби встановити властивості CSS для кожного ulтегу, за винятком першого, не спрацюють:

div ul:not:first-child {
    background-color: #900;
}

div ul:not(:first-child) {
    background-color: #900;
}

div ul:first-child:after {
    background-color: #900;
}

Як я можу записати в CSS: "кожен елемент, крім першого"?

Відповіді:


1414

Одна з версій ви вивішені на насправді працює на всі сучасні браузери (де CSS селектори рівень 3 є підтримуваними ):

div ul:not(:first-child) {
    background-color: #900;
}

Якщо вам потрібно підтримувати застарілі браузери або якщо вам перешкоджає обмеження:not селектора (він приймає лише простий селектор як аргумент), ви можете використовувати іншу техніку:

Визначте правило, яке має більший обсяг, ніж ви маєте намір, а потім умовно "скасуйте" його, обмеживши його сферу застосування лише тим, що ви маєте намір:

div ul {
    background-color: #900;  /* applies to every ul */
}

div ul:first-child {
    background-color: transparent; /* limits the scope of the previous rule */
}

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


Ви точно знаєте, в яких версіях це не підтримується?
Simon_Weaver

9
@Simon_Weaver: На практиці все, крім IE <9, підтримує це. Чудовим ресурсом для отримання подібної інформації є caniuse.com .
Джон

2
Хм .. стежте за обмеженнями першого рішення: caniuse.com/#feat=css-not-sel-list Другий звучав для мене більш розумно. Дякую!
iorrah

@iorrah у вашому посиланні на канюзу є список селекторів, і так, підтримка все ще обмежена. В ОП не використовується список селекторів. Тому я вважаю, що https://caniuse.com/#feat=css-sel3 є більш підходящим із великою підтримкою поза межами IE8.
secretwep

Це працює навіть без елемента div на старті в хромі.
Ахраф ІДЕЙ

157

Це рішення CSS2 ("будь-яке ulінше ul") теж працює, і його підтримують більшість браузерів.

div ul + ul {
  background-color: #900;
}

На відміну від :notта :nth-sibling, сусідній селектор сестер підтримується IE7 +.

Якщо у вас змінити властивості JavaScript після завантаження сторінки, вам слід переглянути деякі відомі помилки в реалізаціях цього IE7 та IE8 . Дивіться це посилання .

Для будь-якої статичної веб-сторінки це має працювати ідеально.


4
@Leven: Це посилання quirksmode говорить, що він повинен працювати в IE7, але лише статично. Якщо ваш JS розміщує перед собою інший елемент, він може бути оновлений неправильно. Це питання, яке ви бачили?
Алекс Квінн

Можливо, варто зауважити, що в такій послідовності елементів, як: ul ul div ul(де ці елементи є побратимами), буде обраний лише другий ul, оскільки останній не має ulпопереднього для себе
Брайан Х.

79

Оскільки IE6-8:not не прийнято , я б запропонував вам це:

div ul:nth-child(n+2) {
    background-color: #900;
}

Таким чином, ви вибираєте кожен ulз його батьківських елементів, крім першого .

Щоб отримати додаткові приклади, перегляньте статтю Кріса Койєра "Корисні: Рецепти для дітей- нійців " .nth-child


хто насправді досі використовує IE6-8 у 2019 році?
oldboy

14
Враховуючи, що відповідь була з 2013 року?
aasukisuki


14

not(:first-child)здається, більше не працює. Принаймні, з більш новими версіями Chrome і Firefox.

Натомість спробуйте це:

ul:not(:first-of-type) {}

6
Вони обидва працюють, але мають різний зміст. ul:not(:first-child)означає буквально "будь-який ulелемент, який не є першою дитиною свого батька", тому він не буде відповідати навіть першому, ulякщо йому передує інший елемент ( p, заголовок тощо). Навпаки, ul:not(:first-of-type)означає "будь-який ulелемент, крім 1-го ulв контейнері". Ви праві, що ОП, мабуть, потребувала останньої поведінки, але ваше пояснення є досить оманливим.
Ілля Стрельцин

9

Ви можете використовувати будь-який селектор not

p:not(:first-child){}
p:not(:first-of-type){}
p:not(:checked){}
p:not(:last-child){}
p:not(:last-of-type){}
p:not(:first-of-type){}
p:not(:nth-last-of-type(2)){}
p:not(nth-last-child(2)){}
p:not(:nth-child(2)){}

4

Я не мав удачі з деяким із перерахованого,

Це було єдине, що насправді працювало на мене

ul:not(:first-of-type) {}

Це працювало для мене, коли я намагався, щоб перша кнопка на сторінці не була виконана опцією ліворуч.

це був варіант, який я спробував спочатку, але це не вийшло

ul:not(:first-child)


4

Ви можете використовувати свій селектор, :notяк внизу, ви можете використовувати будь-який селектор всередині:not()

any_CSS_selector:not(any_other_CSS_selector){
    /*YOUR STYLE*/
}

Ви також можете використовувати :notбез вибору батьків.

   :not(:nth-child(2)){
        /*YOUR STYLE*/
   }

Більше прикладів

any_CSS_selector:not(:first-child){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:first-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:checked){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:last-child){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:last-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:first-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-last-of-type(2)){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-last-child(2)){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-child(2)){
    /*YOUR STYLE*/
}

0

Як я використав ul:not(:first-child)- ідеальне рішення.

div ul:not(:first-child) {
    background-color: #900;
}

Чому це ідеально, адже за допомогою ul:not(:first-child)ми можемо застосувати CSS до внутрішніх елементів. Як li, img, span, aтеги тощо

Але коли використовуються інші рішення:

div ul + ul {
  background-color: #900;
}

і

div li~li {
    color: red;
}

і

ul:not(:first-of-type) {}

і

div ul:nth-child(n+2) {
    background-color: #900;
}

Вони обмежують лише CSS рівня ul. Припустимо, ми не можемо застосувати CSS liяк "div ul + ul li".

Для елементів внутрішнього рівня перше Рішення працює чудово.

div ul:not(:first-child) li{
        background-color: #900;
    }

і так далі ...

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