// ==UserScript== // @name Scroll to Top and Bottom Buttons // @name:zh-CN 置顶和置底按钮 // @name:ar دبوس على الأزرار العلوية والسفلية // @name:bg Закачете горния и долния бутон // @name:cs Připnout na horní a spodní tlačítka // @name:da Fastgør til top og bund knapper // @name:de An die oberen und unteren Knöpfe stecken // @name:el Καρφιτσώστε τα κουμπιά πάνω και κάτω // @name:en Pin to top and bottom buttons // @name:eo Alpinglu al supraj kaj malsupraj butonoj // @name:es Fijar a los botones superior e inferior // @name:fi Kiinnitä painikkeet ylä- ja alaosaan // @name:fr Épingler sur les boutons du haut et du bas // @name:he הצמד לחצנים למעלה ולמטה // @name:hr Pričvrstite na gornji i donji gumb // @name:hu Rögzítse a felső és alsó gombokat // @name:id Sematkan ke tombol atas dan bawah // @name:it Aggiungi ai pulsanti superiore e inferiore // @name:ja 上下のボタンにピン留めする // @name:ka ჩაამაგრეთ ზედა და ქვედა ღილაკები // @name:ko 상단 및 하단 버튼에 고정 // @name:nl Speld vast aan de bovenste en onderste knoppen // @name:nb Fest til topp- og bunnknapper // @name:pl Przypnij do górnego i dolnego przycisku // @name:pt-BR Fixar nos botões superior e inferior // @name:ro Fixați butoanele de sus și de jos // @name:ru Закрепить на верхней и нижней кнопках // @name:sk Pripnúť na horné a spodné tlačidlo // @name:sr Закачите горње и доње дугме // @name:sv Fäst knappar upptill och nedtill // @name:th ปักหมุดที่ปุ่มบนและล่าง // @name:tr Üst ve alt düğmelere sabitle // @name:ug ئۈستى ۋە ئاستى كۇنۇپكىلارغا بېسىڭ // @name:uk Прикріпіть до верхньої та нижньої кнопок // @name:vi Ghim vào nút trên và dưới // @name:zh-TW 置頂和置底按鈕 // @name:zh-HK 置頂和置底按鈕 // @name:fr-CA Épingler sur les boutons du haut et du bas // @description:zh-CN 在所有页面生成两个按钮,一个用于顺滑回到顶部,一个用于持续滚动到底部,再次点击取消滚动到底部 // @description:ar إنشاء زرين في كافة الصفحات,واحد لتنعيم العودة إلى الأعلى,واحد للتمرير المستمر إلى الأسفل,انقر مرة أخرى لإلغاء التمرير إلى الأسفل // @description:bg Генерирайте два бутона на всички страници,Един за изглаждане обратно към върха,Един за непрекъснато превъртане до дъното,Щракнете отново, за да отмените, превъртете надолу // @description:cs Vygenerujte dvě tlačítka na všech stránkách,Jeden pro vyhlazení zpět nahoru,Jeden pro nepřetržité posouvání dolů,Dalším kliknutím zrušíte posun dolů // @description:da Generer to knapper på alle sider,En til at glatte tilbage til toppen,En til kontinuerlig rulning til bunden,Klik igen for at annullere scroll til bunden // @description:de Generieren Sie zwei Schaltflächen auf allen Seiten,Eine zum Glätten nach oben,Eine für kontinuierliches Scrollen nach unten,Klicken Sie erneut, um den Bildlauf nach unten abzubrechen // @description:el Δημιουργήστε δύο κουμπιά σε όλες τις σελίδες,Ένα για λείανση πίσω στην κορυφή,Ένα για συνεχή κύλιση προς τα κάτω,Κάντε ξανά κλικ για να ακυρώσετε την κύλιση προς τα κάτω // @description:en Generate two buttons on all pages,One for smoothing back to the top,One for continuous scrolling to the bottom,Click again to cancel scroll to bottom // @description:eo Generu du butonojn sur ĉiuj paĝoj,Unu por glatigi reen al la supro,Unu por kontinua movo al la fundo,Alklaku denove por nuligi rulumadon malsupre // @description:es Generar dos botones en todas las páginas.,Uno para alisar hasta arriba.,Uno para desplazamiento continuo hasta el final.,Haga clic nuevamente para cancelar, desplácese hacia abajo // @description:fi Luo kaksi painiketta kaikille sivuille,Yksi tasoittamiseen takaisin yläosaan,Yksi jatkuvaan vierittämiseen pohjaan,Napsauta uudelleen peruuttaaksesi vierityksen alas // @description:fr Générez deux boutons sur toutes les pages,Un pour lisser vers le haut,Un pour un défilement continu vers le bas,Cliquez à nouveau pour annuler le défilement vers le bas // @description:he צור שני כפתורים בכל הדפים,אחד להחלקת חזרה למעלה,אחד לגלילה רציפה לתחתית,לחץ שוב כדי לבטל את הגלילה למטה // @description:hr Generirajte dva gumba na svim stranicama,Jedan za glačanje natrag na vrh,Jedan za kontinuirano pomicanje do dna,Kliknite ponovno za odustajanje pomaknite se do dna // @description:hu Minden oldalon hozzon létre két gombot,Az egyik a tetejére való visszasimításhoz,Egy a folyamatos görgetéshez az aljára,Kattintson újra a lefelé görgetés megszakításához // @description:id Hasilkan dua tombol di semua halaman,Satu untuk menghaluskan kembali ke atas,Satu untuk menggulir terus menerus ke bawah,Klik lagi untuk membatalkan gulir ke bawah // @description:it Genera due pulsanti su tutte le pagine,Uno per tornare in cima,Uno per lo scorrimento continuo verso il basso,Fare di nuovo clic per annullare lo scorrimento fino in fondo // @description:ja すべてのページに 2 つのボタンを生成する,1 つはトップに戻るためのスムージング用,1 つは下まで継続的にスクロールするためのもの,もう一度クリックすると下までスクロールがキャンセルされます // @description:ka შექმენით ორი ღილაკი ყველა გვერდზე,ერთი ზევით დასაბრუნებლად,ერთი ბოლოში უწყვეტი გადახვევისთვის,დააწკაპუნეთ ხელახლა გადახვევის გასაუქმებლად ბოლოში // @description:ko 모든 페이지에 두 개의 버튼 생성,하나는 위쪽으로 부드럽게 하기 위한 것입니다.,하나는 아래쪽으로 계속 스크롤하기 위한 것입니다.,취소하려면 다시 클릭하세요. 맨 아래로 스크롤 // @description:nl Genereer twee knoppen op alle pagina’s,Eén om terug naar boven glad te strijken,Eén voor continu naar beneden scrollen,Klik nogmaals om te annuleren. Scroll naar beneden // @description:nb Generer to knapper på alle sider,En for å glatte tilbake til toppen,En for kontinuerlig rulling til bunnen,Klikk på nytt for å avbryte bla til bunnen // @description:pl Wygeneruj dwa przyciski na wszystkich stronach,Jeden do wygładzania z powrotem do góry,Jeden do ciągłego przewijania w dół,Kliknij ponownie, aby anulować przewijanie w dół // @description:pt-BR Gere dois botões em todas as páginas,Um para suavizar de volta ao topo,Um para rolagem contínua até o final,Clique novamente para cancelar a rolagem para baixo // @description:ro Generați două butoane pe toate paginile,Unul pentru netezirea înapoi în vârf,Unul pentru defilarea continuă până în jos,Faceți clic din nou pentru a anula derularea în jos // @description:ru Создать две кнопки на всех страницах,Один для сглаживания обратно наверх,Один для непрерывной прокрутки вниз,Нажмите еще раз, чтобы отменить прокрутку вниз // @description:sk Vygenerujte dve tlačidlá na všetkých stránkach,Jeden na vyhladenie späť nahor,Jeden pre plynulé posúvanie nadol,Opätovným kliknutím zrušíte posúvanie nadol // @description:sr Генеришите два дугмета на свим страницама,Један за заглађивање назад на врх,Један за непрекидно скроловање до дна,Кликните поново да бисте отказали померање до дна // @description:sv Skapa två knappar på alla sidor,En för att jämna tillbaka till toppen,En för kontinuerlig rullning till botten,Klicka igen för att avbryta scroll till botten // @description:th สร้างสองปุ่มในทุกหน้า,หนึ่งอันสำหรับปรับให้เรียบกลับไปด้านบน,หนึ่งรายการสำหรับการเลื่อนไปที่ด้านล่างอย่างต่อเนื่อง,คลิกอีกครั้งเพื่อยกเลิกการเลื่อนไปด้านล่าง // @description:tr Tüm sayfalarda iki düğme oluşturun,En üste doğru yumuşatmak için bir tane,Aşağıya doğru sürekli kaydırma için bir tane,Aşağıya kaydırmayı iptal etmek için tekrar tıklayın // @description:ug بارلىق بەتلەردە ئىككى كۇنۇپكا ھاسىل قىلىڭ,يۇقىرىغا قايتىش ئۈچۈن بىرى,ئاستىغا توختىماي دومىلاش ئۈچۈن بىرى,ئاستىنى سىيرىشنى قايتا چېكىڭ // @description:uk Згенеруйте дві кнопки на всіх сторінках,Один для згладжування назад до верху,Один для безперервного прокручування вниз,Клацніть ще раз, щоб скасувати прокрутку вниз // @description:vi Tạo hai nút trên tất cả các trang,Một để làm mịn trở lại đầu trang,Một để cuộn liên tục xuống phía dưới,Bấm lần nữa để hủy cuộn xuống dưới cùng // @description:zh-TW 在所有頁面產生兩個按鈕,一個用於順滑回到頂部,一個用於持續滾動到底部,再次點擊取消捲動到底部 // @description:zh-HK 在所有頁面產生兩個按鈕,一個用於順滑回到頂部,一個用於持續滾動到底部,再次點擊取消捲動到底部 // @description:fr-CA Générez deux boutons sur toutes les pages,Un pour lisser vers le haut,Un pour un défilement continu vers le bas,Cliquez à nouveau pour annuler le défilement vers le bas // @description Generate two buttons on all pages, one for smoothly scrolling back to the top and one for continuous scrolling to the bottom. Click again to stop scrolling to the bottom. // @version 1.2.0.72 // @run-at document-end // @author 人民的勤务员 // @match *://*/* // @license MIT // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @namespace https://github.com/ChinaGodMan/UserScripts // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAADO0lEQVR4nO3ZXUsUURwG8P0ACYoXoWheRYi9kG3zQAR9RjW6cAV3LyKKIMKKunHTnNFdtTNW0CewFCIyqjsxTmovYO7O7nnd//PAAdmLceb57f/M7G6pxDAMwzAR5eLj1bOXXyxtlZfW98vL6/v6b/2a7/MSkfGHT8Ym62vfkOUHf6/JeuPH+MLCed/nJ7J8EMF/+SCC//JBBP/lgwj+ywcRus+lZ/WRq4ur3zst/3jpY0zcez5q4JTk5OarNwPXXjZ3uy3/eE08Xdw9d+fugO/riiJX6qofWd40Vb5e5eX1g6FKTQ3XaoO+r09c+dArVQfDlRoRWm07SNWG8fKPlgY4WhvcjhyXj38BiOBk28lOBeB25LJ8nAAgHsFl+fgPgFgE1+XjFABxCD7KRwsAMQi+ykcbAD2P4LN8tAnQswi+y0cBgJ5DCKF8FAToGYRQykcHANEjhFQ+OgSIFiG08tEFQHQIIZaPLgGiQQi1fBgACB4h5PJhCCBYhNDLh0GA4BBiKB+GAYJBiKV8WADwjmCz/CRTry0ANHsG4cbK+74kVZtW3q2p2vj1G7Hh4+of4vUP8jYQhivVzcG5uT5nAMjy2zbLLx3+D6PH1se0ijBbm3EGkKRqx8a2c73R+D3KNgB0xubn+61sR7PVHWcASNVHm+XbBLCFMDRb2y65CtJ8xsa24wrgz3ZU3TR4H5guRXcTTk8u3wWAWQTHN2ETj6EnbTuuAUxsR1F+FmhVvkuAbhCC+TScpHnDZPmuATpBCKL8ogjtlu8DoAhCUOW3i1CkfF8A7SAEWX4rhKLl+wQ4DSHo8o9zq/7uTJKq6STLtw+XmtKvFT0OPALo6MdK/fXCUKX6QS/9nO/8UdNn4BlAfEAAvwEBCCA64AQQQHTACSCA6IATQADRASeAAKIDTgABRAecAAKIDjgBBBAdcAIIIDrgBBBAdMAJIIDogBNAANEBJ4AAogNOAAFEB5wAAogOOAEEEB1wAgggOuAEEEB0wAnwmyRTX40hpPkXz5cTX5Dlj0wBJGl+3/f1RJfyytaFJFOfu3/3q0/J2taI7+uJMuXm21Fk+QOk+V4H286efuezfIZhGKYUaH4C72t5mm5DSxAAAAAASUVORK5CYII= // @iconbak https://github.com/ChinaGodMan/UserScripts/raw/main/docs/icon/Scripts%20Icons/icons8-up-96.png // @supportURL https://github.com/ChinaGodMan/UserScripts/issues // @homepageURL https://github.com/ChinaGodMan/UserScripts // @homepage https://github.com/ChinaGodMan/UserScripts // ==/UserScript== (function () { 'use strict' let isScrollingToBottom = false let buttonTopKey = GM_getValue('buttonTopKey', '') let buttonBottomKey = GM_getValue('buttonBottomKey', '') var style = document.createElement('style') GM_registerMenuCommand('SetHotkey', showHotkeyModal) function showHotkeyModal() { let modalHtml = `

