// ==UserScript== // @name 边缘下滑刷新.改 // @version 1.0 // @description 修改自angao的边缘下滑刷新脚本 // @author angao // @run-at document-end // @license MIT // @match *://*/* // @namespace https://greasyfork.org/users/452911 // @downloadURL none // ==/UserScript== (function EdgeSlideRefresh() { 'use strict'; // 获取屏幕宽度和高度 const screenWidth = window.innerWidth; const screenHeight = window.innerHeight; // 下滑刷新距离 const Sliderefreshdistance = screenHeight * 3 / 5; let startY = null; let endY = null; // 注入CSS var style = document.createElement('style'); style.innerHTML = ` .Refresh_Icon { width: ${screenWidth / 10}px; height: ${screenWidth / 10}px; border-radius: 8px; position: fixed; left: 50%; transform: translate(-50%, 0) translateZ(0); box-Shadow: 0 0 10px rgba(0, 0, 0, 0.1); top: -${screenHeight / 10}px; align-items: center; justify-content: center; z-index: 99999999; background-color: white; border-radius: 50%; transition: transform 0.05s ease-out; } @media screen and (orientation: landscape) { .Refresh_Icon { width: ${screenWidth / 15}px; height: ${screenWidth / 15}px; } } .Refresh_Icon svg { width: ${screenWidth / 12}px; height: ${screenWidth / 12}px; margin: 0; } `; document.head.appendChild(style); // 创建DOM绑定方法 const Icon = document.createElement('div'); Icon.className = 'Refresh_Icon'; Icon.innerHTML = ` `; // 默认隐藏 Icon.style.display = 'none'; document.body.appendChild(Icon); // 记录触摸点的纵坐标 document.addEventListener('touchstart', function (e) { if (e.touches[0].clientX < screenWidth / 15 || e.touches[0].clientX > screenWidth / 15 * 14) { startY = e.touches[0].clientY; Icon.style.display = 'flex'; } }); // 下滑时阻止网页滑动,并使刷新图标随之下移、旋转 document.addEventListener('touchmove', function (e) { if (startY !== null) { e.preventDefault(); let distance = e.touches[0].clientY - startY; let maxDistance = Sliderefreshdistance * 0.85; // 最大下滑距离 let slowDownStart = Sliderefreshdistance * 0.6; // 开始减速的位置 let slowDownRate = 0.2; // 减速比率 if (distance < Sliderefreshdistance) { Icon.querySelector('svg').style.fill = 'black'; } else { Icon.querySelector('svg').style.fill = 'darkred'; } if (distance > slowDownStart) { distance = slowDownStart + (distance - slowDownStart) * slowDownRate; } distance = Math.min(distance, maxDistance); Icon.style.transform = `translate(-50%, ${distance / 1.35}px) rotate(${distance * 2}deg)`; } }, { passive: false }); // 记录离开点,并使刷新图标返回 document.addEventListener('touchend', function (e) { if (startY !== null) { endY = e.changedTouches[0].clientY; // 向下滑动超过3/5屏幕高度则刷新 if (endY - startY > Sliderefreshdistance) { setTimeout(function () { location.reload(); }, 250); } Icon.style.transition = 'all 0.5s'; Icon.style.transform = `translate(-50%, -${screenHeight / 10}px)`; setTimeout(() => { Icon.style.transition = ''; }, 200); startY = null; endY = null; } }); })();