Из всех библиотек JavaScript, jQuery, возможно, имеет синтаксис селектора, наиболее близкий к CSS, и это облегчает погружение авторов CSS, даже несмотря на то, что есть 52 селектора на выбор.  Если вам нравятся CSS :first-child :hover или :only-child , в меню есть 34 аналогичных «псевдо» селектора псевдоклассов.  Поговорим о избалованном выборе! Если вам нужно больше, чем собственные селекторы jQuery, такие как :animated :exactIgnoreCase() :not() и :visible — существует множество пользовательских селекторов из сообщества (таких как :exactIgnoreCase() :nothidden , или :loaded() ), чтобы заполнить любые пробелы. Все это означает, что вам не нужно беспокоиться об обучении написанию пользовательских селекторов — верно?  Неправильно! Чем проще задание выполнить, тем больше вероятность того, что оно будет выполнено.  Вот тест для вас: попросите нового разработчика использовать (не говоря уже о понимании) этот код: 
 if ($(el).offset().top > $(window).scrollTop() - $(el).outerHeight(true) && $(el).offset().top < $(window).scrollTop() + $(el).outerHeight(true) + $(window).height()){ //do something} 
Теперь попросите их примерить это для размера:
 if ($(el).is(":inview")) { //do something} 
Никаких наград за то, что каждый из этих фрагментов делает одно и то же, и что вторая версия получит гораздо больше пользы. Оба проверяют, находится ли элемент в настоящее время в области просмотра. Если вы обнаружите, что у вас есть длинное условие для получения логического значения, или ваш логический тип true / false снова и снова появляется, возможно, вы нацелены на создание пользовательского выражения для ваш селектор. И сделать их вряд ли может быть проще:
 jQuery.extend(jQuery.expr[':'], { //$.extend($.expr[':'] is just as good expression: function () { //establish boolean to be returned, or return false; }}); 
  Выражение — это то, что будет вызываться в вашем селекторе… оно может быть inview , loaded или не nothidden . Функция — это то, что вы ожидаете.  Мы добавили return false , так как это то, что вы хотите, чтобы функция делала как минимум.  Кроме этого, используйте любые методы, которые вам нужны, чтобы вернуть логические значения, которые приведут ваш селектор в действие. inview сначала запустим наш селектор inview : 
 jQuery.extend(jQuery.expr[':'], { inview: function (el) { if ($(el).offset().top > $(window).scrollTop() - $(el).outerHeight(true) && $(el).offset().top < $(window).scrollTop() + $(el).outerHeight(true) + $(window).height()) { return true; } return false; }}); 
Код далеко не оптимизирован, но работает. Для тестирования мне нравится добавлять селекторы в их собственный блок скрипта между включением jQuery и моим рабочим блоком скрипта. Для производства, однако, вы можете включить их как плагин. Добавьте его на страницу, и вы можете использовать его несколькими способами:
 $("p:inview").css("color","orange"); 
или
 $("p").filter(":inview").each(function(){ //do something}); 
или
 if ($("p#desc").is(":inview")) { //do something} 
  Теперь давайте посмотрим на некоторые оптимизации.  Прямо из коробки мы видим некоторое повторение, которое мы можем кэшировать, включая некоторые повторяющиеся объекты.  Поскольку мы только возвращаем true или false , мы можем просто вернуть наше условие, и мы будем в пути: 
 jQuery.extend(jQuery.expr[':'], { inview: function (el) { var $e = $(el), $w = $(window), top = $e.offset().top, height = $e.outerHeight(true), windowTop = $w.scrollTop(), windowScroll = windowTop - height, windowHeight = windowTop + height + $w.height(); return (top > windowScroll && top < windowHeight); }}); 
  И мы там!  Мы расширили механизм выражений jQuery, и наш код оптимизирован и доступен для чтения. Это не единственный селектор стиля «на виду», который вы найдете в Интернете, но наш — это эволюция.  Он учитывает высоту элемента, так что он сообщает об true пока элемент частично находится в viewport.jQuery — это естественный элемент настройки, и он дает вам отличный способ намочить ноги перед тем, как приступить к использованию .extend() для создания плагинов. 
Если вы хотите узнать больше от Крейга, ознакомьтесь с jQuery: от новичка до ниндзя , книги, которую он написал совместно с Эрлом Каследином.