Notion TOC Floating

mark your toc floating! 默认取第一个table of contents,请知晓。

目前為 2021-05-25 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Notion TOC Floating
// @namespace    https://github.com/gefangshuai/tampermokey-scripts
// @version      0.1.1
// @description  mark your toc floating! 默认取第一个table of contents,请知晓。
// @author       Timothy.Ge
// @include      *://*.notion.so/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @note         21-05-25 0.1.1 解决了更换文章失效的问题
// @note         21-05-25 0.1.0 第一个测试版本
// ==/UserScript==

(function() {
    (function(history) {
        'use strict';
        // Your code here...
        var doSomething = function() {
            var scroller = document.querySelector('div.notion-frame .notion-scroller');
            var scrollWatchFun = function(e) {
                var tableContents = document.querySelector('.notion-table_of_contents-block');
                if (tableContents) {
                    var rect = tableContents.getBoundingClientRect();
                    var dom = tableContents.firstChild;
                    if (dom) {
                        if (rect.top <= 60) {
                            dom.style.position = 'fixed';
                            dom.style.top = '60px';
                        } else {
                            dom.style.position = null;
                            dom.style.top = null;
                        }
                    }
                }
            };
            if (scroller) {
                scroller.removeEventListener('scroll', scrollWatchFun);
                scroller.addEventListener('scroll', scrollWatchFun);
            }
        };
        doSomething();
        var pushState = history.pushState;
        history.pushState = function(state) {
            if (typeof history.onpushstate == 'function') {
                history.onpushstate({ state: state });
            }
            setTimeout(function() {
                doSomething();
            }, 1000);
            // ... whatever else you want to do
            // maybe call onhashchange e.handler
            return pushState.apply(history, arguments);
        };
    })(window.history);
})();