Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.05.2015, 15:36
Аватар для aeroseo
Новичок на форуме
Отправить личное сообщение для aeroseo Посмотреть профиль Найти все сообщения от aeroseo
 
Регистрация: 04.05.2015
Сообщений: 2

Фиксация DIV при скролле. Дайте совет.
Был взят за основу скрипт, переделан под себя - завязал на margin-top.
Задача была: при скролле, левая колонка доезжает до футера и встает.
Итог: до футера она доезжает, встает, но: футер пропадает и непонятный дрыг.
Лицезреть сие можно: тут
Как видим, к стилю aside добавляется style="margin-top.
Но отчет начинается не с нуля, а с неведомо откуда взявшегося значения "31px".
Есть кто вразумит советом? Или предложит альтернативный вариант решения вопроса.
Сразу оговорюсь, в js не особо силен.

Собственно, сабж:
$(document).ready(function(){
// определяем константы
var el = $('#column-left');
var max_down = $('#footer').outerHeight(true);
var doc = $(document);
var win = $(window);
var el_top = el.offset().top;
var head_h = $('#header').height();
 
var main_position = {
'margin-top': el.css('marginTop')
}
// задаем начальное позиционированние элементу
el.css(main_position);
// только в случае если высота документа больше чем высота левой колонки
if(doc.height() - max_down > el_top + el.height()) {
// для определения в какую сторону был скролл
var up_down = 0;
// вешаем событие на скролл
$(window).scroll(function () {
// если проскроллили до элемента
if (doc.scrollTop() >= el_top) {
// скролл вниз
if (is_down()) {
// если нижняя граница элемента выше чем нижняя граница экрана
if (el.offset().top + el.height() < doc.scrollTop() + win.height()) {
// определяем высоту ниже которой нельзя опускать
var max_top = doc.height() - max_down - el.height();
// если элемент меньше экрана пользвоателя
// то просто привязываем его к верху страницы
if (win.height() > el.height()) {
var top = doc.scrollTop();
} else {
var top = doc.scrollTop() - (el.height() - win.height());
}
// если высота ниже максимальной
if (top > max_top) {
top = max_top;
}
el.css({
'margin-top': top - head_h + 'px'
});
}
} else {
// если высота проскролености меньше верха элементка
if (doc.scrollTop() < el.offset().top) {
el.css({
'margin-top': doc.scrollTop() - head_h + 'px'
});
}
}
} else {
// если до верха элемента недоскролили
el.css({
'margin-top': el_top - head_h + 'px'
});
}
});
// определяем вниз ли был скролл
function is_down() {
var is_up = doc.scrollTop() > up_down;
up_down = doc.scrollTop();
return is_up;
}
} else {
// если высота документа меньше левой колонки то присваиваем ему старый css
el.css(main_position);
}
});

Последний раз редактировалось aeroseo, 04.05.2015 в 16:01.
Ответить с цитированием
  #2 (permalink)  
Старый 04.05.2015, 16:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

aeroseo,
Плавающий блок, замирающий над футером
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При клике ссылки, открыть DIV блок, и при клике ещё раз, закрыть его Simon Общие вопросы Javascript 59 28.05.2017 17:31
Как сделать? Выделение текста в div при нажатии на ссылку Olena Элементы интерфейса 3 01.03.2015 19:01
Как перезапустить скрипт, при скролле верх? salofun jQuery 2 22.02.2015 19:59
Заменить class в div при скролле страницы EvilDoom Общие вопросы Javascript 3 10.10.2014 15:56
Подгрузка контента в определённый DIV при нажатии на ссылку, без перезагрузки страниц Flashton Events/DOM/Window 0 10.03.2010 19:53