Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name 0chan Top & Down Buttons
- // @name:ru 0chan кнопки с прокруткой
- // @namespace 0chan
- // @author AHOHNMYC
- // @include https://0chan.hk/*
- // @include https://*
- // @include http://*
- // @noframes
- // @version v0.0.3.2
- // @grant GM_addStyle
- // ==/UserScript==
- // Based on ideas of "TopAndDownButtonsEverywhere" by John Kepeto:
- // https://greasyfork.org/ru/scripts/22484
- // Скорость прокрутки, пикселы в секунду
- const hoverSpeed = 5,
- img_up = 'data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAMAAAC3SZ14AAAABlBMVEUAAACqqqoTY3/sAAAAAXRSTlMAQObYZgAAAC1JREFUeNq9zrENAAAIAkHZf2kHOBobvyQBfgItumHBEYc9U0ApRZUPlMf/aAGGtQC36osOCAAAAABJRU5E',
- img_dn = 'data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAMAAAC3SZ14AAAABlBMVEUAAACqqqoTY3/sAAAAAXRSTlMAQObYZgAAACtJREFUeNrFyCEOACAMALHu/58mWXCnUFTWmgt8qAk6dOjQoUOHzJ43E1oHimsAt+Ur6VQAAAAASUVORA==';
- // Инжектим CSS
- GM_addStyle(`.play_btn {z-index: 9000; position: fixed; right: 0; height: 36px; width: 36px; cursor: pointer; border-radius: 5px 0 0 5px; transition: .3s; opacity: .4; background: no-repeat 50% 50% black;}
- .play_btn:hover {opacity: .7;}
- #play_btn_up {background-image: url(${img_up}); top: calc(50% - 38px);}
- #play_btn_dn {background-image: url(${img_dn}); top: calc(50% + 2px);}`);
- // Костыль. В хромоге нет window.scrollMaxY
- if (!window.hasOwnProperty('scrollMaxY')) {
- this.__defineGetter__('scrollMaxY', ()=>{
- let delta = document.body.clientHeight-document.documentElement.clientHeight;
- return delta<0 ? 0 : delta;
- });
- }
- // Автопрокрутка по наведению
- const move = {
- _interval: 0,
- _delta: 0,
- _move: ()=>{ scrollTo(0, scrollY+move._delta); },
- start: function(e){
- move._delta = (e.target.id === 'play_btn_up') ? -1 : 1;
- move._interval = setInterval(move._move, 1000/hoverSpeed);
- },
- stop: ()=>{ clearInterval(move._interval); }
- };
- // Обработчик кликов
- function clickHandler(e) {
- let targetPoint = (e.target.id === 'play_btn_up') ? 0 : scrollMaxY;
- scrollTo(0, targetPoint);
- }
- // Создаём и показываем элементы
- ['up', 'dn'].forEach( direction=>{
- let el = document.createElement('span');
- el.id = 'play_btn_'+direction;
- el.className = 'play_btn';
- el.addEventListener('mouseover', move.start );
- el.addEventListener('mouseout', move.stop );
- el.addEventListener('click', clickHandler);
- document.body.appendChild(el);
- });
- // Скрытие кнопок при достижении краёв экрана
- function actualizeButtonDisplay(){
- document.getElementById('play_btn_up').style.display = (pageYOffset !== 0) ? '' : 'none';
- document.getElementById('play_btn_dn').style.display = (Math.round(pageYOffset) < scrollMaxY) ? '' : 'none';
- }
- // Ставим обработчики на события окна
- ['scroll', 'resize'].forEach( event=>{
- window.addEventListener(event, actualizeButtonDisplay);
- });
- // Скрываем ненужные кнопки при загрузке страницы
- actualizeButtonDisplay();
Add Comment
Please, Sign In to add comment