Почему внезапно заработал hover на айфон?

209
17 апреля 2018, 03:56

Насколько мне известно, hover на айфонах просто так не работает. Но тут меня постиг сюрприз. Просматривая результат своих трудов на айфоне, hover внезапно ожил, так что ли. А почему так и не понял. Буду благодарен тому, кто объяснил бы, как это так получилось.

(function () {
  'use strict';
// Base elements  
var container = document.querySelector('#js-container'),
    sections = container.children,
    navigator = document.querySelector('.js-nav');
// Options
var durarion = 700;
// Counter sections
var counterSections = 0;
// Other
var data = 'data-anchor';
/* 
  Функция получает значение атрибута data- и передает его функции searchSect. 
*/
function handler(e) {
  var target = e.target;
  if (target.hasAttribute(data) && target.tagName.toLowerCase() === 'a') 
    e.preventDefault();
  if (target.hasAttribute(data)) 
    searchSect(target.getAttribute(data));
}
/* 
  Проходим по секциям и, сравнивает переданное значение data- из фунции handler с id секции,
  если совпадение true то в переменную counterSections записывается индекс секции с нужным id.
  Далее в функцию moveSect передается секция соответствующая индексу.  
*/
function searchSect(sectID) {
  for (var indx=0, len=sections.length-1; indx<=len; indx++) 
    if (sections[indx].getAttribute('id') === sectID) 
      counterSections = indx;
  return moveSect(sections[counterSections]);
}
/* 
  У секции вычисляется значение offsetTop для смещение контейнера равной полученному значению.
*/
function moveSect(sect) {
  container.style.transform = 'translateY(-'+sect.offsetTop+'px)';
  container.style.transition = 'all '+durarion+'ms';
  currentSect();
}
/* 
  Для отображения в навигаторе секции, которая в данный момент просматривается, 
  используем значение counterSection. Добавляем класс active ссылке в навигаторе, 
  которая имеет индекс равный значению counterSections. 
  Так как sections=dots&&dots=sections
*/
function currentSect() {
  var dots = navigator.getElementsByTagName('a');
  for (var indx=0, len=dots.length-1; indx<=len; indx++)
    if (dots[indx].classList.contains('active')) 
      dots[indx].classList.remove('active');
  dots[counterSections].classList.add('active');
}
currentSect();
navigator.addEventListener('click', handler);
var x, y, newX, newY;
container.addEventListener('touchstart', function (e) {
  /* 
    Если в касание участвует больше одного пальца, false.
  */
  if (e.touches.length !== 1) return;
  /* 
    Получаем координаты точек касания.
  */
  var touch = e.changedTouches[0];
  x = touch.screenX;
  y = touch.screenY
});
container.addEventListener('touchmove', function (e) {
  /* 
    Отменяем действие по умолчанию для ipad, iphone
  */
  e.preventDefault();
});
container.addEventListener('touchend', function (e) {
  var touch = e.changedTouches[0];
  /* 
    Получаем точек завершения касания.
  */
  newX = touch.screenX;
  newY = touch.screenY;
  /* 
    Сравниваем. Если смещение по оси y больше чем по x значит, пользователь листает.
  */
  if (Math.abs(x-newX) >= Math.abs(y-newY)) return;
  /* 
    Если начальное значение больше конечного.
    Пользователь листает вниз. Если меньше листает вверх.
  */
  if (counterSections !== sections.length-1 && y > newY) 
    moveSect(sections[++counterSections]);  
  else if (counterSections !== 0 && y < newY) 
    moveSect(sections[--counterSections]);    
});
container.addEventListener('click', handler);
})();
READ ALSO
Не работает секундомер (React)

Не работает секундомер (React)

Добрый день, буду рад, если вы мне поможете

286
Цвет текста на фоне

Цвет текста на фоне

Возник вопрос: Есть панель, которая меняет свой цвет в зависимости от действий пользователя, а на ней должен отображаться текстИз-за того...

181
Как привести в читаемый вид код js?

Как привести в читаемый вид код js?

Нужно редактировать сжатый js-кодНикогда раньше с этим не сталкивался

171
Нужен совет по реализации модульности

Нужен совет по реализации модульности

Опишу суть вопросаЕсть сайт

187