Greasy Fork

来自缓存

Greasy Fork is available in English.

自动适应屏幕大小

自动将页面宽度调整为适合屏幕大小的宽度

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        自动适应屏幕大小
// @version     0.63
// @description 自动将页面宽度调整为适合屏幕大小的宽度
// @match       *://*/*
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_notification
// @namespace   http://tampermonkey.net/
// ==/UserScript==

(function () {
  const SCROLLBAR_ADJUST = 16; // 滚动条宽度的调整值
  const MARGIN_ADJUST = 16; // 页面边距调整值

  // 计算宽度调整值
  function getWidthAdjustment() {
    return window.innerWidth - SCROLLBAR_ADJUST - MARGIN_ADJUST * 2;
  }

  // 遍历元素并处理
  function iter(elems, f) {
    for (let i = 0; i < elems.length; i++) {
      const e = elems[i];
      if (f(e)) {
        // 处理 e 元素
      }
    }
  }

  // 自适应宽度
  function fit() {
    addPreWrapCSS();
    const elements = document.querySelectorAll('*');

    iter(elements, function (e) {
      if (e.tagName === 'PRE') {
        e.style.maxWidth = 'none';
      }

      const offsetWidth = e.offsetWidth;
      const widthAdjustment = getWidthAdjustment();
      if (offsetWidth > widthAdjustment) {
        e.style.width = `calc(100% - ${MARGIN_ADJUST * 2}px)`;
        e.style.boxSizing = 'border-box';
        e.style.marginLeft = `${MARGIN_ADJUST}px`;
        e.style.marginRight = `${MARGIN_ADJUST}px`;
      } else {
        e.style.width = 'auto';
        e.style.marginLeft = 'auto';
        e.style.marginRight = 'auto';
      }
    });

    // 修改默认字号
    const defaultFontSize = parseFloat(document.body.style.fontSize);
    document.body.style.fontSize = `${defaultFontSize * 6}px`;
  }

  // 添加 pre 元素的 white-space 属性
  function addPreWrapCSS() {
    const style = document.createElement('style');
    style.innerHTML = 'pre { white-space: pre-wrap; }';
    document.head.appendChild(style);
  }

  // 切换自适应宽度状态
  function applyFit() {
    const isFit = !GM_getValue('isFit', true);
    GM_setValue('isFit', isFit);
    GM_notification('自适应宽度状态已更新:' + (isFit ? '开启' : '关闭'));
    window.postMessage({ cmd: 'toggle', fit: isFit }, '*');
    fit();
  }

  // 处理消息
  function processMessage(event) {
    if (event.data.cmd === 'toggle') {
      applyFit();
    }
  }

  // 监听窗口大小变化
  window.addEventListener('resize', function () {
    if (GM_getValue('isFit', true)) {
      fit();
    }
  });

  // 监听消息事件
  window.addEventListener('message', processMessage, false);

  // 初始化
  fit();

  // 监听查看全部回答按钮的点击事件
  const btn = document.querySelector('.QuestionMainAction');
  if (btn) {
    btn.addEventListener('click', function () {
      // 等待回答内容加载完成后再执行自适应宽度
      setTimeout(fit, 1000);
    });
  }
})();