[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] 用于区分代码片段类型。

    147 引用 • 973 回帖
  • 思源笔记

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

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

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

相关帖子

欢迎来到这里!

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

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

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

    行高亮

    1 回复
  • xqh042

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

    PixPin20241205205219.png

    PixPin20241205210055.png

  • xqh042

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

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

  • xqh042

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

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

推荐标签 标签

  • Notion

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

    10 引用 • 77 回帖 • 1 关注
  • 黑曜石

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

    A second brain, for you, forever.

    22 引用 • 214 回帖 • 1 关注
  • Google

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

    49 引用 • 192 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    411 引用 • 3588 回帖
  • OpenCV
    15 引用 • 36 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 548 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 3 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 88 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖 • 1 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 5 关注
  • RemNote
    2 引用 • 16 回帖 • 7 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 612 关注
  • 数据库

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

    345 引用 • 742 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 3 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 668 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 3 关注
  • V2Ray
    1 引用 • 15 回帖
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 164 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 668 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 724 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 597 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    173 引用 • 3849 回帖
  • 996
    13 引用 • 200 回帖 • 3 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