Рассмотрю два метода, которые похожи внешне и внутренне, как может показаться с первого взгляда. Однако, между ними есть тонкая разница.
Метод first
Метод
призван возращать первый элемент из коллекции (выборки) этих элементов. Как всегда, чтобы не быть голословным и иметь наглядный пример перед глазами, приведу ниже HTML-разметку, на которой буду тренироваться:1
first()
Вот такая большая разметка
с четырьмя блоками 1
div class="wrapper"
, у каждого из которых есть элементы-потомки 1
ul class="block"
.1
li class="block__item"
И создам небольшой скрипт на JS/jQuery такого плана:
Работа вышеприведенного js-кода будет сводиться к следующему:
- создается переменная
, в которую помещается результат выборки1
wrapper
1
$('.wrapper')
- в переменной
находим элемент1
wrapper
, который является первым в коллекции -1
li
1
.find('li:first')
- этому элементу добавляется класс -
1
.addClass('block__item--firstSimple')
Код несложный и вроде бы все понятно. Но вот вопрос - а какой элемент
с точки зрения данного кода является первым в коллекции?1
li
Чтобы не ломать понапрасну голову, приведу сразу ответ:
Вот так - только он один и только этот элемент является первым в коллекции элементов
.1
li
Это объяснимо, если слегка подумать. В переменной
хранится коллекция элементов; и элементов 1
wrapper
- в том числе.1
li
Коллекция элементов - это не что иное, как массив. А в массиве только один элемент может быть первым. То есть, иметь индекс 0.
Именно поэтому метод
- это всего лишь синоним (alias) другого, более универсального метода 1
.first()
и может быть записан таким способом - 1
.eq()
- вернуть элемент с нулевым индексом, то есть - первый элемент массива.1
.eq(0)
Антагонистом метода
является метод 1
.first()
, который возвращает последний элемент массива. И метод 1
last()
также можно записать по другому - 1
.last()
; это также вернет последний элемент массива.1
.eq(-1)
Ок, с методом
вроде разобрались. Двигаемся дальше и рассмотрим метод 1
.first()
.1
.first-child()
Метод first-child()
Казалось бы, в чем разница? Трудно догадаться, поэтому сразу приведу js-код с описанием работы. В качестве подопытной HTML-разметки будет выступать все та же, приведенная в самом начале статьи.
Что делает приведенный выше код? А вот что:
- создает переменную
и присваивает ей значение выборки - $(‘.wrapper’)1
wrapper
- в переменной
находим первый элемент1
wrapper
-1
li
1
.find('li:first-child')
- этому элементу присваивается класс -
1
.addClass('block__item--firstChild')
Все просто и вроде бы точно также, как и в случае с методом
. Вроде бы да, но возникает вопрос - а какой элемент 1
.first()
данный код считает первым в данном случае?1
li
Чтобы не гадать, снова приведу готовый ответ:
Вот она - разница в подходе отбора первого элемента. Другими словами, метод
находит все элементы, которые являются первыми потомками у своих непосредственных родителей. А в данном случае таких потомков насчиталось аж 4 штуки.1
.first-child()
Конечно, можно провести аналогию и рассмотреть метод
. Но мне кажется, смысла в этом особого нет - все и так понятно. Выборка будет производиться с точностью до наоборот и будут отбираться последние потомки своих неспосредственных родителей.1
.last-child()
На этом думаю закончить сравнительный обзор двух методов -
и 1
.first()
.1
.first-child()