Насколько мне известно, 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);
})();
Сборка персонального компьютера от Artline: умный выбор для современных пользователей