您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Makes the leaflet map in openguessr scroll more smoothly
当前为
// ==UserScript== // @name Smooth scroll geoguessr map // @match https://openguessr.com/* // @grant none // @version 1.0 // @author ItsPi3141 // @description Makes the leaflet map in openguessr scroll more smoothly // @run-at document-start // @license MIT // @namespace https://greasyfork.org/users/1334015 // ==/UserScript== let injected = false; const originalFunctionCall = Function.prototype.call; Function.prototype.call = function (...args) { if (!injected && args[0]?._leaflet_id) { inject(); applyStyles(); injected = true; } return originalFunctionCall.apply(this, args); }; // https://github.com/mutsuyuki/Leaflet.SmoothWheelZoom const inject = () => { L.Map.mergeOptions({ scrollWheelZoom: false, smoothWheelZoom: true, smoothSensitivity: 2, }); L.Map.SmoothWheelZoom = L.Handler.extend({ addHooks: function () { L.DomEvent.on(this._map._container, "wheel", this._onWheelScroll, this); }, removeHooks: function () { L.DomEvent.off(this._map._container, "wheel", this._onWheelScroll, this); }, _onWheelScroll: function (e) { if (!this._isWheeling) { this._onWheelStart(e); } this._onWheeling(e); }, _onWheelStart: function (e) { var map = this._map; this._isWheeling = true; this._wheelMousePosition = map.mouseEventToContainerPoint(e); this._centerPoint = map.getSize()._divideBy(2); this._startLatLng = map.containerPointToLatLng(this._centerPoint); this._wheelStartLatLng = map.containerPointToLatLng( this._wheelMousePosition, ); this._startZoom = map.getZoom(); this._moved = false; this._zooming = true; map._stop(); if (map._panAnim) map._panAnim.stop(); this._goalZoom = map.getZoom(); this._prevCenter = map.getCenter(); this._prevZoom = map.getZoom(); this._zoomAnimationId = requestAnimationFrame( this._updateWheelZoom.bind(this), ); }, _onWheeling: function (e) { var map = this._map; this._goalZoom = this._goalZoom + L.DomEvent.getWheelDelta(e) * 0.003 * map.options.smoothSensitivity; if ( this._goalZoom < map.getMinZoom() || this._goalZoom > map.getMaxZoom() ) { this._goalZoom = map._limitZoom(this._goalZoom); } this._wheelMousePosition = this._map.mouseEventToContainerPoint(e); clearTimeout(this._timeoutId); this._timeoutId = setTimeout(this._onWheelEnd.bind(this), 200); L.DomEvent.preventDefault(e); L.DomEvent.stopPropagation(e); }, _onWheelEnd: function (e) { this._isWheeling = false; cancelAnimationFrame(this._zoomAnimationId); this._map._moveEnd(true); }, _updateWheelZoom: function () { var map = this._map; if ( !map.getCenter().equals(this._prevCenter) || map.getZoom() != this._prevZoom ) return; this._zoom = map.getZoom() + (this._goalZoom - map.getZoom()) * 0.3; this._zoom = Math.floor(this._zoom * 100) / 100; var delta = this._wheelMousePosition.subtract(this._centerPoint); if (delta.x === 0 && delta.y === 0) return; if (map.options.smoothWheelZoom === "center") { this._center = this._startLatLng; } else { this._center = map.unproject( map.project(this._wheelStartLatLng, this._zoom).subtract(delta), this._zoom, ); } if (!this._moved) { map._moveStart(true, false); this._moved = true; } map._move(this._center, this._zoom); this._prevCenter = map.getCenter(); this._prevZoom = map.getZoom(); this._zoomAnimationId = requestAnimationFrame( this._updateWheelZoom.bind(this), ); }, }); L.Map.addInitHook("addHandler", "smoothWheelZoom", L.Map.SmoothWheelZoom); }; const applyStyles = () => { const styles = document.createElement("style"); styles.innerHTML = `.leaflet-zoom-animated { transition: 0.1s transform ease-out; } .leaflet-layer :is([style*='z-index: 17']) { opacity: 0 !important; }`; document.head.appendChild(styles); };