Auto Hide Header On Scroll for Facebook

Scroll down to hide, scroll up to show. Fix clickable issue by removing Z-Index hacks.

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

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

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         Auto Hide Header On Scroll for Facebook
// @namespace    https://github.com/livinginpurple
// @version      0.20251201.7
// @description  Scroll down to hide, scroll up to show. Fix clickable issue by removing Z-Index hacks.
// @license      WTFPL
// @author       livinginpurple
// @match        *://www.facebook.com/*
// @run-at       document-end
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    const delta = 5;
    let lastScrollTop = 0;
    let navbarHeight = 0;
    let ticking = false;
    let header = null;

    function initialHidingHeader() {
        const target = document.querySelector('[role="banner"]');

        if (target) {
            header = target;
            init();
        } else {
            setTimeout(initialHidingHeader, 300);
        }
    }

    function init() {
        console.log(`${GM_info.script.name}: v${GM_info.script.version} (Touch Fix)`);

        header.style.transition = 'transform 0.3s ease-in-out';
        navbarHeight = header.offsetHeight;

        const resizeObserver = new ResizeObserver(entries => {
            for (let entry of entries) {
                navbarHeight = entry.target.offsetHeight;
            }
        });
        resizeObserver.observe(header);

        window.addEventListener('scroll', onScroll, { passive: true });
    }

    function onScroll() {
        if (!ticking) {
            window.requestAnimationFrame(() => {
                updateHeader();
                ticking = false;
            });
            ticking = true;
        }
    }

    function updateHeader() {
        const scrollTop = window.scrollY;
        
        if (scrollTop < 0) return;
        if (Math.abs(lastScrollTop - scrollTop) <= delta) return;

        if (scrollTop > lastScrollTop && scrollTop > navbarHeight) {
            // [向下捲動 -> 隱藏]
            header.style.transform = 'translateY(-100%)';
        } else {
            // [向上捲動 -> 顯示]
            header.style.transform = '';
        }

        lastScrollTop = scrollTop;
    }

    initialHidingHeader();
})();