mirror of
https://github.com/Terranom674/Piwigo_Bratonien_Tools.git
synced 2026-09-19 14:04:34 +00:00
Add hover overlays to picture navigation zones
This commit is contained in:
@@ -4,6 +4,15 @@
|
|||||||
var SIDE_RATIO = 0.18;
|
var SIDE_RATIO = 0.18;
|
||||||
var PREVIEW_RATIO = 0.18;
|
var PREVIEW_RATIO = 0.18;
|
||||||
var resizeTimer = null;
|
var resizeTimer = null;
|
||||||
|
var overlayContainer = null;
|
||||||
|
var overlays = {};
|
||||||
|
|
||||||
|
var zoneIcons = {
|
||||||
|
previous: 'fas fa-chevron-left',
|
||||||
|
thumbnails: 'fas fa-chevron-up',
|
||||||
|
photoswipe: 'fas fa-expand-arrows-alt',
|
||||||
|
next: 'fas fa-chevron-right'
|
||||||
|
};
|
||||||
|
|
||||||
function absoluteUrl(url) {
|
function absoluteUrl(url) {
|
||||||
if (!url) {
|
if (!url) {
|
||||||
@@ -69,6 +78,80 @@
|
|||||||
return area;
|
return area;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ensureOverlayContainer(image) {
|
||||||
|
if (overlayContainer && document.body.contains(overlayContainer)) {
|
||||||
|
return overlayContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
var parent = image.parentElement;
|
||||||
|
if (!parent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window.getComputedStyle(parent).position === 'static') {
|
||||||
|
parent.style.position = 'relative';
|
||||||
|
}
|
||||||
|
|
||||||
|
overlayContainer = document.createElement('div');
|
||||||
|
overlayContainer.className = 'bratonien-picture-zones';
|
||||||
|
overlayContainer.setAttribute('aria-hidden', 'true');
|
||||||
|
parent.appendChild(overlayContainer);
|
||||||
|
|
||||||
|
Object.keys(zoneIcons).forEach(function (role) {
|
||||||
|
var zone = document.createElement('div');
|
||||||
|
zone.className = 'bratonien-picture-zone bratonien-picture-zone-' + role;
|
||||||
|
zone.setAttribute('data-bratonien-zone-overlay', role);
|
||||||
|
|
||||||
|
var icon = document.createElement('i');
|
||||||
|
icon.className = zoneIcons[role];
|
||||||
|
zone.appendChild(icon);
|
||||||
|
|
||||||
|
overlayContainer.appendChild(zone);
|
||||||
|
overlays[role] = zone;
|
||||||
|
});
|
||||||
|
|
||||||
|
return overlayContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setOverlayRect(role, left, top, width, height) {
|
||||||
|
var overlay = overlays[role];
|
||||||
|
if (!overlay) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
overlay.style.left = left + 'px';
|
||||||
|
overlay.style.top = top + 'px';
|
||||||
|
overlay.style.width = width + 'px';
|
||||||
|
overlay.style.height = height + 'px';
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideAllOverlays() {
|
||||||
|
Object.keys(overlays).forEach(function (role) {
|
||||||
|
overlays[role].classList.remove('is-active');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function bindAreaHover(area, role) {
|
||||||
|
if (!area || area.getAttribute('data-bratonien-hover-bound') === '1') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
area.setAttribute('data-bratonien-hover-bound', '1');
|
||||||
|
|
||||||
|
area.addEventListener('mouseenter', function () {
|
||||||
|
hideAllOverlays();
|
||||||
|
if (overlays[role]) {
|
||||||
|
overlays[role].classList.add('is-active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
area.addEventListener('mouseleave', function () {
|
||||||
|
if (overlays[role]) {
|
||||||
|
overlays[role].classList.remove('is-active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function setZone(area, role, coords) {
|
function setZone(area, role, coords) {
|
||||||
if (!area) {
|
if (!area) {
|
||||||
return;
|
return;
|
||||||
@@ -77,6 +160,7 @@
|
|||||||
area.setAttribute('shape', 'rect');
|
area.setAttribute('shape', 'rect');
|
||||||
area.setAttribute('coords', coords.join(','));
|
area.setAttribute('coords', coords.join(','));
|
||||||
area.setAttribute('data-bratonien-zone', role);
|
area.setAttribute('data-bratonien-zone', role);
|
||||||
|
bindAreaHover(area, role);
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateMap() {
|
function updateMap() {
|
||||||
@@ -102,6 +186,8 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ensureOverlayContainer(image);
|
||||||
|
|
||||||
var leftEdge = Math.round(width * SIDE_RATIO);
|
var leftEdge = Math.round(width * SIDE_RATIO);
|
||||||
var rightEdge = Math.round(width * (1 - SIDE_RATIO));
|
var rightEdge = Math.round(width * (1 - SIDE_RATIO));
|
||||||
var previewBottom = Math.round(height * PREVIEW_RATIO);
|
var previewBottom = Math.round(height * PREVIEW_RATIO);
|
||||||
@@ -115,6 +201,14 @@
|
|||||||
setZone(nextArea, 'next', [rightEdge, 0, width, height]);
|
setZone(nextArea, 'next', [rightEdge, 0, width, height]);
|
||||||
setZone(upArea, 'thumbnails', [leftEdge, 0, rightEdge, previewBottom]);
|
setZone(upArea, 'thumbnails', [leftEdge, 0, rightEdge, previewBottom]);
|
||||||
setZone(photoSwipeArea, 'photoswipe', [leftEdge, previewBottom, rightEdge, height]);
|
setZone(photoSwipeArea, 'photoswipe', [leftEdge, previewBottom, rightEdge, height]);
|
||||||
|
|
||||||
|
var imageLeft = image.offsetLeft;
|
||||||
|
var imageTop = image.offsetTop;
|
||||||
|
|
||||||
|
setOverlayRect('previous', imageLeft, imageTop, leftEdge, height);
|
||||||
|
setOverlayRect('next', imageLeft + rightEdge, imageTop, width - rightEdge, height);
|
||||||
|
setOverlayRect('thumbnails', imageLeft + leftEdge, imageTop, rightEdge - leftEdge, previewBottom);
|
||||||
|
setOverlayRect('photoswipe', imageLeft + leftEdge, imageTop + previewBottom, rightEdge - leftEdge, height - previewBottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
function scheduleUpdate() {
|
function scheduleUpdate() {
|
||||||
|
|||||||
Reference in New Issue
Block a user