Товаров: 0 (0р.)

Css not nth child: css selectors — CSS how to use pseudo-class :not with :nth-child

Содержание

:not() — CSS | MDN

Отрицательный CSS псевдо-класс, :not(X) — функция, принимающая простой селектор X в качестве аргумента. Он находит элементы, не соответствующие селектору. X не должен содержать других отрицательных селекторов.

Замечания:
  • С этого псевдокласса можно написать бесполезные селекторы. Например, :not(*) найдёт любой элемент, являющийся не любым, то есть правило не применится ни к одному элементу.
  • Возможно переписать другие правила. Например foo:not(bar) найдёт тот же элемент, что и простой foo. Тем не менее специфичность первого выше.
  • :not(foo){} найдёт что угодно, что не foo, включая <html> и <body>.
  • Это селектор применяется только к одному элементу. Вы не можете использовать его, чтобы исключить всех родителей. Например, body :not(table) a
     применится к ссылкам внутри таблицы, тогда как <tr> будет соответствовать :not() части селектора.
:not(selector) { style properties }
p:not(.classy) { color: red; }
body :not(p) { color: green; }

CSS выше и HTML ниже…

<p>Некоторый текст.</p>
<p>Какой-то другой текст.</p>
<span>Ещё текст<span>

Выведет это:

ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка1.01.0 (1.7 или ранее)9.09.53.2
Расширенные аргументыНетНетНетНетНет
ВозможностьAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка2.11. 0 (1)9.010.03.2
Расширенные аргументыНетНетНетНетНет

 

CSS-селектор :not. Полезные примеры

В спецификации и блогах про селектор :not обычно приводят какие-то искусственные примеры, которые хоть и объясняют синтаксис и принцип действия, но не несут никакой идеи о том, как получить пользу от нового селектора.

Например:

p:not(.classy) { color: red; }

Ну окей, думаю я, в моей практике не встречались такие ситуации. Обходились мы ведь как-то раньше без :not. Приходилось немного переписать структуру селекторов или обнулить пару значений.

Пример 1. Элемент без класса

Селектор :not может быть крайне полезен, когда нам нужно застилить контент сгенерированный пользователем (нет возможности расставить в нем классы), или когда у нас контента очень много и расставлять в нем классы слишком трудоёмко.

Например, мы хотим на сайте сделать красивые буллиты для ненумерованных списков ul li. Мы пишем код:

ul li {  }

В результате, наши красивые буллиты появляются не только в контенте, но и, например, в навигации, где тоже используются

ul li.

Мы ограничиваем область действия селектора:

.content ul li {  }

Навигацию мы спасли, но ненужные буллиты всё еще вылазят на слайдерах, списках новостей и других конструкциях внутри .content, где тоже используются ul li.

Далее у нас варианты:

1) обнулить мешающие стили в слайдерах и других местах. Но это противоречит «DRY» и является одним из признаков «вонючего» кода. К тому же не решает проблему раз и навсегда: добавите, например, аккордеон и списки в нем снова придется обнулять.

2) пойти от обратного и ставить класс всем спискам, которые нужно стилизовать:

. textlist li {  }

Это добавляет лишней работы по расстановке классов в контенте. Иногда имеет смысл, но лишнюю работу никто не любит.

3) стилизовать только те ul li, у которых нет никаких классов вообще:

ul:not([class]) li {  }

Победа! Нам не нужно делать дополнительную работу по расстановке классов в контенте. А на слайдерах, аккордеонах и прочих конструкциях, которые не должны выглядеть как списки, но используют их в своей разметке, в 99% случаев уже будут свои классы, и наши стили их не затронут.

Этот прием — «выбирать только элементы без класса» — очень полезен для оформления пользовательского контента и его можно применять не только к спискам, но и для других случаев.

Пример 2. Изменение внешнего вида всех элементов, кроме наведенного

Пример

Такой эффект можно реализовать без :not путем перезаписи значений. И это будет работать в бо́льшем количестве браузеров.


ul:hover li {
  opacity:0. 5;
}
ul:hover li:hover {
  opacity:1;
}

Но если придется обнулять слишком много свойств, то есть смысл использовать :not.


ul:hover li:not(:hover) {
  opacity:0.5;
}

Пример 3. Меню с разделителями между элементами

Пример

Как и в предыдущем примере, желаемого можно добиться несколькими способами.

Через перезапись свойств. Но тут два правила вместо одного, что не есть «DRY».

.menu-item:after {
  content: ' | ';
}
.menu-item:last-child:after {
  content: none;
}

Через :nth-last-child(). Одно правило, но тяжело читается.

.menu-item:nth-last-child(n+2):after {
  content: ' | ';
}

Через :not() — самая короткая и понятная запись.

.menu-item:not(:last-child):after {
  content: ' | ';
}

Пример 4. Debug css

Удобно для отладки и самоконтроля искать/подсвечивать картинки без alt, label без for и другие ошибки.


img:not([alt]),
label:not([for]),
input[type=submit]:not([value]) {
  outline:2px solid red;
}


ul > *:not(li),
ol > *:not(li),
dl > *:not(dt):not(dd) {
  outline:2px solid red;
}

Пример 5. Поля форм

Раньше текстовых полей форм было не много. Достаточно было написать:

select,
textarea,
[type="text"],
[type="password"] {
    
}

С появлением новых типов полей в HTML5 этот список увеличился:

select,
textarea,
[type="text"],
[type="password"],
[type="color"],
[type="date"],
[type="datetime"],
[type="datetime-local"],
[type="email"],
[type="number"],
[type="search"],
[type="tel"],
[type="time"],
[type="url"],
[type="month"],
[type="week"] {
  
}

