jellyfin-web/dashboard-ui/bower_components/emby-webcomponents/scrollhelper.js

137 lines
4.0 KiB
JavaScript
Raw Normal View History

2016-08-07 12:43:52 -07:00
define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) {
2016-02-29 09:23:30 -07:00
2016-03-11 20:29:37 -07:00
function getOffsets(elems) {
2016-02-29 09:23:30 -07:00
var doc = document;
2016-03-11 20:29:37 -07:00
var results = [];
2016-02-29 09:23:30 -07:00
if (!doc) {
2016-03-11 20:29:37 -07:00
return results;
2016-02-29 09:23:30 -07:00
}
var docElem = doc.documentElement;
2016-03-11 20:29:37 -07:00
var docElemValues = {
clientTop: docElem.clientTop,
clientLeft: docElem.clientLeft
};
2016-02-29 09:23:30 -07:00
var win = doc.defaultView;
2016-03-11 20:29:37 -07:00
var winValues = {
pageXOffset: win.pageXOffset,
pageYOffset: win.pageYOffset
2016-02-29 09:23:30 -07:00
};
2016-03-11 20:29:37 -07:00
var box;
var elem;
for (var i = 0, length = elems.length; i < length; i++) {
elem = elems[i];
// Support: BlackBerry 5, iOS 3 (original iPhone)
// If we don't have gBCR, just use 0,0 rather than error
if (elem.getBoundingClientRect) {
box = elem.getBoundingClientRect();
} else {
box = { top: 0, left: 0 };
}
results[i] = {
top: box.top + winValues.pageYOffset - docElemValues.clientTop,
left: box.left + winValues.pageXOffset - docElemValues.clientLeft
};
}
return results;
2016-02-29 09:23:30 -07:00
}
function getPosition(scrollContainer, item, horizontal) {
2016-03-11 20:29:37 -07:00
var offsets = getOffsets([scrollContainer, item]);
var slideeOffset = offsets[0];
var itemOffset = offsets[1];
2016-02-29 09:23:30 -07:00
var offset = horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top;
var size = item[horizontal ? 'offsetWidth' : 'offsetHeight'];
if (horizontal) {
offset += scrollContainer.scrollLeft;
} else {
offset += scrollContainer.scrollTop;
}
var frameSize = horizontal ? scrollContainer.offsetWidth : scrollContainer.offsetHeight;
return {
start: offset,
center: (offset - (frameSize / 2) + (size / 2)),
end: offset - frameSize + size,
size: size
};
}
function toCenter(container, elem, horizontal) {
var pos = getPosition(container, elem, horizontal);
if (container.scrollTo) {
if (horizontal) {
container.scrollTo(pos.center, 0);
} else {
container.scrollTo(0, pos.center);
}
} else {
if (horizontal) {
container.scrollLeft = Math.round(pos.center);
} else {
container.scrollTop = Math.round(pos.center);
}
}
}
function centerOnFocus(e, scrollSlider, horizontal) {
var focused = focusManager.focusableParent(e.target);
if (focused) {
toCenter(scrollSlider, focused, horizontal);
}
}
function centerOnFocusHorizontal(e) {
centerOnFocus(e, this, true);
}
function centerOnFocusVertical(e) {
centerOnFocus(e, this, false);
}
return {
getPosition: getPosition,
centerFocus: {
on: function (element, horizontal) {
if (horizontal) {
2016-08-07 12:43:52 -07:00
dom.addEventListener(element, 'focus', centerOnFocusHorizontal, {
capture: true,
passive: true
});
2016-02-29 09:23:30 -07:00
} else {
2016-08-07 12:43:52 -07:00
dom.addEventListener(element, 'focus', centerOnFocusVertical, {
capture: true,
passive: true
});
2016-02-29 09:23:30 -07:00
}
},
off: function (element, horizontal) {
if (horizontal) {
2016-08-07 12:43:52 -07:00
dom.removeEventListener(element, 'focus', centerOnFocusHorizontal, {
capture: true,
passive: true
});
2016-02-29 09:23:30 -07:00
} else {
2016-08-07 12:43:52 -07:00
dom.removeEventListener(element, 'focus', centerOnFocusVertical, {
capture: true,
passive: true
});
2016-02-29 09:23:30 -07:00
}
}
},
toCenter: toCenter
};
});