Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.05.2016, 23:16
Профессор
Отправить личное сообщение для Bond Посмотреть профиль Найти все сообщения от Bond
 
Регистрация: 16.06.2013
Сообщений: 172

Автоскрол для блока. ООП
Всем здравствуйте. Проблем с кодом вроде нет, просто нужно обсудить и оптимизировать
Задача такая - на странице есть блоки и для некоторых из них нужно сделать автоскролл контента с разной для каждого блока скоростью, также при наведении курсора скролл должен останавливаться. Также скролл может быть как горизонт так и вертикал.

Решил эту задачу так (писал на TypeScript, но даю исходник на JS)

var Scroll = (function () {
    function Scroll(elem, speed) {
        this.flag = true;
        this.elem = document.querySelector(elem);
        this.computedStyle = getComputedStyle(this.elem);
        var th = this;
// Если overflowY == "scroll" то запускаем метод вертикального скролла иначе горизонт
        setInterval(function () { if (th.computedStyle.overflowY == "scroll") {
            th.scrollVertical(); 
        } else {
            th.scrollHorizontal();
        } }, speed);
// Переключаем флаг наведение курсора
        this.elem.onmouseenter = function () { th.flag = false; };
        this.elem.onmouseleave = function () { th.flag = true; };
    }
// Метод для вертикального скролла
    Scroll.prototype.scrollVertical = function () {
        if (!this.flag) { return; }; // Если флаг false то есть курсор наведен значит return
        this.elem.scrollTop = this.elem.scrollTop + 1;
        if (this.elem.scrollTop >= (this.elem.scrollHeight - this.elem.clientHeight)) {
            this.elem.scrollTop = 0;
            return;
        }
    };
// Метод для горизонтального скролла
    Scroll.prototype.scrollHorizontal = function () {
        if (!this.flag) { return; }; // Если флаг false то есть курсор наведен значит return
        this.elem.scrollLeft = this.elem.scrollLeft + 1;
        if (this.elem.scrollLeft >= (this.elem.scrollWidth - this.elem.clientWidth)) {
            this.elem.scrollLeft = 0;
            return;
        }
    };
    return Scroll;
}());
new Scroll("#text-vat", 100); // Указывается два параметра - селектор и скорость движения

Есть парочка вопросов

Первый - событие наведение курсора - можно ли объединить две строки в одну - как в jQuery сделано через .hover() ??
this.elem.onmouseenter = function () { th.flag = false; };
        this.elem.onmouseleave = function () { th.flag = true; };


Второй - можно ли два метода scrollVertical() и scrollHorizontal() объединить - ведь делают они почти одно и тоже только один работает с высотой и топ, а второй с шириной и лефт.

Буду признателен за участие

Последний раз редактировалось Bond, 18.05.2016 в 23:20.
Ответить с цитированием
  #2 (permalink)  
Старый 19.05.2016, 00:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Bond,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
   <style type="text/css">
     .hot{
          border: 1px dashed Gray; padding: 5px; height: 200px; width: 200px;
          overflow-y: scroll;
     }

   </style>

</head>

<body>

  <div class="hot"><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. <i>Sedulo, inquam, faciam.</i> Quorum altera prosunt, nocent altera. Duo Reges: constructio interrete. Sin eam, quam Hieronymus, ne fecisset idem, ut voluptatem illam Aristippi in prima commendatione poneret. Etenim semper illud extra est, quod arte comprehenditur. <i>Eam stabilem appellas.</i> </p></div>
  <script>
var Scroll = (function () {
    function Scroll(elem, speed) {
        this.flag = true;
        this.elem = document.querySelector(elem);
        this.computedStyle = getComputedStyle(this.elem);
        var th = this;
// Если overflowY == "scroll" то запускаем метод вертикального скролла иначе горизонт
        setInterval(function () { if (th.computedStyle.overflowY == "scroll") {
            th.move('Top','Height');
        } else {
            th.move('Left','Width');
        } }, speed);
// Переключаем флаг наведение курсора
        this.elem.onmouseenter = function () { th.flag = false; };
        this.elem.onmouseleave = function () { th.flag = true; };
    }
// Метод для скролла
    Scroll.prototype.move = function (a,b) {
        if (!this.flag) { return; }; // Если флаг false то есть курсор наведен значит return
        this.elem["scroll"+a]++;
        if (this.elem["scroll"+a] >= (this.elem["scroll"+b] - this.elem["client"+b])) {
            this.elem["scroll"+a] = 0;
            return;
        }
    };
    return Scroll;
}());
new Scroll(".hot", 30); // Указывается два параметра - селектор и скорость движения

  </script>
</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 19.05.2016, 01:42
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Bond,
this.elem.onmouseenter = this.elem.onmouseleave = function () { th.flag = !th.flag };
Ответить с цитированием
  #4 (permalink)  
Старый 19.05.2016, 02:17
Профессор
Отправить личное сообщение для Bond Посмотреть профиль Найти все сообщения от Bond
 
Регистрация: 16.06.2013
Сообщений: 172

рони,
Rise,
Спасибо за участие, добавил в карму плюсиков.
Метод move() просто и понятно - но не хватило мне ума дойти к этому.
За ховер отдельное спасибо, не знал что так можно, хотя вроде как читал недавно, но примеров не видел.
Да пересидел что называется на jQuery, без справочника и гугла никак .
Ответить с цитированием
  #5 (permalink)  
Старый 19.05.2016, 07:02
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Move можно ещё оптимизировать:

move = function() {
    if(this.flag && ++this.elem["scroll"+a] >= this.elem["scroll"+b] - this.elem["client"+b]) {
        this.elem["scroll"+a] = 0;
    }
}
Ответить с цитированием
  #6 (permalink)  
Старый 19.05.2016, 14:17
Профессор
Отправить личное сообщение для Bond Посмотреть профиль Найти все сообщения от Bond
 
Регистрация: 16.06.2013
Сообщений: 172

Ruslan_xDD, спасибо. Пошла оптимизация оптимизации.
Скоро допишемся что останется 3 строки всего кода
Ответить с цитированием
  #7 (permalink)  
Старый 19.05.2016, 20:52
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Сообщение от Bond
Скоро допишемся что останется 3 строки всего кода
трудночитаемого кода
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс .active для активного блока div dima_riabets Элементы интерфейса 3 02.12.2015 22:54
Дополнить плагин для мозилы JS-API 10000руб Chris_Phils Работа 2 30.09.2015 13:59
Как узнать реальный borderLeftWidth для TD в FireFox? gadyuka Events/DOM/Window 2 14.07.2013 11:58
Userscript для скрытия блока MustDie Firefox/Mozilla 12 02.08.2010 14:54