AHOHNMYC

0chan Top & Down Buttons

May 4th, 2017
376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name        0chan Top & Down Buttons
  3. // @name:ru     0chan кнопки с прокруткой
  4. // @namespace   0chan
  5. // @author      AHOHNMYC
  6. // @include     https://0chan.hk/*
  7.  
  8. // @include     https://*
  9. // @include     http://*
  10. // @noframes
  11.  
  12. // @version     v0.0.3.2
  13. // @grant       GM_addStyle
  14. // ==/UserScript==
  15.  
  16. // Based on ideas of "TopAndDownButtonsEverywhere" by John Kepeto:
  17. // https://greasyfork.org/ru/scripts/22484
  18.  
  19. // Скорость прокрутки, пикселы в секунду
  20. const hoverSpeed = 5,
  21.       img_up = 'data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAMAAAC3SZ14AAAABlBMVEUAAACqqqoTY3/sAAAAAXRSTlMAQObYZgAAAC1JREFUeNq9zrENAAAIAkHZf2kHOBobvyQBfgItumHBEYc9U0ApRZUPlMf/aAGGtQC36osOCAAAAABJRU5E',
  22.       img_dn = 'data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAMAAAC3SZ14AAAABlBMVEUAAACqqqoTY3/sAAAAAXRSTlMAQObYZgAAACtJREFUeNrFyCEOACAMALHu/58mWXCnUFTWmgt8qAk6dOjQoUOHzJ43E1oHimsAt+Ur6VQAAAAASUVORA==';
  23.  
  24. // Инжектим CSS
  25. 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;}
  26. .play_btn:hover {opacity: .7;}
  27. #play_btn_up {background-image: url(${img_up}); top: calc(50% - 38px);}
  28. #play_btn_dn {background-image: url(${img_dn}); top: calc(50% + 2px);}`);
  29.  
  30. // Костыль. В хромоге нет window.scrollMaxY
  31. if (!window.hasOwnProperty('scrollMaxY')) {
  32.     this.__defineGetter__('scrollMaxY', ()=>{
  33.         let delta = document.body.clientHeight-document.documentElement.clientHeight;
  34.         return delta<0 ? 0 : delta;
  35.     });
  36. }
  37.  
  38. // Автопрокрутка по наведению
  39. const move = {
  40.     _interval: 0,
  41.     _delta: 0,
  42.     _move: ()=>{ scrollTo(0, scrollY+move._delta); },
  43.  
  44.     start: function(e){
  45.         move._delta = (e.target.id === 'play_btn_up') ? -1 : 1;
  46.         move._interval = setInterval(move._move, 1000/hoverSpeed);
  47.     },
  48.     stop: ()=>{ clearInterval(move._interval); }
  49. };
  50.  
  51. // Обработчик кликов
  52. function clickHandler(e) {
  53.     let targetPoint = (e.target.id === 'play_btn_up') ? 0 : scrollMaxY;
  54.     scrollTo(0, targetPoint);
  55. }
  56.  
  57. // Создаём и показываем элементы
  58. ['up', 'dn'].forEach( direction=>{
  59.     let el = document.createElement('span');
  60.     el.id = 'play_btn_'+direction;
  61.     el.className = 'play_btn';
  62.     el.addEventListener('mouseover', move.start  );
  63.     el.addEventListener('mouseout',  move.stop   );
  64.     el.addEventListener('click',     clickHandler);
  65.     document.body.appendChild(el);
  66. });
  67.  
  68. // Скрытие кнопок при достижении краёв экрана
  69. function actualizeButtonDisplay(){
  70.     document.getElementById('play_btn_up').style.display = (pageYOffset !== 0)                    ? '' : 'none';
  71.     document.getElementById('play_btn_dn').style.display = (Math.round(pageYOffset) < scrollMaxY) ? '' : 'none';
  72. }
  73.  
  74. // Ставим обработчики на события окна
  75. ['scroll', 'resize'].forEach( event=>{
  76.     window.addEventListener(event, actualizeButtonDisplay);
  77. });
  78.  
  79. // Скрываем ненужные кнопки при загрузке страницы
  80. actualizeButtonDisplay();
Add Comment
Please, Sign In to add comment