#jquery #jquery-selectors
#jquery #jquery-селекторы
Вопрос:
Я пытаюсь имитировать, как gMail прикрепляет заголовок к началу при прокрутке, когда проходит определенную часть.
Код:
$(window).scroll(function() {
$('.the-post').each(function() {
var elem = $(this),
y = $(window).scrollTop(),
maxY = elem.children('.body').offset().top,
header = elem.children('.header'),
scrollHeight = 24;
if(y >= maxY-scrollHeight) {
$('.afloat').remove();
header
.clone()
.appendTo('.post')
.addClass('afloat');
setSizes()
} else $('.afloat').remove()
})
})
Я использую .clone(), потому что я не хочу прерывать высоту страницы. При простом добавлении класса возникает небольшой толчок, и это именно то, чего я хочу избежать.
Однако он делает это только в ОДНОМ из сообщений. Может кто-нибудь понять, почему?
Я также хочу прекратить выполнение функции, как только появится заголовок и окно окажется в пределах границ.
Обновить
Итак, я понял это. Проблема с приведенным выше кодом заключалась в операторе else, он слишком быстро удалял divs. Я немного улучшил его и хотел бы получить больше информации, но это работает хорошо и без перегрузки:
$(window).scroll(function() {
var y = $(this).scrollTop();
if(y >= maxY-24) {
if(!isset) {
isset = true;
$('.post').append(header
.clone()
.addClass('afloat')
)
}
$('.the-post').each(function() {
var elem = $(this),
maxY = elem.children('.body').offset().top,
header = elem.children('.header');
if(y >= maxY-24 amp;amp; y <= maxY 24) {
newtext = header.children('em').text();
if(newtext != curtext) {
curtext = newtext;
$('.afloat').text(newtext)
}
}
})
} else {
isset = false;
$('.afloat').remove()
}
})
Мне пришлось переделать логику здесь. Я сразу же создал статический заголовок, как только он был применим, так что мне не нужно продолжать клонировать divs.
Затем я просматриваю divs (.the-post) с каждым из них и сделал его методом диапазона, чтобы предотвратить дополнительные, бесполезные запросы.
Комментарии:
1. проверьте, нет ли ошибок где-нибудь в середине кода, обычно это причина, по которой скрипт выполняется только для одного элемента. Я думаю, что это может быть заголовок этой строки.clone()
2. Я понял это, он слишком быстро удалял элементы!
3. опубликуйте свой ответ, чтобы я мог выбрать его по пунктам, если хотите
Ответ №1:
Ответ таков:
$(window).scroll(function() {
var y = $(this).scrollTop();
if(y >= maxY-24) {
if(!isset) {
isset = true;
$('.post').append(header
.clone()
.addClass('afloat')
)
}
$('.the-post').each(function() {
var elem = $(this),
maxY = elem.children('.body').offset().top,
header = elem.children('.header');
if(y >= maxY-24 amp;amp; y <= maxY 24) {
newtext = header.children('em').text();
if(newtext != curtext) {
curtext = newtext;
$('.afloat').text(newtext)
}
}
})
} else {
isset = false;
$('.afloat').remove()
}
})