Меню
RSS
Pull to refresh, не большой скрипт для обновления страницы, Скрипт который иммитирует обновление страницы при протягивании. Годится для мобильных версий сайтов и приложений на cordova
 
Pull to refresh, не большой скрипт  для обновления страницы, при перетягивании, на мобильных телефонах.
Можно использовать и в мобильном приложении на cordova/phonegap
стили можно перенсти в style.css

Код
(function () {
    if (!('ontouchstart' in window)) return; // Только на тач-устройствах

    function initPullToRefresh() {
        var startY = null;
        var dist = 0;
        var threshold = 70;
        var maxDist = 150;
        var pulling = false;
        var refreshTriggered = false;

        var spinner = document.createElement('div');
        spinner.style.position = 'fixed';
        spinner.style.top = '0';
        spinner.style.left = '0';
        spinner.style.right = '0';
        spinner.style.height = '50px';
        //spinner.style.background = 'white';
        spinner.style.display = 'flex';
        spinner.style.justifyContent = 'center';
        spinner.style.alignItems = 'center';
        spinner.style.fontSize = '24px';
        spinner.style.color = '#007aff';
        spinner.style.transform = 'translateY(-50px)';
        spinner.style.transition = 'transform 0.3s ease, opacity 0.3s ease';
        spinner.style.zIndex = '9999';
        spinner.style.opacity = '0';
        spinner.innerHTML = `
              <svg style="width:24px; height:24px; animation: spin 1s linear infinite;" viewBox="0 0 50 50" >
                <rect x="10" y="10" width="30" height="30" stroke="#007aff" stroke-width="5" fill="none" />
              </svg>
            `;
        document.body.appendChild(spinner);

        var styleEl = document.createElement('style');
        styleEl.innerHTML = `
      @keyframes spin {
        0% { transform: rotate(0deg);}
        100% { transform: rotate(360deg);}
      }
    `;
        document.head.appendChild(styleEl);

        // Проверяем, что прокрутка body/doc вверху
        function canPullToRefresh() {
            // Совместимый вариант для любых браузеров:
            return (window.pageYOffset || document.documentElement.scrollTop) === 0;
        }

        function onTouchStart(e) {
            if (canPullToRefresh() && !refreshTriggered) {
                startY = e.touches[0].screenY;
                pulling = true;
                dist = 0;
                spinner.style.transition = 'none';
                spinner.style.opacity = '1';
            }
        }

        function onTouchMove(e) {
            if (!pulling) return;
            var currentY = e.touches[0].screenY;
            dist = currentY - startY;
            if (dist > 0) {
                e.preventDefault(); // Блокируем скролл вниз при протягивании
                var moveDist = Math.min(dist, maxDist);
                spinner.style.transform = 'translateY(' + (moveDist - 50) + 'px)';
                if (moveDist > threshold) {
                    spinner.style.color = '#007aff';
                } else {
                    spinner.style.color = '#999';
                }
            } else {
                spinner.style.transform = 'translateY(-50px)';
                spinner.style.opacity = '0';
                pulling = false;
            }
        }

        function onTouchEnd(e) {
            if (!pulling) return;
            spinner.style.transition = 'transform 0.3s ease, opacity 0.3s ease';
            if (dist > threshold) {
                refreshTriggered = true;
                spinner.style.transform = 'translateY(0px)';
                spinner.style.opacity = '1';
                window.location.reload();
            } else {
                spinner.style.transform = 'translateY(-50px)';
                spinner.style.opacity = '0';
            }
            pulling = false;
            startY = null;
            dist = 0;
        }

        window.addEventListener('touchstart', onTouchStart, {passive: false});
        window.addEventListener('touchmove', onTouchMove, {passive: false});
        window.addEventListener('touchend', onTouchEnd);
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initPullToRefresh);
    } else {
        initPullToRefresh();
    }
})();
Изменено: Михаил Базаров - 24.04.2025 14:10:27
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Bst

Блог-note: заметки разработчика

Многосайтовость битрикс на разных доменах и поддоменах

Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать небольшое видео в котором уст...

Вывести свойство привязка к Яндекс Картам в Битрикс

Часто бывает нужно вывести свойство привязка к Яндекс карте в детальном описании элемента. Например в детальной новости ...

Ajax форма обратной связи, реализация в битрикс

Иногда, на сайте требуется создать форму обратной связи, которая будет писать все данные в инфоблок. Способов реализации...

Как вывести свойства инфоблока по отдельности и немного плюшек не в тему

Если у инфоблока несколько свойств- то при выводе их всех, скажем в детальном описании новости, они выводятся все вместе...

Дополнительные параметры в меню Битрикс

Иногда нужно присвоить какой-то функционал к конкретному пункту меню в битрикс. Например открывать ссылку в новом окне и...

Фотогалерея на базе компонента новостей, с fancybox.

Это заметка обновление к очень старой, уже имеющейся на сайте. Сделаем что-то типа фотогалереи на базе встроеннного в би...

Самодельная форма добавления элемента на API Битрикс

Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изрядно и не используя js) как уг...

Рассылка новинок каталога в автоматическом режиме

Что бы реализовать рассылку новинок каталога на email-ы пользователей, можно воспользоваться событием OnBeforeIBlockElem...

Сравнение двух типов цен для иммитации системы скидок, в Битрикс

Встала задачка, иммититровать систему скидок в интернет магазине на Битрикс. Из 1С-УТ, на сайт, выгружается два типа цен...