[js] 聚焦当前编辑元素块 - 禅模式

最近老是注意力不太集中,于是尝试写点脚本简化页面元素

当前隐藏了页面大部分元素后,整个页面就只剩编辑内容了,配合 Aris 主题,可以做到整个窗口只有一个块。

PixPin20241205202117.png

PixPin20241205202125.png

一些功能全用快捷键代替,或者设置透明度,通过鼠标移动到相应位置上显示。

PixPin20241205202140.png

不过这些小 css 片段不是重点,主要是用 gpt 写了个聚焦当前编辑块的 js

效果如下

PixPin20241205201840.gif


!(function () {
    // 初始化样式
    const style = document.createElement("style");
    style.textContent = `
        /* 默认所有 data-node-id 块低透明度 */
        div[data-node-id] {
            opacity: 0.82;
            transition: opacity 0.2s;
        }
        /* 高亮块样式 */
        .highlighted-block {
            opacity: 1 !important;
        }
    `;
    document.head.appendChild(style);

    // 当前聚焦的块
    let focusedBlock = null;

    // 设置高亮状态(包括父块)
    function highlightBlock(block) {
        if (!block || block === focusedBlock) return;

        // 如果已有聚焦块,移除其高亮
        if (focusedBlock) {
            let parent = focusedBlock;
            while (parent) {
                parent.classList.remove("highlighted-block");
                parent = parent.parentElement;
            }
        }

        // 设置新的高亮块
        focusedBlock = block;
        let parent = block;
        while (parent) {
            parent.classList.add("highlighted-block");
            parent = parent.parentElement;
        }
    }

    // 获取光标所在的块
    function getCursorBlock() {
        const selection = document.getSelection();
        if (!selection.rangeCount) return null;

        const range = selection.getRangeAt(0);
        return range.startContainer.closest?.("div[data-node-id]") || null;
    }

    // 获取上下键切换的块
    function getBlockByKey(direction) {
        if (!focusedBlock) return null;

        const allBlocks = Array.from(document.querySelectorAll('div[data-node-id]'));
        const currentIndex = allBlocks.indexOf(focusedBlock);

        if (currentIndex === -1) return null;

        if (direction === "up" && currentIndex > 0) {
            return allBlocks[currentIndex - 1];
        } else if (direction === "down" && currentIndex < allBlocks.length - 1) {
            return allBlocks[currentIndex + 1];
        }

        return null;
    }

    // 监听键盘上下键事件
    document.addEventListener("keydown", (event) => {
        if (event.key === "ArrowUp" || event.key === "ArrowDown") {
            const direction = event.key === "ArrowUp" ? "up" : "down";
            const nextBlock = getBlockByKey(direction);
            if (nextBlock) {
                highlightBlock(nextBlock);
            }
        }
    });

    // 初次加载时高亮可视范围内位于中心的块
    document.addEventListener("DOMContentLoaded", () => {
        const wnd = document.querySelector('div[data-type="wnd"]');
        if (wnd) {
            const firstBlock = wnd.querySelector('div[data-node-id]');
            if (firstBlock) {
                highlightBlock(firstBlock);
            }
        }
    });

    // 监听光标切换事件
    document.addEventListener("selectionchange", () => {
        const block = getCursorBlock();
        if (block) {
            highlightBlock(block);
        }
    });

    // 监听点击事件,切换聚焦
    document.addEventListener("click", (event) => {
        const target = event.target.closest("div[data-node-id]");
        if (target) {
            highlightBlock(target);
        }
    });
})();

  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    79 引用 • 438 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22775 引用 • 91434 回帖 • 3 关注
1 操作
xqh042 在 2024-12-05 21:11:35 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 很棒!另外提一嘴,楼主试过思源自带的禅模式不。alt + Y (和楼主的禅模式不太一样的哈)

    1 回复
  • 感谢分享,感觉虚化文字部分有点费眼,这个行高亮的代码片段也可以用。

    行高亮

    1 回复
  • xqh042

    欸,才发现有这么一个功能。刚才搜了以下发现本体里似乎叫作全屏切换,感觉这个功能名字似乎不够直观(容易和 f11 全屏理解冲突?),新开了个工作空间尝试了一下,发现效果不错 👍 如果早知道有这个功能应该会考虑将当前的简化样式的一部分移到这一块,谢谢分享 😄

    PixPin20241205205219.png

    PixPin20241205210055.png

  • xqh042

    感谢分享,这个行高亮的效果我一开始写的效果差不多 😄 但因为觉得鼠标移动会出现频繁的切换高亮块的情况,进,加上我更许要的是静态和编辑状态下的高亮,所以就修改成了现在的效果。

    费眼的情况可以尝试调整一下透明度临时处理(

  • xqh042

    当前有个问题,判断指针所在的块其实不太准,这块 ai 补全的代码没细看出漏子了。

    考虑了一下,先直接配合插件市场里的打字机插件使用吧(当前似乎从段落块外切换到列表内的折叠块都有聚焦到未显示的折叠块上的问题),后面再看看有没有动力(需求)改吧 😂

推荐标签 标签

  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 3 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 512 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 5 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 624 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 221 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 381 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 29 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    27 引用 • 225 回帖 • 170 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 3 关注
  • 电影

    这是一个不能说的秘密。

    121 引用 • 604 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    16 引用 • 125 回帖 • 1 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 9 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    343 引用 • 720 回帖 • 1 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    6 引用 • 38 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    288 引用 • 734 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    408 引用 • 1246 回帖 • 586 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 138 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 743 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 18 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 336 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 532 关注
  • 996
    13 引用 • 200 回帖 • 10 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 107 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    197 引用 • 550 回帖