mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-20 04:18:19 -07:00
Fix iOS blurry zoomed image
This commit is contained in:
parent
5b40232b7b
commit
f516bee147
@ -2,9 +2,14 @@
|
|||||||
* Image viewer component
|
* Image viewer component
|
||||||
* @module components/slideshow/slideshow
|
* @module components/slideshow/slideshow
|
||||||
*/
|
*/
|
||||||
define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'focusManager', 'browser', 'apphost', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (dialogHelper, inputManager, connectionManager, layoutManager, focusManager, browser, appHost) {
|
define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'focusManager', 'browser', 'apphost', 'dom', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (dialogHelper, inputManager, connectionManager, layoutManager, focusManager, browser, appHost, dom) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of transition event.
|
||||||
|
*/
|
||||||
|
const transitionEndEventName = dom.whichTransitionEvent();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves an item's image URL from the API.
|
* Retrieves an item's image URL from the API.
|
||||||
* @param {object|string} item - Item used to generate the image URL.
|
* @param {object|string} item - Item used to generate the image URL.
|
||||||
@ -240,6 +245,41 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles zoom changes.
|
||||||
|
*/
|
||||||
|
function onZoomChange(scale, imageEl, slideEl) {
|
||||||
|
const zoomImage = slideEl.querySelector('.swiper-zoom-fakeimg');
|
||||||
|
|
||||||
|
if (zoomImage) {
|
||||||
|
zoomImage.style.width = zoomImage.style.height = scale * 100 + '%';
|
||||||
|
|
||||||
|
if (scale > 1) {
|
||||||
|
if (zoomImage.classList.contains('swiper-zoom-fakeimg-hidden')) {
|
||||||
|
// Await for Swiper style changes
|
||||||
|
setTimeout(() => {
|
||||||
|
const callback = () => {
|
||||||
|
imageEl.removeEventListener(transitionEndEventName, callback);
|
||||||
|
zoomImage.classList.remove('swiper-zoom-fakeimg-hidden');
|
||||||
|
};
|
||||||
|
|
||||||
|
// Swiper set 'transition-duration: 300ms' for auto zoom
|
||||||
|
// and 'transition-duration: 0s' for touch zoom
|
||||||
|
const transitionDuration = parseFloat(imageEl.style.transitionDuration.replace(/[a-z]/i, ''));
|
||||||
|
|
||||||
|
if (transitionDuration > 0) {
|
||||||
|
imageEl.addEventListener(transitionEndEventName, callback);
|
||||||
|
} else {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
zoomImage.classList.add('swiper-zoom-fakeimg-hidden');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the Swiper instance and binds the relevant events.
|
* Initializes the Swiper instance and binds the relevant events.
|
||||||
* @param {HTMLElement} dialog - Element containing the dialog.
|
* @param {HTMLElement} dialog - Element containing the dialog.
|
||||||
@ -287,6 +327,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f
|
|||||||
|
|
||||||
swiperInstance.on('autoplayStart', onAutoplayStart);
|
swiperInstance.on('autoplayStart', onAutoplayStart);
|
||||||
swiperInstance.on('autoplayStop', onAutoplayStop);
|
swiperInstance.on('autoplayStop', onAutoplayStop);
|
||||||
|
swiperInstance.on('zoomChange', onZoomChange);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,6 +369,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f
|
|||||||
var html = '';
|
var html = '';
|
||||||
html += '<div class="swiper-slide" data-original="' + item.originalImage + '" data-itemid="' + item.Id + '" data-serverid="' + item.ServerId + '">';
|
html += '<div class="swiper-slide" data-original="' + item.originalImage + '" data-itemid="' + item.Id + '" data-serverid="' + item.ServerId + '">';
|
||||||
html += '<div class="swiper-zoom-container">';
|
html += '<div class="swiper-zoom-container">';
|
||||||
|
html += `<div class="swiper-zoom-fakeimg swiper-zoom-fakeimg-hidden" style="background-image: url('${item.originalImage}')"></div>`;
|
||||||
html += '<img src="' + item.originalImage + '" class="swiper-slide-img">';
|
html += '<img src="' + item.originalImage + '" class="swiper-slide-img">';
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
if (item.title || item.subtitle) {
|
if (item.title || item.subtitle) {
|
||||||
|
@ -124,3 +124,19 @@
|
|||||||
.slideSubtitle {
|
.slideSubtitle {
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.swiper-zoom-fakeimg {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
background-position: 50% 50%;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: contain;
|
||||||
|
z-index: 1;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-zoom-fakeimg-hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user