mirror of https://github.com/friendica/friendica
127 lines
4.4 KiB
JavaScript
127 lines
4.4 KiB
JavaScript
'use strict';
|
|
|
|
var _ = require('../lib/helper');
|
|
var cls = require('../lib/class');
|
|
var dom = require('../lib/dom');
|
|
var instances = require('./instances');
|
|
var updateScroll = require('./update-scroll');
|
|
|
|
function getThumbSize(i, thumbSize) {
|
|
if (i.settings.minScrollbarLength) {
|
|
thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength);
|
|
}
|
|
if (i.settings.maxScrollbarLength) {
|
|
thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength);
|
|
}
|
|
return thumbSize;
|
|
}
|
|
|
|
function updateCss(element, i) {
|
|
var xRailOffset = {width: i.railXWidth};
|
|
if (i.isRtl) {
|
|
xRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth - i.contentWidth;
|
|
} else {
|
|
xRailOffset.left = element.scrollLeft;
|
|
}
|
|
if (i.isScrollbarXUsingBottom) {
|
|
xRailOffset.bottom = i.scrollbarXBottom - element.scrollTop;
|
|
} else {
|
|
xRailOffset.top = i.scrollbarXTop + element.scrollTop;
|
|
}
|
|
dom.css(i.scrollbarXRail, xRailOffset);
|
|
|
|
var yRailOffset = {top: element.scrollTop, height: i.railYHeight};
|
|
if (i.isScrollbarYUsingRight) {
|
|
if (i.isRtl) {
|
|
yRailOffset.right = i.contentWidth - (i.negativeScrollAdjustment + element.scrollLeft) - i.scrollbarYRight - i.scrollbarYOuterWidth;
|
|
} else {
|
|
yRailOffset.right = i.scrollbarYRight - element.scrollLeft;
|
|
}
|
|
} else {
|
|
if (i.isRtl) {
|
|
yRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth * 2 - i.contentWidth - i.scrollbarYLeft - i.scrollbarYOuterWidth;
|
|
} else {
|
|
yRailOffset.left = i.scrollbarYLeft + element.scrollLeft;
|
|
}
|
|
}
|
|
dom.css(i.scrollbarYRail, yRailOffset);
|
|
|
|
dom.css(i.scrollbarX, {left: i.scrollbarXLeft, width: i.scrollbarXWidth - i.railBorderXWidth});
|
|
dom.css(i.scrollbarY, {top: i.scrollbarYTop, height: i.scrollbarYHeight - i.railBorderYWidth});
|
|
}
|
|
|
|
module.exports = function (element) {
|
|
var i = instances.get(element);
|
|
|
|
i.containerWidth = element.clientWidth;
|
|
i.containerHeight = element.clientHeight;
|
|
i.contentWidth = element.scrollWidth;
|
|
i.contentHeight = element.scrollHeight;
|
|
|
|
var existingRails;
|
|
if (!element.contains(i.scrollbarXRail)) {
|
|
existingRails = dom.queryChildren(element, '.ps-scrollbar-x-rail');
|
|
if (existingRails.length > 0) {
|
|
existingRails.forEach(function (rail) {
|
|
dom.remove(rail);
|
|
});
|
|
}
|
|
dom.appendTo(i.scrollbarXRail, element);
|
|
}
|
|
if (!element.contains(i.scrollbarYRail)) {
|
|
existingRails = dom.queryChildren(element, '.ps-scrollbar-y-rail');
|
|
if (existingRails.length > 0) {
|
|
existingRails.forEach(function (rail) {
|
|
dom.remove(rail);
|
|
});
|
|
}
|
|
dom.appendTo(i.scrollbarYRail, element);
|
|
}
|
|
|
|
if (!i.settings.suppressScrollX && i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth) {
|
|
i.scrollbarXActive = true;
|
|
i.railXWidth = i.containerWidth - i.railXMarginWidth;
|
|
i.railXRatio = i.containerWidth / i.railXWidth;
|
|
i.scrollbarXWidth = getThumbSize(i, _.toInt(i.railXWidth * i.containerWidth / i.contentWidth));
|
|
i.scrollbarXLeft = _.toInt((i.negativeScrollAdjustment + element.scrollLeft) * (i.railXWidth - i.scrollbarXWidth) / (i.contentWidth - i.containerWidth));
|
|
} else {
|
|
i.scrollbarXActive = false;
|
|
}
|
|
|
|
if (!i.settings.suppressScrollY && i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight) {
|
|
i.scrollbarYActive = true;
|
|
i.railYHeight = i.containerHeight - i.railYMarginHeight;
|
|
i.railYRatio = i.containerHeight / i.railYHeight;
|
|
i.scrollbarYHeight = getThumbSize(i, _.toInt(i.railYHeight * i.containerHeight / i.contentHeight));
|
|
i.scrollbarYTop = _.toInt(element.scrollTop * (i.railYHeight - i.scrollbarYHeight) / (i.contentHeight - i.containerHeight));
|
|
} else {
|
|
i.scrollbarYActive = false;
|
|
}
|
|
|
|
if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) {
|
|
i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth;
|
|
}
|
|
if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) {
|
|
i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight;
|
|
}
|
|
|
|
updateCss(element, i);
|
|
|
|
if (i.scrollbarXActive) {
|
|
cls.add(element, 'ps-active-x');
|
|
} else {
|
|
cls.remove(element, 'ps-active-x');
|
|
i.scrollbarXWidth = 0;
|
|
i.scrollbarXLeft = 0;
|
|
updateScroll(element, 'left', 0);
|
|
}
|
|
if (i.scrollbarYActive) {
|
|
cls.add(element, 'ps-active-y');
|
|
} else {
|
|
cls.remove(element, 'ps-active-y');
|
|
i.scrollbarYHeight = 0;
|
|
i.scrollbarYTop = 0;
|
|
updateScroll(element, 'top', 0);
|
|
}
|
|
};
|