[js] 快速改样式 ----// 利用 protyle.toolbar.setInlineMark 进行块更新后保存

//protyle.toolbar.setInlineMark (() => { // 创建按钮组 const buttonGroup = document.createElement('div'); buttonGroup.style.position = 'fixed'; buttonGroup.style.top = '600px'; buttonGroup.style.left = '1200px'; buttonGroup.style.display = 'flex'; buttonGroup.style.flexDirection = 'column'; buttonGroup.style.cursor = 'move'; buttonGroup.style.userSelect = 'none'; // 创建颜色按钮 function createButton(color) { const button = document.createElement('button'); button.textContent = color.name; button.style.backgroundColor = color.background; button.style.color = color.color; button.style.padding = '1px 2px'; button.style.border = 'none'; button.style.cursor = 'pointer'; button.style.marginBottom = '5px'; button.addEventListener('click', async () => { const protyle = getProtyle(); if (!protyle) { console.error("未找到 Protyle 实例"); return; } const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); if (range.startContainer.nodeType === Node.TEXT_NODE && range.startContainer.parentNode) { protyle.toolbar.setInlineMark(protyle, "bold", range); if (color.background) { protyle.toolbar.setInlineMark(protyle, "backgroundColor", range, { type: "backgroundColor", color: color.background }); } if (color.color) { protyle.toolbar.setInlineMark(protyle, "color", range, { type: "color", color: color.color }); } } else { console.error("选中的文本范围不包含有效的节点"); } } }); button.addEventListener('mouseover', () => { button.style.background = 'linear-gradient(to right, #ff7e5f, #feb47b)'; button.style.color = 'white'; }); button.addEventListener('mouseout', () => { button.style.background = color.background; button.style.color = color.color; }); return button; } // 创建清除样式按钮 function createClearButton() { const button = document.createElement('button'); button.textContent = '清除'; button.style.backgroundColor = '#CCCCCC'; button.style.color = '#000000'; button.style.padding = '1px 2px'; button.style.border = 'none'; button.style.cursor = 'pointer'; button.addEventListener('click', async () => { const protyle = getProtyle(); if (!protyle) { console.error("未找到 Protyle 实例"); return; } const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); if (range.startContainer.nodeType === Node.TEXT_NODE && range.startContainer.parentNode) { protyle.toolbar.setInlineMark(protyle, "clear", range); } else { console.error("选中的文本范围不包含有效的节点"); } } }); return button; } // 获取Protyle实例 function getProtyle() { try { if (document.getElementById("sidebar")) return siyuan.mobile.editor.protyle; const currDoc = siyuan?.layout?.centerLayout?.children.map(item => item.children.find(item => item.headElement?.classList.contains('item--focus') && (item.panelElement.closest('.layout__wnd--active') || item.panelElement.closest('[data-type="wnd"]')))).find(item => item); return currDoc?.model.editor.protyle; } catch (e) { console.error(e); return null; } } const colors = [ { name: '黄色', background: '#FFFF00', color: '#000000' }, { name: '蓝色', background: '#0000FF', color: '#FFFFFF' }, { name: '绿色', background: '#00FF00', color: '#000000' }, { name: '红色', background: '#FF0000', color: '#FFFFFF' } ]; const buttons = colors.map(createButton); const clearButton = createClearButton(); document.addEventListener('keydown', function (e) { if (e.ctrlKey) { const key = e.key.toLowerCase(); const index = ['e', 'r', 't', 'y'].indexOf(key); if (index !== -1) { buttons[index].click(); } if (key === 'c') { clearButton.click(); } } }); buttons.forEach(button => buttonGroup.appendChild(button)); buttonGroup.appendChild(clearButton); document.body.appendChild(buttonGroup); let startX; let startY; let isDragging = false; buttonGroup.addEventListener('mousedown', function (e) { isDragging = true; startX = e.clientX; startY = e.clientY; }); document.addEventListener('mousemove', function (e) { if (isDragging) { const dx = e.clientX - startX; const dy = e.clientY - startY; const rect = buttonGroup.getBoundingClientRect(); let newLeft = rect.left + dx; let newTop = rect.top + dy; const viewportWidth = window.innerWidth; const viewportHeight = window.innerHeight; const buttonGroupWidth = buttonGroup.offsetWidth; const buttonGroupHeight = buttonGroup.offsetHeight; newLeft = Math.max(0, Math.min(newLeft, viewportWidth - buttonGroupWidth)); newTop = Math.max(0, Math.min(newTop, viewportHeight - buttonGroupHeight)); buttonGroup.style.left = `${newLeft}px`; buttonGroup.style.top = `${newTop}px`; startX = e.clientX; startY = e.clientY; } }); document.addEventListener('mouseup', function () { isDragging = false; }); })();
  • 思源笔记

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

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

    25694 引用 • 106304 回帖
  • 代码片段

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

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

    173 引用 • 1202 回帖
1 操作
cxg318 在 2025-01-18 01:14:32 更新了该帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • Wetoria 2 评论 via macOS

    trollface 阁下可曾试过选中已经设置过样式的地方

    换个方式,不用 updateBlock ,样式设置过的地方没什么问题。就是浮窗中不起作用,不知道怎么弄。
    cxg318
    @cxg318 突然想到,要不要给叶归加上选择自定义颜色了
    Wetoria 1 赞同
  • 其他回帖
  • cxg318
    作者

    PixPin20250118003959.gif

推荐标签 标签

  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 6 关注
  • CodeMirror
    2 引用 • 17 回帖 • 164 关注
  • 思源笔记

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

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

    25694 引用 • 106304 回帖
  • GitBook

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

    3 引用 • 8 回帖
  • Git

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

    211 引用 • 358 回帖 • 1 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 400 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 449 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 2 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注
  • Outlook
    1 引用 • 5 回帖 • 5 关注
  • 代码片段

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

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

    173 引用 • 1202 回帖
  • 996
    13 引用 • 200 回帖 • 6 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    177 引用 • 315 回帖
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 1 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 634 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 347 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 3 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 465 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖 • 8 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 702 关注
  • BAE

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

    19 引用 • 75 回帖 • 674 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖 • 1 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    229 引用 • 1432 回帖 • 1 关注