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

    173 引用 • 1202 回帖
  • 思源笔记

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

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

    25711 引用 • 106357 回帖
1 操作
xqh042 在 2024-12-05 21:11:35 更新了该帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • xqh042

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

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

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

    行高亮

    1 回复
  • 很棒!另外提一嘴,楼主试过思源自带的禅模式不。alt + Y (和楼主的禅模式不太一样的哈)

    1 回复
  • xqh042

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

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

  • 查看全部回帖

推荐标签 标签

  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 447 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 3 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 3 关注
  • Hibernate

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

    39 引用 • 103 回帖 • 726 关注
  • Dubbo

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

    60 引用 • 82 回帖 • 614 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 89 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 27 回帖 • 2 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    134 引用 • 1127 回帖 • 108 关注
  • 安全

    安全永远都不是一个小问题。

    203 引用 • 818 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖 • 1 关注
  • Anytype
    3 引用 • 31 回帖 • 23 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    171 引用 • 1535 回帖
  • 反馈

    Communication channel for makers and users.

    121 引用 • 907 回帖 • 277 关注
  • OnlyOffice
    4 引用 • 25 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖 • 2 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 635 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖 • 1 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 1 关注
  • 自由行
    1 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 290 关注
  • RemNote
    2 引用 • 16 回帖 • 14 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 62 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 155 关注
  • 印象笔记
    3 引用 • 16 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 86 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 638 关注