Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.02.2020, 01:07
Кандидат Javascript-наук
Отправить личное сообщение для drkrol Посмотреть профиль Найти все сообщения от drkrol
 
Регистрация: 09.10.2013
Сообщений: 114

Константа, чё она рыпается?
Здравствуйте... Мужики, я сейчас плакать уже начну.

Не очень важное предисловие
Есть кастомная прокрутка для сайта. Работает так: считывает дефолтную прокрутку и двигает весь сайт на это расстояние, но уже плавно. А весь сайт это время находится в position:fixed. Разумеется внутри сайта position fixed и position sticky не работают, хотя последний мне и нужен.

Суть
Я пытаюсь реализовать position sticky через JS, но ПОЧЕМУ-ТО (!!!), когда значения положения блока находятся В КОНСТАНТЕ, ТО ЭТОТ ЗАФИКСИРОВАННЫЙ БЛОК ДЁРГАЕТСЯ, но если я ему в ЛОБ пропишу значение (ПРЯМ ЦИФРАМИ), то ПОЧЕМУ-ТО (WTF?!) НИ-ЧЕ-ГО НЕ ТРЯСЁТСЯ!

Проблема в этом куске кода
stickyElems.forEach(elem => {
      const topka = elem.getBoundingClientRect().top;
      const y = gsap.getProperty(elem, "y");
      const wheight = document.documentElement.clientHeight;

      if (y >= elem.parentNode.clientHeight - elem.clientHeight &&
        elem.parentNode.getBoundingClientRect().top + scroller.y + elem.parentNode.clientHeight - elem.clientHeight <= scroller.y) {
        gsap.set(elem, {y: elem.parentNode.clientHeight - elem.clientHeight});
        console.log('Фиксация внизу')

      } else if (topka <= 0 || y > 0) {
        gsap.set(elem, {y: scroller.y - topka});
        console.log('ЕДЕТ')

      } else {
        gsap.set(elem, {y: 0});
        console.log('Блок находится в начале.')
      }
    });


Беда в константе topka, а именно в строчке gsap.set(elem, {y: scroller.y - topka});
Она назначается в начале и устанавливается в размере положения самого элемента. К примеру (!) это значение равно 500. Вот если прописать заместо topka именно gsap.set(elem, {y: scroller.y - 500});, то на моё удивление всё будет нормально работать. Ля, ну это лучше видеть)
Вот вам вариант с психованным блоком:
https://jsfiddle.net/w6c2jz4L/2
А вот нормальный
https://jsfiddle.net/w6c2jz4L/3

Вопрос
ГДЕ Я ОШИБСЯ?
И что нужно написать, шоб оно работало?
Ответить с цитированием
  #2 (permalink)  
Старый 26.02.2020, 08:43
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Весь код не хочется отлаживать.
Но поставьте
console.log('ЕДЕТ', topka)
Значение пляшет (у меня от -0.9 до 500).
Что то двигает элемент вниз
Ответить с цитированием
  #3 (permalink)  
Старый 26.02.2020, 09:40
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Чисто по логике, не вникая в детали алгоритма.
500 оно всегда 500. При каждом вызове функции.
Но topka вычисляется в теле функции и каждый раз разная.
Может ее надо вычислять до того, как начнется это цикл вызовов функции?
Ответить с цитированием
  #4 (permalink)  
Старый 26.02.2020, 11:48
Кандидат Javascript-наук
Отправить личное сообщение для drkrol Посмотреть профиль Найти все сообщения от drkrol
 
Регистрация: 09.10.2013
Сообщений: 114

Это ведь константа. Вас это не смущает?
Ответить с цитированием
  #5 (permalink)  
Старый 26.02.2020, 11:56
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Нет. Ни сколько.
Она константа внутри функции. Но при входе в функцию она каждый раз перевычисляется. Вне этой функции ее просто не существует.
Объявление const topka = elem.getBoundingClientRect().top; не создает глобальную мировую константу.
Это просто локальная "переменная" внутри функции, а исполнительная среда javascript следит, что бы ей ничего больше не присваивалось

Последний раз редактировалось voraa, 26.02.2020 в 11:59.
Ответить с цитированием
  #6 (permalink)  
Старый 27.02.2020, 18:14
Кандидат Javascript-наук
Отправить личное сообщение для drkrol Посмотреть профиль Найти все сообщения от drkrol
 
Регистрация: 09.10.2013
Сообщений: 114

Спасибо. В итоге объявил константу за пределами функции и всё стало прекрасно работать
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции до тех пор, пока она возвращает true Lion_astana Общие вопросы Javascript 12 06.02.2020 14:35
Отправка формы только 1 раз, после чего что бы она стала не активна. rusaln917 Общие вопросы Javascript 5 10.07.2017 11:27
Права потребителя. Maxmaxmaximus3 Оффтопик 30 06.12.2013 21:13
Помогите...Незавершенная строковая константа lukingnu Элементы интерфейса 7 21.06.2012 13:19
читабельность, какая она бывает x-yuri Общие вопросы Javascript 16 20.02.2010 09:35