|
Letzte besuchte Seiten |
Seite zuletzt verändert am 11:57, 24 Feb 2026 von Minocula
toc-menuVon $1Inhaltsverzeichniskeine Gliederung
/* ==========================================================
* TOC MENU
* FIX 24.02.2026: Singleton Guard + td.left Blocker Fix
* ========================================================== */
:root {
--menu-width: 500px;
--menu-width-mobile: 320px;
--menu-max-height: 70vh;
--menu-max-height-mobile: 60vh;
--menu-font-size: 18px;
--menu-font-title-size: 22px;
--menu-background: white;
--menu-border-color: #ddd;
--icon-size: 50px;
--icon-size-mobile: 45px;
--icon-background: #333;
--icon-background-hover: #555;
}
/* FIX 24.02.2026: MindTouch Layout-Tabelle blockiert fixed-position Elemente */
td.left {
pointer-events: none;
}
td.left > * {
pointer-events: auto;
}
.menu-toggle-icon {
position: fixed !important;
bottom: 30px !important;
left: 30px !important;
width: var(--icon-size) !important;
height: var(--icon-size) !important;
background: var(--icon-background) !important;
border-radius: 50% !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
cursor: pointer !important;
z-index: 9998 !important;
opacity: 0 !important;
visibility: hidden !important;
pointer-events: none !important;
transition: opacity 0.4s ease, visibility 0.4s ease !important;
}
.menu-toggle-icon.visible {
opacity: 0.8 !important;
visibility: visible !important;
pointer-events: auto !important;
}
.menu-toggle-icon:hover {
opacity: 1 !important;
background: var(--icon-background-hover) !important;
}
.menu-toggle-icon::before {
content: '\2630' !important;
color: white !important;
font-size: 28px !important;
font-weight: bold !important;
line-height: 1 !important;
margin-left: 5px !important;
}
#menuPageContent {
position: fixed !important;
bottom: 90px !important;
left: 20px !important;
background: var(--menu-background) !important;
border: 1px solid var(--menu-border-color) !important;
width: var(--menu-width) !important;
max-height: var(--menu-max-height) !important;
overflow-y: auto !important;
overflow-x: hidden !important;
z-index: 2147483647 !important;
box-sizing: border-box !important;
}
#menuPageContent *,
#menuPageContent .dmenu-top_m,
#menuPageContent .dmenu-body_m {
box-sizing: border-box !important;
width: 100% !important;
max-width: 100% !important;
background: var(--menu-background) !important;
}
#menuPageContent .dmenu-top_m,
#menuPageContent .dmenu-body_m {
font-size: var(--menu-font-size) !important;
line-height: 1.8 !important;
}
#menuPageContent .dmenu-body_m ol li a {
font-size: var(--menu-font-title-size) !important;
}
#menuPageContent::-webkit-scrollbar {
width: 8px !important;
}
#menuPageContent::-webkit-scrollbar-track {
background: var(--menu-background) !important;
}
#menuPageContent::-webkit-scrollbar-thumb {
background: #888 !important;
}
#menuPageContent::-webkit-scrollbar-thumb:hover {
background: #555 !important;
}
@media (max-width: 768px) {
.menu-toggle-icon {
width: var(--icon-size-mobile) !important;
height: var(--icon-size-mobile) !important;
bottom: 20px !important;
left: 20px !important;
}
#menuPageContent {
width: var(--menu-width-mobile) !important;
bottom: 75px !important;
max-height: var(--menu-max-height-mobile) !important;
}
}
(function() {
/* ==========================================================
* TOC MENU - mit Singleton Guard + Scroll Visibility
* FIX 24.02.2026: Singleton, td.left Fix, Scroll ab 1000px
* ========================================================== */
if (window._tocMenuInit) {
if (window.console) console.log('[TOC-Menu] SKIP: Bereits initialisiert (Singleton)');
return;
}
window._tocMenuInit = true;
var PREFIX = '[TOC-Menu] ';
var THRESHOLD = 1000;
var isMenuOpen = false;
var isIconVisible = false;
var scrollTimer = null;
function log(msg) {
if (window.console && console.log) {
console.log(PREFIX + msg);
}
}
log('Init gestartet...');
var menuIcon = document.getElementById('menuToggleIcon');
if (!menuIcon) {
log('ERROR: menuToggleIcon nicht gefunden!');
return;
}
/* Scroll-Visibility: Icon erst ab 1000px */
function updateVisibility() {
var scrollTop = window.pageYOffset ||
document.documentElement.scrollTop ||
document.body.scrollTop || 0;
if (scrollTop > THRESHOLD && !isIconVisible) {
menuIcon.className = 'menu-toggle-icon visible';
isIconVisible = true;
log('Icon sichtbar (Scroll > ' + THRESHOLD + 'px)');
} else if (scrollTop <= THRESHOLD && isIconVisible) {
menuIcon.className = 'menu-toggle-icon';
isIconVisible = false;
/* Menu auch schliessen wenn Icon verschwindet */
var dmenu = document.getElementById('menuPageContent');
if (isMenuOpen && dmenu) {
dmenu.style.display = 'none';
isMenuOpen = false;
}
}
}
/* Hamburger Icon Klick */
menuIcon.addEventListener('click', function(e) {
e.stopPropagation();
var dmenu = document.getElementById('menuPageContent');
if (dmenu) {
if (isMenuOpen) {
dmenu.style.display = 'none';
isMenuOpen = false;
log('Menu geschlossen');
} else {
window.menuBubble = true;
dmenu.style.display = 'block';
isMenuOpen = true;
log('Menu geoeffnet');
}
}
});
/* Klick ausserhalb schliesst Menu */
document.addEventListener('click', function(e) {
var dmenu = document.getElementById('menuPageContent');
if (isMenuOpen && dmenu) {
var clickedInsideMenu = dmenu.contains(e.target);
var clickedIcon = menuIcon.contains(e.target);
if (!clickedInsideMenu && !clickedIcon) {
dmenu.style.display = 'none';
isMenuOpen = false;
log('Menu geschlossen (Klick aussen)');
} else if (clickedInsideMenu && e.target.tagName === 'A') {
dmenu.style.display = 'none';
isMenuOpen = false;
log('Menu geschlossen (Link geklickt)');
}
}
});
/* Scroll Listener mit Throttle */
if (window.addEventListener) {
window.addEventListener('scroll', function() {
clearTimeout(scrollTimer);
scrollTimer = setTimeout(updateVisibility, 80);
}, false);
} else if (window.attachEvent) {
window.attachEvent('onscroll', function() {
clearTimeout(scrollTimer);
scrollTimer = setTimeout(updateVisibility, 80);
});
}
/* Initial Check */
updateVisibility();
log('Fertig! Threshold: ' + THRESHOLD + 'px');
})();
|
Details: