swiper
Version:
Most modern mobile touch slider and framework with hardware accelerated transitions
138 lines (135 loc) • 5.14 kB
JavaScript
import { j as elementParents, h as elementOffset } from '../shared/utils.mjs';
const Keyboard = ({ swiper, extendParams, on, emit }) => {
extendParams({
keyboard: {
enabled: false,
onlyInViewport: true,
pageUpDown: true,
speed: undefined,
},
});
function getParams() {
return swiper.params.keyboard;
}
function handle(event) {
if (!swiper.enabled)
return;
const { rtlTranslate: rtl } = swiper;
const e = 'originalEvent' in event && event.originalEvent ? event.originalEvent : event;
const kc = e.keyCode || e.charCode;
const params = getParams();
const pageUpDown = !!params.pageUpDown;
const isPageUp = pageUpDown && kc === 33;
const isPageDown = pageUpDown && kc === 34;
const isArrowLeft = kc === 37;
const isArrowRight = kc === 39;
const isArrowUp = kc === 38;
const isArrowDown = kc === 40;
// Directions locks
if (!swiper.allowSlideNext &&
((swiper.isHorizontal() && isArrowRight) ||
(swiper.isVertical() && isArrowDown) ||
isPageDown)) {
return false;
}
if (!swiper.allowSlidePrev &&
((swiper.isHorizontal() && isArrowLeft) || (swiper.isVertical() && isArrowUp) || isPageUp)) {
return false;
}
if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
return undefined;
}
const activeElement = document.activeElement;
if (activeElement &&
(activeElement.isContentEditable ||
(activeElement.nodeName &&
(activeElement.nodeName.toLowerCase() === 'input' ||
activeElement.nodeName.toLowerCase() === 'textarea')))) {
return undefined;
}
if (params.onlyInViewport &&
(isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {
let inView = false;
// Check that swiper should be inside of visible area of window
if (elementParents(swiper.el, `.${swiper.params.slideClass}, swiper-slide`).length > 0 &&
elementParents(swiper.el, `.${swiper.params.slideActiveClass}`).length === 0) {
return undefined;
}
const el = swiper.el;
const swiperWidth = el.clientWidth;
const swiperHeight = el.clientHeight;
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
const swiperOffset = elementOffset(el);
if (rtl)
swiperOffset.left -= el.scrollLeft;
const swiperCoord = [
[swiperOffset.left, swiperOffset.top],
[swiperOffset.left + swiperWidth, swiperOffset.top],
[swiperOffset.left, swiperOffset.top + swiperHeight],
[swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight],
];
for (let i = 0; i < swiperCoord.length; i += 1) {
const point = swiperCoord[i];
if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {
if (point[0] === 0 && point[1] === 0)
continue;
inView = true;
}
}
if (!inView)
return undefined;
}
const speed = params.speed;
if (swiper.isHorizontal()) {
if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {
if (e.cancelable)
e.preventDefault();
}
if (((isPageDown || isArrowRight) && !rtl) || ((isPageUp || isArrowLeft) && rtl))
swiper.slideNext(speed);
if (((isPageUp || isArrowLeft) && !rtl) || ((isPageDown || isArrowRight) && rtl))
swiper.slidePrev(speed);
}
else {
if (isPageUp || isPageDown || isArrowUp || isArrowDown) {
if (e.cancelable)
e.preventDefault();
}
if (isPageDown || isArrowDown)
swiper.slideNext(speed);
if (isPageUp || isArrowUp)
swiper.slidePrev(speed);
}
emit('keyPress', kc);
return undefined;
}
function enable() {
if (swiper.keyboard.enabled)
return;
document.addEventListener('keydown', handle);
swiper.keyboard.enabled = true;
}
function disable() {
if (!swiper.keyboard.enabled)
return;
document.removeEventListener('keydown', handle);
swiper.keyboard.enabled = false;
}
swiper.keyboard = {
enabled: false,
enable,
disable,
};
on('init', () => {
if (getParams().enabled) {
enable();
}
});
on('destroy', () => {
if (swiper.keyboard.enabled) {
disable();
}
});
};
export { Keyboard as default };