MediaWiki:Common.js: Difference between revisions
Appearance
Cdjensen94 (talk | contribs) No edit summary |
Cdjensen94 (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
(function() { | (function() { | ||
function | function resetSlideshowLayout(mwSlideshow) { | ||
const slideshow = mwSlideshow.querySelector('.slideshow'); | const slideshow = mwSlideshow.querySelector('.slideshow'); | ||
if (!slideshow) return; | if (!slideshow) return; | ||
// | // Remove bad positioning injected by original slideshow JS | ||
slideshow.style.position = 'relative'; | slideshow.style.position = 'relative'; | ||
slideshow.style.left = ''; | slideshow.style.left = '0'; | ||
slideshow.style.top = ''; | slideshow.style.top = '0'; | ||
slideshow.style.transform = ''; | slideshow.style.transform = 'none'; | ||
// | // Let mw-jsslideshow size to fit its parent, no forced widths | ||
mwSlideshow.style.width = | mwSlideshow.style.width = '100%'; | ||
mwSlideshow.style.height = | mwSlideshow.style.height = 'auto'; | ||
// | // Allow slideshow div to naturally flow within mw-jsslideshow | ||
slideshow.style.width = '100%'; | |||
slideshow.style.height = 'auto'; | |||
// Reset each slide div to flow properly | |||
slideshow.querySelectorAll('div').forEach(slide => { | slideshow.querySelectorAll('div').forEach(slide => { | ||
slide.style.width = '100%'; | |||
slide.style.height = 'auto'; | |||
slide.style.display = 'flex'; | |||
slide.style.justifyContent = 'center'; | |||
slide.style.alignItems = 'center'; | |||
}); | |||
// Reset images to behave like good responsive citizens | |||
slideshow.querySelectorAll('img').forEach(img => { | |||
img.style.width = '100%'; | |||
img.style.height = 'auto'; | |||
img.style.objectFit = 'contain'; | |||
img.style.display = 'block'; | |||
}); | }); | ||
} | } | ||
function initSlideshowFixer() { | |||
document.querySelectorAll('.mw-jsslideshow').forEach(mwSlideshow => { | document.querySelectorAll('.mw-jsslideshow').forEach(mwSlideshow => { | ||
resetSlideshowLayout(mwSlideshow); | |||
// | // Re-run on window resize | ||
window.addEventListener('resize', () => { | window.addEventListener('resize', () => { | ||
resetSlideshowLayout(mwSlideshow); | |||
}); | }); | ||
const slideshow = mwSlideshow.querySelector('.slideshow'); | const slideshow = mwSlideshow.querySelector('.slideshow'); | ||
if (slideshow) { | if (slideshow) { | ||
// Watch for DOM changes (slide changes) | |||
const observer = new MutationObserver(() => { | const observer = new MutationObserver(() => { | ||
resetSlideshowLayout(mwSlideshow); | |||
}); | }); | ||
observer.observe(slideshow, { | observer.observe(slideshow, { | ||
attributes: true, | attributes: true, | ||
childList: true, | childList: true, | ||
subtree: true | subtree: true | ||
Line 67: | Line 63: | ||
if (document.readyState === 'complete' || document.readyState === 'interactive') { | if (document.readyState === 'complete' || document.readyState === 'interactive') { | ||
initSlideshowFixer(); | |||
} else { | } else { | ||
document.addEventListener('DOMContentLoaded', | document.addEventListener('DOMContentLoaded', initSlideshowFixer); | ||
} | } | ||
Revision as of 13:47, 3 March 2025
(function() {
function resetSlideshowLayout(mwSlideshow) {
const slideshow = mwSlideshow.querySelector('.slideshow');
if (!slideshow) return;
// Remove bad positioning injected by original slideshow JS
slideshow.style.position = 'relative';
slideshow.style.left = '0';
slideshow.style.top = '0';
slideshow.style.transform = 'none';
// Let mw-jsslideshow size to fit its parent, no forced widths
mwSlideshow.style.width = '100%';
mwSlideshow.style.height = 'auto';
// Allow slideshow div to naturally flow within mw-jsslideshow
slideshow.style.width = '100%';
slideshow.style.height = 'auto';
// Reset each slide div to flow properly
slideshow.querySelectorAll('div').forEach(slide => {
slide.style.width = '100%';
slide.style.height = 'auto';
slide.style.display = 'flex';
slide.style.justifyContent = 'center';
slide.style.alignItems = 'center';
});
// Reset images to behave like good responsive citizens
slideshow.querySelectorAll('img').forEach(img => {
img.style.width = '100%';
img.style.height = 'auto';
img.style.objectFit = 'contain';
img.style.display = 'block';
});
}
function initSlideshowFixer() {
document.querySelectorAll('.mw-jsslideshow').forEach(mwSlideshow => {
resetSlideshowLayout(mwSlideshow);
// Re-run on window resize
window.addEventListener('resize', () => {
resetSlideshowLayout(mwSlideshow);
});
const slideshow = mwSlideshow.querySelector('.slideshow');
if (slideshow) {
// Watch for DOM changes (slide changes)
const observer = new MutationObserver(() => {
resetSlideshowLayout(mwSlideshow);
});
observer.observe(slideshow, {
attributes: true,
childList: true,
subtree: true
});
}
});
}
if (document.readyState === 'complete' || document.readyState === 'interactive') {
initSlideshowFixer();
} else {
document.addEventListener('DOMContentLoaded', initSlideshowFixer);
}
function cleanSlideshowStyles(slideshowContainer) {
const slideshow = slideshowContainer.querySelector('.slideshow');
if (slideshow) {
// Remove inline styles on the main slideshow container
slideshow.style.width = '';
slideshow.style.height = '';
// Remove inline styles on each slide div
slideshow.querySelectorAll('div').forEach(slide => {
slide.style.width = '';
slide.style.height = '';
});
}
}
function initSlideshowFix() {
// Locate all mw-jsslideshow instances
document.querySelectorAll('.mw-jsslideshow').forEach(mwSlideshow => {
// Clean styles on page load
cleanSlideshowStyles(mwSlideshow);
// Optional: Re-clean styles on window resize
window.addEventListener('resize', () => {
cleanSlideshowStyles(mwSlideshow);
});
// Hook into slide transitions if needed (depends on the specific JS driving the slideshow)
const slideshow = mwSlideshow.querySelector('.slideshow');
if (slideshow) {
const observer = new MutationObserver(() => {
cleanSlideshowStyles(mwSlideshow);
});
observer.observe(slideshow, {
attributes: true,
attributeFilter: ['style'],
childList: false,
subtree: false
});
}
});
}
// Run once DOM is ready (in case the slideshows are injected late)
if (document.readyState === 'complete' || document.readyState === 'interactive') {
initSlideshowFix();
} else {
document.addEventListener('DOMContentLoaded', initSlideshowFix);
}
})();
/* Any JavaScript here will be loaded for all users on every page load. */
(function() {
function cleanSlideshowStyles(slideshowContainer) {
const slideshow = slideshowContainer.querySelector('.slideshow');
if (slideshow) {
// Remove inline styles on the main slideshow container
slideshow.style.width = '';
slideshow.style.height = '';
// Remove inline styles on each slide div
slideshow.querySelectorAll('div').forEach(slide => {
slide.style.width = '';
slide.style.height = '';
});
}
}
function initSlideshowFix() {
// Locate all mw-jsslideshow instances
document.querySelectorAll('.mw-jsslideshow').forEach(mwSlideshow => {
// Clean styles on page load
cleanSlideshowStyles(mwSlideshow);
// Optional: Re-clean styles on window resize
window.addEventListener('resize', () => {
cleanSlideshowStyles(mwSlideshow);
});
// Hook into slide transitions if needed (depends on the specific JS driving the slideshow)
const slideshow = mwSlideshow.querySelector('.slideshow');
if (slideshow) {
const observer = new MutationObserver(() => {
cleanSlideshowStyles(mwSlideshow);
});
observer.observe(slideshow, {
attributes: true,
attributeFilter: ['style'],
childList: false,
subtree: false
});
}
});
}
// Run once DOM is ready (in case the slideshows are injected late)
if (document.readyState === 'complete' || document.readyState === 'interactive') {
initSlideshowFix();
} else {
document.addEventListener('DOMContentLoaded', initSlideshowFix);
}
})();