This commit is contained in:
@@ -8,7 +8,6 @@ export default class Lightbox {
|
|||||||
this.options = {
|
this.options = {
|
||||||
alwaysShowNavOnTouchDevices: false,
|
alwaysShowNavOnTouchDevices: false,
|
||||||
fadeDuration: 600,
|
fadeDuration: 600,
|
||||||
fitImagesInViewport: true,
|
|
||||||
imageFadeDuration: 600,
|
imageFadeDuration: 600,
|
||||||
positionFromTop: 50,
|
positionFromTop: 50,
|
||||||
resizeDuration: 700,
|
resizeDuration: 700,
|
||||||
@@ -268,39 +267,63 @@ export default class Lightbox {
|
|||||||
return height;
|
return height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMediaSize(media, maxWidth, maxHeight) {
|
||||||
|
if (media.width <= maxWidth && media.height <= maxHeight) {
|
||||||
|
return {
|
||||||
|
width: media.width,
|
||||||
|
height: media.height
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const widthRatio = media.width / maxWidth;
|
||||||
|
const heightRatio = media.height / maxHeight;
|
||||||
|
|
||||||
|
if (widthRatio > heightRatio) {
|
||||||
|
return {
|
||||||
|
width: maxWidth,
|
||||||
|
height: Math.round(media.height / widthRatio)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
width: Math.round(media.width / heightRatio),
|
||||||
|
height: maxHeight
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fitSizeWithDataContainer(size, mediaType) {
|
||||||
|
const border = mediaType === 'image' ? this.imageBorderWidth : this.videoBorderWidth;
|
||||||
|
const maxOuterHeight = Math.max(window.innerHeight - this.options.positionFromTop, 1);
|
||||||
|
let fittedSize = size;
|
||||||
|
|
||||||
|
for (let i = 0; i < 5; i++) {
|
||||||
|
const containerWidth = fittedSize.width + this.containerPadding.left + this.containerPadding.right + border.left + border.right;
|
||||||
|
const containerHeight = fittedSize.height + this.containerPadding.top + this.containerPadding.bottom + border.top + border.bottom;
|
||||||
|
const dataHeight = this.getDataContainerHeight(containerWidth);
|
||||||
|
const overflow = Math.ceil(containerHeight + dataHeight - maxOuterHeight);
|
||||||
|
if (overflow <= 0 || fittedSize.height <= 1) break;
|
||||||
|
|
||||||
|
const height = Math.max(fittedSize.height - overflow, 1);
|
||||||
|
fittedSize = {
|
||||||
|
width: Math.max(Math.round(fittedSize.width * (height / fittedSize.height)), 1),
|
||||||
|
height
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return fittedSize;
|
||||||
|
}
|
||||||
|
|
||||||
updateSize(index) {
|
updateSize(index) {
|
||||||
const media = this.album[index];
|
const media = this.album[index];
|
||||||
const maxSizes = this.getMaxSizes(media.width, media.height, media.type);
|
const maxSizes = this.getMaxSizes(media.width, media.height, media.type);
|
||||||
let maxWidth = maxSizes.maxWidth;
|
const maxWidth = this.options.maxWidth ? Math.min(this.options.maxWidth, maxSizes.maxWidth) : maxSizes.maxWidth;
|
||||||
let maxHeight = maxSizes.maxHeight;
|
const maxHeight = this.options.maxHeight ? Math.min(this.options.maxHeight, maxSizes.maxHeight) : maxSizes.maxHeight;
|
||||||
|
const size = this.fitSizeWithDataContainer(this.getMediaSize(media, maxWidth, maxHeight), media.type);
|
||||||
if (this.options.fitImagesInViewport) {
|
|
||||||
if (this.options.maxWidth && this.options.maxWidth < maxWidth) maxWidth = this.options.maxWidth;
|
|
||||||
if (this.options.maxHeight && this.options.maxHeight < maxHeight) maxHeight = this.options.maxHeight;
|
|
||||||
} else {
|
|
||||||
maxWidth = this.options.maxWidth || media.width || maxWidth;
|
|
||||||
maxHeight = this.options.maxHeight || media.height || maxHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
let finalWidth;
|
|
||||||
let finalHeight;
|
|
||||||
if (media.width > maxWidth || media.height > maxHeight) {
|
|
||||||
if ((media.width / maxWidth) > (media.height / maxHeight)) {
|
|
||||||
finalWidth = maxWidth;
|
|
||||||
finalHeight = Math.round(media.height / (media.width / maxWidth));
|
|
||||||
} else {
|
|
||||||
finalWidth = Math.round(media.width / (media.height / maxHeight));
|
|
||||||
finalHeight = maxHeight;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
finalWidth = media.width;
|
|
||||||
finalHeight = media.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
const target = media.type === 'video' ? this.video : this.image;
|
const target = media.type === 'video' ? this.video : this.image;
|
||||||
target.width = finalWidth;
|
target.width = size.width;
|
||||||
target.height = finalHeight;
|
target.height = size.height;
|
||||||
this.sizeContainer(finalWidth, finalHeight, media.type);
|
this.sizeContainer(size.width, size.height, media.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
changeImage(index) {
|
changeImage(index) {
|
||||||
|
|||||||
Reference in New Issue
Block a user