[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; }); })();
  • 思源笔记

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

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

    25934 引用 • 107490 回帖
  • 代码片段

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

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

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

相关帖子

欢迎来到这里!

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

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

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

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

    PixPin20250118003959.gif

推荐标签 标签

  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    228 引用 • 476 回帖 • 1 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 27 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 4 关注
  • abitmean

    有点意思就行了

    32 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 396 关注
  • RabbitMQ

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

    49 引用 • 60 回帖 • 348 关注
  • B3log

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

    1063 引用 • 3455 回帖 • 152 关注
  • SQLServer

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

    21 引用 • 31 回帖
  • HBase

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

    17 引用 • 6 回帖 • 65 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 187 关注
  • CongSec

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

    1 引用 • 1 回帖 • 37 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 36 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 11 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 762 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    291 引用 • 4495 回帖 • 661 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 37 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 58 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • NetBeans

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

    78 引用 • 102 回帖 • 708 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 370 关注
  • Dubbo

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

    60 引用 • 82 回帖 • 614 关注
  • Log4j

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

    20 引用 • 18 回帖 • 34 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 818 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 502 关注