ButtonKey

` let modalDiv = document.createElement('div') modalDiv.innerHTML = modalHtml document.body.appendChild(modalDiv) document.getElementById('hotkeyInput1').addEventListener('keydown', function (event) { event.preventDefault() buttonTopKey = event.key this.value = buttonTopKey }) document.getElementById('hotkeyInput2').addEventListener('keydown', function (event) { event.preventDefault() buttonBottomKey = event.key this.value = buttonBottomKey }) document.getElementById('saveHotkeys').addEventListener('click', function () { GM_setValue('buttonTopKey', buttonTopKey) GM_setValue('buttonBottomKey', buttonBottomKey) closeModal() }) document.getElementById('closeModal').addEventListener('click', closeModal) } function closeModal() { let modal = document.getElementById('hotkeyModal') if (modal) { modal.remove() } } document.addEventListener('keydown', function (event) { if (event.target.matches('input, textarea, [contenteditable="true"]')) { return } if (event.key === GM_getValue('buttonTopKey')) { goToTop() } else if (event.key === GM_getValue('buttonBottomKey')) { isScrollingToBottom = toggleScrolling(buttonBottom, isScrollingToBottom) } }) style.innerHTML = ` :root { --button-size: 29.4px; /* 按钮的大小 */ --button-margin: 1px; /* 按钮之间的间距 */ } .GO_TO_TOP_button, .GO_TO_BOTTOM_button { width: var(--button-size); /* 按钮大小 */ height: var(--button-size); /* 按钮大小 */ border-radius: 5.6px; /* 縮小30% */ box-shadow: 0 3px 6px rgb(0 0 0 / 16%), 0 1px 2px rgb(0 0 0 / 23%); position: fixed; right: 14px; /* 缩小30% */ display: flex; align-items: center; justify-content: center; z-index: 99999999; background-color: white; opacity: 0.8; transition: opacity 0.2s ease-in-out; cursor: pointer; } .GO_TO_TOP_button svg, .GO_TO_BOTTOM_button svg { left: 16.8px; /* 縮小30% */ height: 16.8px; /* 縮小30% */ margin: 0; } .GO_TO_TOP_button { bottom: 49px; /* 縮小30% */ } .GO_TO_BOTTOM_button { bottom: 14px; /* 縮小30% */ } ` document.head.appendChild(style) const goToTop = () => { window.scrollTo({ top: 0, behavior: 'smooth' }) } let bottomInterval const startScrollingToBottom = () => { bottomInterval = setInterval(() => { window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' }) }, 1000) let checkTimeout = setTimeout(() => { if (window.innerHeight + window.scrollY >= document.body.scrollHeight) { if (buttonBottom.style.backgroundColor === 'green') { buttonBottom.click() // alert("已处于最底端"); } } }, 3000) window.addEventListener('scroll', () => { if (window.innerHeight + window.scrollY < document.body.scrollHeight) { clearTimeout(checkTimeout) checkTimeout = setTimeout(() => { if (buttonBottom.style.backgroundColor === 'green') { buttonBottom.click() // alert("自动滚动到底部已停止。"); } }, 3000) } }) buttonBottom.style.opacity = '0.8' buttonBottom.style.display = 'flex' } const stopScrollingToBottom = () => { clearInterval(bottomInterval) } const buttonTop = document.createElement('div') buttonTop.className = 'GO_TO_TOP_button' buttonTop.innerHTML = ` ` const buttonBottom = document.createElement('div') buttonBottom.className = 'GO_TO_BOTTOM_button' buttonBottom.innerHTML = ` ` buttonTop.addEventListener('click', goToTop) buttonBottom.addEventListener('click', () => { isScrollingToBottom = toggleScrolling(buttonBottom, isScrollingToBottom) }) function toggleScrolling(buttonBottom, isScrollingToBottom) { if (isScrollingToBottom) { stopScrollingToBottom() buttonBottom.style.transform = 'scale(1)' buttonBottom.style.backgroundColor = 'white' // 改回原来的背景色 } else { startScrollingToBottom() buttonBottom.style.transform = 'scale(1.1)' buttonBottom.style.backgroundColor = 'green' // 改为绿色 } return !isScrollingToBottom } buttonTop.style.display = 'none' buttonBottom.style.display = 'none' document.body.appendChild(buttonTop) document.body.appendChild(buttonBottom) let timer window.addEventListener('scroll', () => { if (window.pageYOffset > 50) { buttonTop.style.opacity = '0.8' buttonTop.style.display = 'flex' buttonBottom.style.opacity = '0.8' buttonBottom.style.display = 'flex' } else if (window.pageYOffset === 0) { buttonTop.style.opacity = '0' buttonBottom.style.opacity = '0' setTimeout(() => { buttonTop.style.display = 'none' buttonBottom.style.display = 'none' }, 200) } clearTimeout(timer) timer = setTimeout(() => { buttonTop.style.opacity = '0' buttonBottom.style.opacity = '0' setTimeout(() => { buttonTop.style.display = 'none' buttonBottom.style.display = 'none' }, 200) }, 1800) }) })()