☰

Imaglr Scale Content to Screen

Scale videos and images on Imaglr to fit on one screen

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴、Greasemonkey 油猴子 或 Violentmonkey 暴力猴,才能安装此脚本。

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴 或 Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴 或 Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Imaglr Scale Content to Screen
// @namespace    https://imaglr.com/
// @version      1.3
// @license      Public Domain
// @description  Scale videos and images on Imaglr to fit on one screen
// @author       Literally ChatGPT
// @match        https://imaglr.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=imaglr.com
// @grant        none
// ==/UserScript==

const MAX_VH = 0.9;

function clampMedia(el) {
  // Reset width so we can measure correctly
  el.style.width = '100%';
  el.style.maxWidth = '100%';

  const rect = el.getBoundingClientRect();
  const maxHeightPx = window.innerHeight * MAX_VH;

  if (rect.height > maxHeightPx) {
    const scale = maxHeightPx / rect.height;
    const newWidth = rect.width * scale;
    el.style.width = `${newWidth}px`;
  }

  // Horizontal centering
  el.style.display = 'block';
  el.style.marginLeft = 'auto';
  el.style.marginRight = 'auto';
}

function centerContainers() {
  document.querySelectorAll('.vertical-media-item').forEach(el => {
    el.style.display = 'flex';
    el.style.justifyContent = 'center';
    el.style.alignItems = 'center';
  });
}

function processAll() {
  const media = document.querySelectorAll('img.w-full, video.w-full, .media-item');
  media.forEach(clampMedia);
  centerContainers();
}

// Initial pass
processAll();

// Re-run on window resize
window.addEventListener('resize', processAll);

// Robust MutationObserver (watch everything in body)
const observer = new MutationObserver(processAll);
observer.observe(document.body, { childList: true, subtree: true });

// Extra fallback: periodically process new posts in case the observer misses something
setInterval(processAll, 1000); // every 1 second