Вместо перечисления 14 типов инпутов можно исключить 8 из них:

select,
textarea,
[type]:not([type="checkbox"]):not([type="radio"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="range"]):not([type="file"]):not([type="image"]) {
  
}

Ладно, этот пример не очень красив, и я рекомендую всё же первый вариант с перечислением, он работает с IE8+, а второй вариант с IE9+.

Поддержка

Следует заметить, что согласно спецификации в скобках селектора :not() может стоять только простой селектор и в скобках нельзя использовать сам селектор :not(). Если нужно исключить несколько элементов, :not() можно повторить несолько раз, как в примере 5.

Если очень нужны CSS3-селекторы в браузерах, которые их не поддерживают, можно использовать полифил selectivizr.

Псевдоклассы CSS — Примеры

Помимо CSS селекторами рассмотрим псевдоклассы.
a:hover{ color:#333333; }
селектор:псевдокласссвойствозначение

Псевдоклассы, применимые только к ссылкам

<style type="text/css">
  a:link { color: blue; } /* не посещённые ссылки */ 

  a:visited { color: green; } /* посещённые ссылки */ 
</style>

<a href="#">анкор</a>
анкор

Псевдоклассы, благодаря которым осуществляется динамическое изменение элемента

<style type="text/css">
  div { width: 50%; }

  div:hover { width: 100%; } /* изменение происходит при наведении (увеличивается ширина блока) */ 

  div:active { /* изменение происходит при нажатии (блок смещается вниз) */   
  position: relative;
  top: 10px; 
} 
</style>

<div>содержимое</div>

навести мышку и нажать

Теперь вспомним о хэш-ссылках. Тег a также можно вынести за пределы div.

<style type="text/css">
  div { width: 50%; }

  div:target { width: 100%; } /* при переходе на URL с символом # (http://shpargalkablog.ru/2012/02/psevdoklassy-css.html#target) */ 
</style>

<div><a href="#target">нажать</a></div>

Для элементов формы, таких как input, select и textarea

Псевдокласс :focus также функционирует для других элементов, но нужны дополнительные атрибуты.
<style type="text/css">
  input { width: 50%; } 

  input:focus { width: 100%; } /* изменение происходит при фокусе (увеличивается ширина блока) */ 
</style>

<input type="text" placeholder="подсказка"/>
<style type="text/css">
  input:valid { border: 3px groove green; } /* при соответствии указанному типу */ 

  input:invalid { border: 3px groove red; } /* при несоответствии указанному типу */ 
</style>

<input type="email"/><input type="url"/>
<style>
  input:in-range { border: 3px groove green; } /* в пределах диапазона допустимых значений */ 

  input:out-of-range { border: 3px groove red; } /* за пределами диапазона допустимых значений */ 
</style>

<input type="number" max="10" min="1" value="5"><input type="number" max="10" min="1" value="11">
<style type="text/css">
input[type="radio"] + label ~ input[type="checkbox"],
input[type="radio"] + label ~ input[type="checkbox"] + label,
input[type="radio"] + label ~ input[type="checkbox"] + label + br { display: none; } 

input[type="radio"]:checked + label ~ input[type="checkbox"],
input[type="radio"]:checked + label ~ input[type="checkbox"] + label,
input[type="radio"]:checked + label ~ input[type="checkbox"] + label + br { display: inline-block; } /* изменение видно при установлении галочки */

:default{ background: yellow; } /* выделенный по умолчанию элемент формы */ 
</style>

<form>

<input type="radio" name="odin"/> <label>пункт</label>
<input type="checkbox"/> <label>подпункт</label>
<input type="checkbox"/> <label>подпункт</label>
<input type="radio" name="odin"/> <label>пункт</label>

<button>Кнопка 1</button>
</form>

выбрать пункт
подпункт
подпункт
выбрать пункт

Помимо :checked есть ещё :indeterminate. Но он может найти своё применение разве что с помощью jQuery (автор). А вместо остальных можно применить селектор с соответствующим атрибутом.

в теге есть атрибутв теге отсутствует атрибутописание атрибута
:read-only[readonly]:read-write:not([readonly])не может изменяться пользователем
:required[required]:optional:not([required])обязательное для заполнения
:disabled[disabled]:enabled:not([disabled])недоступным для активации, не может получить фокус

Структурные псевдоклассы

Пропускаю :root в связи с его заменой на html.

<style type="text/css">
b:nth-child(1) { color: red; }  /* или */  b:first-child { color: red; } 

b:nth-child(4) { color: blue; }  /* или */  b:nth-last-child(12) { color: blue; }

b:nth-child(8) { background: green; display: inline-block; padding: 3px; }  /* или */  b:empty { background: green; display: inline-block; padding: 3px; }

b:nth-child(15) { color: orange; }  /* или */  b:last-child { color: orange; }
</style>

<b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b></b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>

1 2 3 4 5 6 7 9 10 11 12 13 14 15 стиль присваивается одному (порядковый номер в скобках :nth-child) из одинаковых тегов, :first-child — для первого из однородных тегов, :last-child — для последнего, :empty — для пустого.

<style type="text/css">
b:not(.izo) { color: red; }  /* или */  b:not([title="без стиля"]) { color: red; }
</style>

<b>1</b> <b>2</b> <b title="без стиля">3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль присваивается всем элементам, кроме того, который содержит в первом случае или title=»без стиля» во втором.

<style type="text/css">
b:nth-child(n+9) { color: red; }

b:nth-child(-n+5) { color: orange; }
</style>

<b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль присваивается всем после/до определённого номера.

<style type="text/css">
b:nth-child(4n) { color: red; }
</style>

<b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль присваивается элементам, чередующимся на 4, другими словами 4, 4*2, 4*3 …

<style type="text/css">
b:nth-child(4n+5) { color: red; }
</style>

<b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль присваивается элементам, чередующимся на 4, но начинающимся спустя 5 цифр, а именно 5, 5+4, 5+4*2, 5+4*3 . ..

<style type="text/css">
b:nth-child(4n-5) { color: red; }
</style>

<b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 сразу перейдём к расчётам, а именно 4-5 (отрицательное число пропускается), 5-4*2, 5-4*3, 5-4*4 …

<style type="text/css">
b:nth-child(even) { color: red; }

b:nth-child(odd) { color: blue; }
</style>

<b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль применим ко всем чётным/нечётным.


Чтобы не утруждать себя подсчётами, можно воспользоваться nth-child tester page.

:nth-last-child действует аналогично, только подсчёт ведёт от последнего элемента.

<style type="text/css">
b:nth-of-type(3n) { color: red; }
</style>

<b>1</b> <span>☆</span> <b>2</b> <span>☆</span> <b>3</b> <span>☆</span> <b>4</b> <span>☆</span> <b>5</b> <span>☆</span> <b>6</b> <span>☆</span> <b>7</b> <span>☆</span> <b>8</b>

12345678 нужно выбрать цифры, заключённые в тег b, и среди них присвоить стиль только цифрам, заключённые в тег b и идущим через 3. То есть :nth-of-type осуществляет выборку элементов из указанного типа (их в примере выше 8).

<style type="text/css">
b:nth-child(3n) { color: red; }
</style>

<b>1</b> <span>☆</span> <b>2</b> <span>☆</span> <b>3</b> <span>☆</span> <b>4</b> <span>☆</span> <b>5</b> <span>☆</span> <b>6</b> <span>☆</span> <b>7</b> <span>☆</span> <b>8</b>

12345678 :nth-child берёт в расчёт все 15 элементов, но стиль присваивает в том случае, когда порядковая цифра и тег, в данном случае b, совпадают. То есть он выбрал бы и звезду между цифрами 3 и 4, если бы она была заключена в тег b.

:nth-last-of-type действует аналогично :nth-of-type, только подсчёт ведёт от последнего элемента.

<style type="text/css">
b:only-child { color: red; }
</style>

☆ <span><b>1.1</b> <b>1.2</b></span> ☆ <span><b>2.1</b></span> ☆ <span><b>3.1</b> <b>3.2</b></span> ☆

1.1 1.22.13.1 3.2 ☆ стиль действует, когда в родителе присутствует только один элемент. То есть в теге span содержится лишь один тег b.

Разницу между :first-child (см. первый пример Структурных псевдоклассов) и :first-of-type, :last-child и :last-of-type, :only-child и :only-of-type в отображении браузерами я не увидела.

Языковой псевдокласс

<style type="text/css">
:lang(en){ font-style: italic; }
</style>

<span lang="en"> ru - Russian; en - English; de - German; fr - French; it - Italian </span>

ru — Russian; en — English; de — German; fr — French; it — Italian для слов на английском языке будет присвоен наклонный стиль. Для большинства браузеров требуется атрибут lang.

: first-child,: last-child,: nth-child и: not (: nth-child)

Селектор : nth-child одновременно мощный и простой в использовании. Это позволяет нам нацеливать определенные элементы на основе их порядка по отношению друг к другу. Мы можем нацеливаться на что-то простое, например, 4-го ребенка, или что-то более сложное, например, на каждого 5-го ребенка, начиная со 2-го (2, 7, 12, 17,…). Зная основы, вы сможете писать мощный, быстрый, эффективный, расширяемый и умный CSS.

Использование селектора : nth-child часто помогает избавиться от необходимости в таких классах, как .товар - последний или . товар - чистый . Если вам нужно стилизовать итеративным способом, вы можете сохранить все стили, содержащиеся в вашем CSS, вместо добавления дополнительных классов в ваш HTML.

Лучше всего то, что селектор : nth-child был добавлен в CSS3 и поддерживается во всех основных браузерах. Это означает, что мы можем использовать его, не опасаясь проблем с поддержкой браузера.

Вот структура селектора : nth-child : an + b

  • (a) — Целое число, которое обеспечивает контекст для итерации (n)
  • (п) — Буква «н» буквально
  • (+/-) — Может быть «+» или «-» для построения селектора
  • (b) — целое число, обеспечивающее контекст в начальной точке

Вот пример реального селектора : nth-child : 3n — 2

  • а = 3
  • п = п
  • +/- = —
  • b = 2

Давайте повеселимся!

К настоящему времени вы, возможно, уже думаете о некоторых интересных вещах, которые можно сделать с помощью селектора: nth-child, но если нет, я собрал несколько примеров.Они начинаются с базовых, но становятся более сложными.

: первенец

Позволяет нам выбрать первого брата или сестру в группе

: последний ребенок

Позволяет нам нацеливаться на последнего брата или сестру в группе

: nth-ребенок (3n)

Позволяет нам ориентироваться на каждого третьего брата или сестру в группе

: n-й ребенок (n + 2)

Позволяет нам нацеливаться на всех братьев и сестер в группе, начиная со второго брата

: nth-ребенок (3n + 2)

Позволяет нам нацеливаться на каждого третьего брата в группе, начиная со второго брата

: эн-ребенок (-n)

Позволяет нам настроить таргетинг на всех братьев и сестер в группе, начиная с 0-го места и работая в обратном направлении (это не нацелено на каких-либо братьев и сестер, поскольку вы не можете работать в обратном направлении с 0-го места, поскольку нет -1-го брата)

: nth-ребенок (-n + 9)

Позволяет нам нацеливаться на каждого брата или сестру в группе, начиная с 9-го места и работая в обратном направлении

: nth-ребенок (-3n + 9)

Позволяет нам нацеливаться на каждого третьего брата или сестру в группе, начиная с 9-го места и работая в обратном направлении.

: not (: nth-child (4n))

Позволяет нам нацеливаться на каждого брата или сестру, который не является 4-м братом в группе

Использование селектора : nth-child может поднять ваш CSS на новый уровень.Это помогает вам писать организованный, эффективный и расширяемый код.

Если вам нужно больше, вы можете прочитать спецификацию, узнать больше из MDN или поэкспериментировать с собственными рецептами.

: нет () | CSS-уловки

Свойство : not () в CSS является псевдоклассом отрицания и принимает в качестве аргумента простой селектор или список селекторов. Он соответствует элементу, который не представлен аргументом. Переданный аргумент не может содержать дополнительных селекторов или селекторов псевдоэлементов.

Возможность использовать список селекторов в качестве аргумента считается экспериментальной, хотя на момент написания этой статьи она поддерживалась постоянно, включая Safari (с 2015 года), Firefox (с декабря 2020 года) и Chrome (с января 2021 года).

  / * аргумент X можно заменить любыми простыми селекторами * /
: not (X) {
  стоимость имущества;
}  

В этом примере у нас есть неупорядоченный список с одним классом на

  • :

      

    Наш CSS выберет все

  • элементов , за исключением элемента (ов) с классом .разные .

      / * Стилизуйте все, кроме класса .different * /
    li: not (.different) {
      размер шрифта: 3em;
    }  

    Вы также можете сделать то же самое, используя псевдоклассы, которые считаются простым селектором.

      p: not (: nth-child (2n + 1)) {
      размер шрифта: 3em;
    }  

    Однако, если мы используем селектор псевдоэлементов в качестве аргумента, он не даст ожидаемого результата.

     : not (:: first-line) {/ * :: first-line - это селектор псевдоэлементов, а не простой селектор * /
      цвет белый;
    }  

    Комплексные селекторы

      / * выбрать все 

    , которые не являются потомками

    * / p: not (article *) { }

    Визуальный пример

    Визуальное представление различных вариантов использования : not ()

    Специфичность

    Специфика псевдокласса : not — это специфика его аргумента.Псевдокласс : not () не добавляет специфичности селектора, в отличие от других псевдоклассов.

    Отрицания не могут быть вложенными, поэтому : not (: not (...)) никогда не допускается. Авторы также должны отметить, что, поскольку псевдоэлементы не считаются простым селектором, они не могут служить аргументом для : not (X) . Будьте внимательны при использовании селекторов атрибутов, поскольку некоторые из них не так широко поддерживаются, как другие. Допускается объединение : не селекторов с другими : не селекторов.

    Поддержка браузера

    Псевдокласс : not () был обновлен в спецификации CSS Selectors Level 4, чтобы разрешить список аргументов. В CSS Selectors Level 3 он мог принимать только один простой селектор. В результате поддержка браузером немного разделена между черновиками Уровня 3 и Уровня 4.

    Простые селекторы
    IE Edge Firefox Chrome Safari Opera
    9+ Все Все Все Все1+ Все
    Android Chrome Android Firefox Браузер Android iOS Safari Opera Mobile
    Все Все Все Все Все Все
    Списки выбора
    Настольный ПК
    Chrome Firefox IE Edge Safari
    88 84 Нет 88
    88 9 Мобильный
    Android Chrome Android Firefox Android iOS Safari
    88 85 81 9. 0-9,2

    Дополнительная информация

    Введение в селектор CSS nth-child | Мэтью Кроак

    odd

    Используя nth-child (odd) , вы можете применить CSS к каждому нечетному дочернему элементу. Если бы вы переписали приведенный выше CSS, чтобы повлиять на каждый нечетный элемент, тег p для Келли, Стэнли, Майкла и так далее стал бы красным.

    даже

    И наоборот, nth-child (even) применил бы CSS к Creed, Oscar, Jim и т. Д.

    формула (

    an + b )

    Помимо того, что значение n может быть любым числом, вы также можете использовать формулу. nth-child (3n) повлияет на каждый третий дочерний элемент. nth-child (3n + 1) будет применяться к каждому третьему элементу, начиная с первого. Умножение и деление не поддерживаются в формулах nth-child (n) . Давайте разберем этот формат формулы и посмотрим, что означает каждая часть для nth-child .

    a представляет размер цикла. Если a равно 3, это означает, что CSS применяется к каждому третьему элементу. См. Ниже p: nth-child (3n) .

    n — это счетчик, используемый для определения того, на какой из родственных элементов в группе повлияет воздействие. Сам по себе он относится к каждому дочернему элементу. p: nth-child (n) будет выбирать каждые p . Это немного избыточно, так как вы можете просто использовать p отдельно.

    b представляет значение смещения.Если вы посмотрите на предыдущий пример nth-child (3n + 1) , CSS будет применяться к каждому третьему элементу, изначально смещенному на единицу. Таким образом, для p: nth-child (3n + 1) будет затронут первый тег p , а затем — каждый третий тег. Смотри ниже.

    Как видите, затрагивается каждый третий тег p; итерация начинается после первой.

    Вы также можете использовать вычитание. В nth-child (3n-1) цикл равен 3, а n является счетчиком, что означает, что будет затронут каждый третий тег p .Но когда смещение равно -1, что по существу составляет 3n + (- 1) , вы должны начать свой цикл с одного элемента перед первым тегом p . Смотри ниже.

    Каждый третий тег p, начиная со второго из-за смещения -1

    Теперь, когда вы понимаете формульную опцию для nth-child , давайте проверим обратную операцию, отрицательный дочерний диапазон .

    : nth-child () | Codrops

    : nth-child () — это селектор псевдокласса CSS , который позволяет вам выбирать элементы на основе их индекса (исходного порядка) внутри их контейнера.

    Вы можете передать положительное число в качестве аргумента функции : nth-child () , которая выберет один элемент, индекс внутри его родительского элемента совпадает с аргументом : nth-child () . Например, li: nth-child (3) выберет элемент списка со значением индекса 3 ; то есть он выберет третий элемент списка.

    Вы также можете передать одно из двух заранее определенных ключевых слов: , четное, и , нечетное, . li: nth-child (even) выберет все элементы списка с четными индексными номерами (2, 4, 6, 8 и т. Д.), А li: nth-child (odd) выберет все элементы списка с нечетными порядковые номера (1, 3, 5, 7 и т. д.).

    : nth-child () также позволяет вам выбрать один или несколько элементов с помощью формулы (или уравнения) — a n + b — которая передается ему в качестве аргумента. Синтаксис: : nth-child ( a n + b ) , где вы заменяете a и b собственными целыми значениями, так что после n заменяется положительными числами (0, 1, 2, 3 и т. Д.), полученное число — это индекс элемента, который вы хотите выбрать. Например, : nth-child (3n + 1) выберет 1-го (3 * 0 +1 = 1) ребенка, 4-го (3 * 1 +1 = 4) ребенка, 7-го (3 * 2 +1 = 7 ) ребенок и т. д. и т. д.

    Что делает : nth-child ( a n + b ) , так это делит дочерние элементы контейнера на a элементов (последняя группа принимает остаток), а затем выбирает b -й элемент каждой группы.Итак, li: nth-child (3n + 1) разделит элементы списка на 3 группы, поместит остальные элементы в четвертую группу (если количество элементов не делится на 3), и тогда он будет соответствовать первый элемент в каждой группе.

    Например, на следующем изображении показан результат выбора li: nth-child (3n + 1) в списке элементов. В списке 10 элементов, и у нас a = 3 , поэтому 10 элементов будут разделены на 3. 10/3 = 3 + 1, поэтому останется один элемент, который будет сгруппирован в последнюю группу. собственное.Затем для каждой из четырех групп будет выбран первый элемент. На следующем изображении соответствующие элементы имеют фон цвета хаки.

    Результат применения: nth-child (3n + 1) в списке элементов. Элементы с синим цветом фона выбираются : nth-child (3n + 1) . Элементы разделены на 3 группы (черная рамка), и вы можете видеть, как сопоставляется первый элемент в каждой группе, включая дополнительную группу с остальными элементами.

    Когда вы передаете формулу в : nth-child () , браузер будет перебирать все дочерние элементы контейнера, а затем выбирать те, которые соответствуют формуле.Список элементов обрабатывается как элементы массива, где каждый элемент имеет индекс, который может совпадать или не совпадать с результатом формулы.

    Общая информация и примечания

    Выполнение вычислений для : nth-child может сбивать с толку и обескураживать. Кроме того, возможность визуализировать результаты и визуально выбирать элементы обычно намного проще, чем выполнять математические вычисления самостоятельно. Из-за этого были разработаны несколько действительно хороших инструментов, которые помогут вам визуализировать : nth-child .Для этого можно использовать следующие инструменты:

    Как и другие селекторы псевдоклассов, селектор : nth-child () может быть связан с другими селекторами, такими как : hover , и псевдоэлементами, такими как :: after , среди прочих. Например, следующее правило предоставит стили наведения для элементов, соответствующих формуле в : nth-child () :

    li: nth-child (2n + 3) :: after {
        / * здесь стили * /
    }
    
    tr: nth-child (даже): hover {
        цвет фона: светло-голубой;
    }
                     

    Существует селектор псевдокласса, функциональность которого аналогична таковому у : nth-child () , этот селектор — селектор : nth-last-child () . : nth-last-child () похож на : nth-child , за исключением того, что вместо итерации по элементам от первого вниз, он начинает итерацию с последнего элемента вверх.

    : nth-child () также похож на : nth-of-type () , за исключением того, что последний более конкретен — он выбирает элементы на основе заданной формулы , только если элемент имеет определенный тип . Вы можете узнать больше об этом в записи : nth-of-type () .

    Сравнение псевдоклассов CSS: nth-child vs nth-of-type

    Введение

    CSS имеет ряд псевдоклассов, которые помогут вам легко стилизовать ваше приложение. Наличие большого количества вариантов может быть отличным, но также может сбивать с толку понимание того, какой псевдокласс использовать и что он на самом деле делает. Здесь мы рассмотрим псевдоклассы CSS nth-child и nth-of-type , чтобы лучше понять, когда использовать каждый из них и в чем разница.

    Псевдоклассы CSS nth-child и nth-of-type интересны по сравнению с другими типами псевдоклассов, потому что они выбирают элементы на основе их положения в DOM. В то время как некоторые псевдоклассы выбирают конкретное состояние элемента (например, псевдоклассы hover, active, target), nth-child и nth-of-type больше связаны со структурой вашей разметки.

    Предварительные требования

    Настройка HTML

    Чтобы понять разницу между nth-child и nth-of-type , давайте сначала создадим наш HTML, чтобы знать, что мы будем стилизовать.

    Допустим, у нас есть раздел на нашей веб-странице, который содержит элементы заголовка (

    ,

    ) и абзаца (

    ).

      <статья>
       

    Вот заголовок

    Я - абзац со всевозможной информацией.

    Давайте добавим еще один абзац для развлечения.

    йадда йадда йадда

    бла-бла-бла

    йадда йадда йадда

    Вот подзаголовок

    бла-бла-бла

    И, может быть, еще один.

  • Эта разметка будет выглядеть примерно так:

    Всего у нас есть

    элемент в качестве родительского и девять дочерних элементов: один

    , один

    и семь

    тегов.

    nth-child и nth-of-type Синтаксис

    Есть несколько вариантов того, какие значения можно передать псевдоклассам nth-child и nth-of-type .Здесь используется nth-child , но его также можно заменить на nth-of-type .

    • : nth-child (2n + 3) : для этого параметра требуются математические вычисления. Цифры на ваше усмотрение; это n , который будет отличаться. Это возьмет выбранные вами элементы, установит n на 0 для начала и будет увеличиваться оттуда. Таким образом, аналогично циклу для в JavaScript, он будет перебирать выбранные вами элементы, обновляя значение n : 2 (0) +3 = 3 , 2 (1) +3 = 5 , 2 (2) +3 = 7 и так далее. Результатом этого будет выбор третьего, пятого, седьмого и т. Д. Элементов.
    • : nth-child (odd / even) : строки odd или even могут быть переданы для выбора доступных нечетных и четных элементов.
    • : nth-child (3n) : вы также можете передать число с переменной n , которая выберет этот интервал вхождения выбранного элемента. Если передано 3 , он выберет третий, шестой, девятый и т. Д. Элементы.
    • : nth-child (3) : если вы просто передадите число (без n ), он выберет именно этот элемент из DOM. При передаче 3 будет выбран только третий соответствующий элемент.

    Использование CSS

    nth-child Псевдо-класс

    Псевдокласс nth-child имеет два важных компонента, которые следует учитывать:

    • выбранные элементы, к которым будет применен псевдокласс.
    • значение, переданное псевдоклассу.

    Если мы перейдем к нашей таблице стилей CSS для примера HTML выше, мы можем выбрать наши элементы абзаца и сделать цвет шрифта бордовым следующим образом:

      артикул п {
      цвет: бордовый;
    }
      

    Допустим, мы хотим, чтобы все остальные элементы абзаца были желтоватого цвета. Мы можем применить псевдокласс nth-child , чтобы применить новый цвет только к каждому другому дочернему элементу, являющемуся абзацем.

      article p: nth-child (odd) {
      цвет: золотарник;
    }
      

    Теперь наши абзацы меняют цвет, но вы заметили, что произошло после подзаголовка? Бордовый цвет был повторен, а затем снова стал желтым.Давайте посмотрим, почему это произошло.

    Определение, какие элементы выбраны с помощью

    nth-child

    В нашем примере выше абзацы, которые соответствуют стилю p: nth-child (odd) , должны соответствовать следующим требованиям в следующем порядке:

    • они являются нечетным потомком родительского элемента
    • они являются элементом абзаца

    Определение четности или нечетности дочернего элемента — это , а не для конкретного типа. Это означает, что проверка нечетности / четности просматривает всех дочерних элементов в родительском элементе того, что выбирается (элементы абзаца), а затем ищет все абзацы, которые считаются нечетными элементами.

    Абзацы, к которым применен желтый стиль шрифта, являются «нечетными» дочерними элементами и являются элементами абзаца (

    ). Это объясняет, почему абзац после подзаголовка в конечном итоге становится бордовым цветом по умолчанию — на самом деле это «четный» дочерний элемент.

    Использование CSS

    nth-of-type Псевдокласс

    nth-of-type очень похож на псевдокласс nth-child . Основное отличие состоит в том, что он специально рассматривает тип выбираемого элемента перед проверкой любой другой логики.

    Давайте воспользуемся вышеприведенным примером, но вместо этого применим nth-of-type .

      <статья>
       

    Вот заголовок

    Я - абзац со всевозможной информацией.

    Давайте добавим еще один абзац для развлечения.

    йадда йадда йадда

    бла-бла-бла

    йадда йадда йадда

    Вот подзаголовок

    бла-бла-бла

    И, может быть, еще один.

      артикул п {
      цвет: бордовый;
    }
    
    article p: nth-of-type (odd) {
      цвет: золотарник;
    }
      

    Цвет по умолчанию по-прежнему темно-бордовый, но теперь мы выбираем только нечетные элементы абзаца.

    Стили теперь применяются, если элемент соответствует следующему требованию:

    • Элемент — это абзац с родительским элементом article.
    • Из выбранных выше абзацев выбираются только нечетные.

    Если мы снова посмотрим на это с аннотациями, станет немного яснее, как они выбираются.

    Заголовки (

    ,

    ) вообще не рассматриваются с nth-of-type , потому что мы выбираем по типу элемента. В этом случае нас интересуют только элементы

    .


    Используете ли вы nth-child или nth-of-type , в конечном итоге будет зависеть от вашей цели стилизации.

    Как правило, если вы хотите выбрать интервал селектора независимо от типа элемента, используйте nth-child . Однако, если вы хотите выбрать только определенный тип и применить оттуда выбор интервала, используйте nth-of-type .

    Заключение

    Селекторы nth-child и nth-of-type имеют отличную поддержку браузера. Проверьте nth-child и nth-of-type на CanIUse.com для получения более подробной информации.

    Для более полного обзора языка разметки HTML5 ознакомьтесь с нашей серией статей «Как создать веб-сайт в HTML».

    Селекторы псевдоклассов — Мастерская по макету CSS

    Селектор псевдокласса действует так, как если бы вы добавили класс к элементу в вашей разметке.

    Мастерская по макету CSS: селекторы псевдоклассов

    Вы, вероятно, знакомы как минимум с двумя селекторами псевдокласса, теми, которые мы используем для выбора состояний ссылки.

      a: ссылка {}
    а: посетил {}  

    Эти селекторы работают так, как если бы они добавляли класс в зависимости от состояния ссылки. В этом случае независимо от того, посещена ли ссылка или нет.

    Другие псевдоклассы, которые мы могли бы использовать для ссылки, на самом деле динамических псевдоклассов . Они применяются в зависимости от того, что происходит в документе. Ссылка, на которую наведен курсор, добавлена ​​вкладка или активирована.

      a: hover {}
    a: active {}
    a: focus {}  

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

    У нас есть еще несколько полезных псевдоклассов, с которыми можно поиграть.

    : первенец

    Назначьте элемент, если он является первым дочерним элементом родительского элемента.

    Селектор first-child был частью CSS2.1. В этом примере у нас есть набор абзацев.

      

    Абзац первый.

    Абзац второй

    Чтобы применить CSS только к первому абзацу внутри оболочки , мы используем селектор first-child.

      .wrapper p: first-child {}  

    Это работает, только если есть элемент абзаца как первый элемент непосредственно внутри этого контейнера. Если мы добавим здесь заголовок первого уровня, то селектор first-child больше не будет выбирать абзац.

    : последний ребенок

    Целевой элемент, если он является последним дочерним элементом родительского элемента.

    Спецификация Selectors Level 3 принесла нам несколько новых селекторов псевдокласса. Селектор last-child похож на first-child, за исключением того, что он нацелен на последнего дочернего элемента родителя.

      .wrapper p: last-child {}  

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

    : ребенок

    Выберите несколько элементов в соответствии с их положением в дереве документа.

    Селектор nth-child действительно очень полезен. Простым примером является использование этого селектора для чередования строк таблицы.

      <таблица>
      
         Имя 
         Любимый цвет 
         Любимое животное 
      
      
         Рэйчел 
         Фиолетовый 
         Кот 
      
        
         Джо 
         Розовый 
         Альбатрос 
      
        
         Элоиза 
         Зеленый 
         Слаг 
      
      

    Мы можем применить CSS к нечетным строкам с помощью следующего селектора.

      tr: nth-child (odd) {} ​​ 

    Или четных строк:

      tr: nth-child (even) {}  

    Эти ключевые слова — не единственный способ использовать nth-child. Мы можем настроить таргетинг на конкретную строку. Этот селектор только выберет строку 2.

      tr: nth-child (2) {}  

    Значение ключевого слова odd равно этому селектору, в котором мы выбираем первый элемент и каждый второй элемент после него.

      tr: nth-child (2n + 1) td {}  

    Есть несколько отличных ресурсов, которые помогут вам понять, как работает nth-child.Вместо того, чтобы воспроизводить все это, взгляните на:

    : n-й тип

    Выберите несколько элементов в соответствии с их положением в дереве документа, НО только те элементы, которые совпадают с типом, к которому применяется правило.

    После того, как вы разобрались с тем, как работает nth-child, вы можете использовать тот же синтаксис для nth-of-type . Этот селектор выбирает только те элементы, которые относятся к тому же типу, что и элемент, к которому он применяется.

    В моем примере ниже показаны заголовки и абзацы.

    Чтобы применить CSS ко всем остальным абзацам, но игнорировать заголовки, я мог бы использовать следующий селектор.

      p: nth-of-type (odd) {} ​​ 

    : только ребенок

    Псевдокласс only-child будет соответствовать, если элемент является единственным дочерним элементом родительского элемента — например, список с одним элементом списка.

      li: только ребенок {}  

    Это может быть полезным селектором при проектировании переменного количества контента, поступающего из CMS.

    : пусто

    пустой псевдокласс будет соответствовать, если элемент полностью пуст или содержит только HTML-комментарий.

      п: пусто {}  

    Не будет совпадать, если внутри элемента есть пробелы.

      

    пустой псевдокласс будет соответствовать первым двум, но не последнему абзацу.

    : не

    Псевдокласс , а не позволяет вам что-то делать, если селектор не совпадает.Селектор, который вы хотите исключить, находится внутри круглых скобок. В приведенном ниже примере мы делаем шрифт жирным, если он не находится внутри td с классом animal .

      td: not (.animal) {
      font-weight: жирный;
    }  

    nth-ребенок против nth-of-типа

    Селекторы nth-child () и nth-of-type () являются «структурными» псевдоклассами, которые позволяют нам выбирать элементы на основе информации в дереве документа, которая обычно не может быть представлена другие простые селекторы.

    В случае nth-child () и nth-of-type () дополнительная информация — это позиция элемента в дереве документа по отношению к его родителю и братьям и сестрам. Хотя эти два псевдокласса очень похожи, они работают по-разному.

    Как работает

    nth-child ()

    Псевдокласс nth-child () используется для сопоставления элемента на основе числа, которое представляет позицию элемента среди его братьев и сестер.Более конкретно, число представляет количество братьев и сестер, которые существуют перед элементом в дереве документа (минус 1).

    Это число выражается как функция, an + b , где n — это индекс, а a и b — любые передаваемые нами целые числа. Например, чтобы выбрать каждый элемент, мы могли бы написать любое из следующего —

     : nth-child (1n + 0) {/ * стили * /}
    : nth-child (n + 0) {/ * стили * /}
    : nth-child (1n) {/ * стили * /}
      

    В дополнение к этой функции мы можем передать одно целое число e. грамм. : nth-child (1) или используйте одно из заданных ключевых слов, нечетное или четное . Эти ключевые слова являются альтернативой написанию функциональной записи для выбора каждого нечетного или четного элемента.

     : nth-child (odd) {/ * стили для нечетных элементов * /}
    : nth-child (2n + 1) {/ * стили для нечетных элементов * /}
    
    : nth-child (even) {/ * стили для четных элементов * /}
    : nth-child (2n + 0) {/ * стили для четных элементов * /}
      

    При использовании : nth-child () отдельно, достаточно просто предсказать, какой элемент будет выбран.Например, используя эту разметку —

      

    Это абзац .

    Это абзац .

    Это абзац .

    Это разделитель .
    Это разделитель .

    Это абзац .

    Это абзац .

    Это разделитель .

    Это абзац .

    Это разделитель .

    Если бы мы хотели выбрать пятый элемент, div, мы могли бы просто написать следующее —

      .example: nth-child (5) {background: # ffdb3a; }
      

    Однако могут возникнуть непредвиденные результаты, если существует несколько типов элементов, и нам нужно объединить псевдокласс : nth-child () с селекторами типа или класса.Например, чтобы снова выбрать тот же самый элемент div, у нас может возникнуть соблазн написать следующее —

      .example div: nth-child (2) {background: # ffdb3a; }
      

    Примечание — работать не будет

    Причина, по которой это не сработает, заключается в том, что элемент, на который нацелен селектор, на самом деле не существует. Используя указанный выше селектор, пользовательский агент выполнит следующие шаги —

    1. Выберите все дочерние элементы . Пример
    2. Найдите второй элемент в этом списке, независимо от типа
    3. Проверить, является ли этот элемент типом div

    Поскольку второй элемент в дереве документа является абзацем, а не блоком div, ничего не выделяется. Если бы мы хотели выбрать второй элемент div, нам пришлось бы использовать псевдокласс nth-of-type () .

    Как работает

    nth-of-type () Работает

    Псевдокласс nth-of-type () , например nth-child () , используется для сопоставления элемента на основе числа. Это число, однако, представляет позицию элемента в пределах только тех из его братьев и сестер, которые относятся к тому же типу элемента .

    Это число также может быть выражено как функция или с помощью ключевых слов четный или нечетный .Используя пример разметки выше, мы можем выделить все нечетные абзацы, написав —

      .example p: nth-of-type (odd) {background: # ffdb3a; }
      

    Когда мы используем этот селектор, пользовательский агент выполняет следующие шаги —

    1. Выберите все дочерние элементы . Example , которые имеют тип p
    2. Создать новый список только из этих элементов
    3. Выберите нечетные числа из этого списка

    Из-за этого теперь мы можем выбрать второй div, пятый дочерний элемент . например

      .example div: nth-of-type (2) {/ * стили * /}
      

    Другие псевдоклассы «nth»

    Помимо nth-child () и nth-of-type () , есть ряд других структурных псевдоклассов, которые мы можем использовать для выбора элементов на основе их положения в пределах их братьев и сестер. Подобно nth-child () и nth-of-type () , они делятся на две группы: те, которые не зависят от типа , например nth-child () , и те, которые являются зависящий от типа , например nth-of-type () .

    nth-child () nth-of-type ()
    nth-последний-ребенок () nth-последний-тип ()
    первенец () первоклассный ()
    последний ребенок () последний тип ()
    только ребенок () только тип ()

    Отсчет от конца —

    nth-last-child () vs nth-last-of-type ()

    Эти псевдоклассы работают как nth-child () и nth-of-type () , но они начинают отсчет с последнего элемента в группе братьев и сестер вместо первого.

      .example: nth-last-child (1) {background: # a6cae7; }
    .example p: nth-last-of-type (1) {фон: # ffdb3a; }
      

    Первый элемент —

    первый ребенок () против первый ребенок ()

    Псевдоклассы first-child () и first-of-type () выбирают первый элемент. Их можно представить как использующие псевдоклассы nth-child () и nth-of-type () , но просто передавая значение 1.

      .example: first-child () {/ * стили * /}
    .example: nth-child (1) {/ * стили * /} / * то же, что и выше * /
    
    .example: first-of-type () {/ * стили * /}
    .example: nth-of-type (1) {/ * стили * /} / * такие же, как указано выше * /
      

    Последний элемент —

    last-child () vs last-of-type ()

    Это противоположность псевдоклассам first-child () и first-of-type () . Их можно рассматривать как использование псевдоклассов nth-last-child () и nth-last-of-type () , но с передачей значения 1.

      .example: last-child () {/ * стили * /}
    .example: nth-last-child (1) {/ * стили * /} / * такие же, как указано выше * /
    
    .example: last-of-type () {/ * стили * /}
    .example: nth-last-of-type (1) {/ * стили * /} / * такие же, как указано выше * /
      

    The Only Element —

    only-child () против only-of-type ()

    Наконец, эти псевдоклассы выберут единственный дочерний элемент. Для only-child () элемент должен быть буквально единственным дочерним элементом своего родителя, независимо от типа.Для only-of-type () элемент должен быть только единственным дочерним элементом своего типа.

      .example: only-child () {/ * стили * /}
    
    .example p: only-of-type () {/ * стили * /}
      
    .

    alexxlab

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *