Меню
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
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 

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

Создание агента в 1С-Битрикс, на реальном примере

Задача: Каждый час нужно обновлять свойство элементов/товаров с типом строка "В наличии", вписывать в него либ...

Дополнительные опции/услуги, добавляемые в корзину, в карточке товаров

Задача: в детальной карточке товара сделать возможность добавления услуги или опции, при добавлении товара в корзину.

Локальный Copilot в PhpStorm / VSCode, с помощью Continue. Свой, бесплатный Cursor

Это краткий план-черновик для видео (само видео ниже). В нем рассказывается о том, как запустить локальную ИИ мо...

Если пользователь авторизован то... API Битрикс

Достаточно часто, при создании сайта на битрикс нужно вывести в шаблон или компонент, некую информацию, доступную только...

Установка поиска Sphinx на Ubuntu 22.04 для 1С-Битрикс

Задача: установить и сконфигурировать поиск Sphinx под управлением Ubuntu 22.04 и панели управления HestiaCP для использ...

Вывод элементов с помощью API битрикс

Иногда, выводить элементы инфоблока с помощью компонентов, может оказаться избыточным. Например, если нужно вывести элем...

Вывести общее количество товаров в шаблоне корзины 1С-Битрикс

Задача: вывести общее количество товаров в корзине (именно количество единиц товара, а не позиций). При этом да...

Создание локальных уведомлений для приложения на Apache Cordova

Задача состоит в том, чтобы реализовать возможность локальных уведомлений в приложении на Apache Cordova без использован...

Если товар в корзине, поменять значение input на "В корзине"

Если Вам нужно поменять текст на кнопке, добавляющей товар в корзину, достаточно воспользоваться методом API "CSaleBaske...