[js] 希望可以图片左上方有一个复制按钮

思源的复制图片上是复制相对路径的,老是要右键进行复制,所以希望可以在图片上方悬浮一个复制为 png 的按钮,鼠标移动到那里才显示

image.png

希望社区大佬可以帮忙下写一段 js 代码

  • 思源笔记

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

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

    25972 引用 • 107700 回帖
  • 代码片段

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

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

    179 引用 • 1272 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9969 引用 • 45295 回帖 • 76 关注

相关帖子

被采纳的回答
  • wilsons 2 1 赞同

    image.png

    // 图片复制到png按钮放到外层右上角 (()=>{ let isOn = false; document.addEventListener('mouseover', (e)=>{ const img = e.target.closest('[data-type="img"]'); if(!img) return; if(isOn) return; isOn = true; setTimeout(()=>isOn=false, 100); if(img.querySelector('.cst-copy-png')) return; const action = img.querySelector('.protyle-action'); if(!action) return; const actionIcon = img.querySelector('.protyle-action .protyle-icon'); if(actionIcon) { actionIcon.style.borderTopLeftRadius = '0'; actionIcon.style.borderBottomLeftRadius = '0'; } const copyPngHtml = `<span class="protyle-icon protyle-icon--only protyle-custom cst-copy-png" style="border-top-right-radius:0;border-bottom-right-radius:0"><svg class="svg"><use xlink:href="#iconImage"></use></svg></span>`; action.insertAdjacentHTML('afterbegin', copyPngHtml); const copyPngBtn = img.querySelector('.cst-copy-png'); copyPngBtn.addEventListener('click', (e) => { e.stopPropagation(); copyPNGByLink(img.querySelector('img')?.getAttribute("src")||''); }); }); // see https://github.com/siyuan-note/siyuan/blob/e47b8efc2f2611163beca9fad4ee5424001515ff/app/src/menus/util.ts#L175 function copyPNGByLink(link) { if(!link) return; if (isInAndroid()) { window.JSAndroid.writeImageClipboard(link); return; } else { const canvas = document.createElement("canvas"); const tempElement = document.createElement("img"); tempElement.onload = (e) => { canvas.width = e.target.width; canvas.height = e.target.height; canvas.getContext("2d").drawImage(e.target, 0, 0, e.target.width, e.target.height); canvas.toBlob((blob) => { navigator.clipboard.write([ new ClipboardItem({ // @ts-ignore ["image/png"]: blob }) ]); }, "image/png", 1); }; tempElement.src = link; } } function isInAndroid() { return window.siyuan.config.system.container === "android" && window.JSAndroid; } })();

    代码备份地址 https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E5%9B%BE%E7%89%87%E5%A4%8D%E5%88%B6%E5%88%B0png%E6%8C%89%E9%92%AE%E6%94%BE%E5%88%B0%E5%A4%96%E5%B1%82%E5%8F%B3%E4%B8%8A%E8%A7%92.js

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • lichlaughing via macOS

    顺便,能否源文件是什么格式,就复制成什么格式 😄

  • wilsons 1 赞同

    @CongSec

    这个不建议放左侧,因为如果是在线图片,本来就有个图标,在加上我之前的图片链接 [js] 给图片添加超链接 也有个图标

    这里在再加,有点多了,建议放右上角

    image.png

    @lichlaughing 如果本地图片可与实现复制不同格式,如果在线图片可能存在跨域问题,复制不了。官方用 canvas 实现的,但 canvas 支持支持的图片格式有限。

    1 回复
  • wilsons 2 1 赞同 2 评论

    image.png

    // 图片复制到png按钮放到外层右上角 (()=>{ let isOn = false; document.addEventListener('mouseover', (e)=>{ const img = e.target.closest('[data-type="img"]'); if(!img) return; if(isOn) return; isOn = true; setTimeout(()=>isOn=false, 100); if(img.querySelector('.cst-copy-png')) return; const action = img.querySelector('.protyle-action'); if(!action) return; const actionIcon = img.querySelector('.protyle-action .protyle-icon'); if(actionIcon) { actionIcon.style.borderTopLeftRadius = '0'; actionIcon.style.borderBottomLeftRadius = '0'; } const copyPngHtml = `<span class="protyle-icon protyle-icon--only protyle-custom cst-copy-png" style="border-top-right-radius:0;border-bottom-right-radius:0"><svg class="svg"><use xlink:href="#iconImage"></use></svg></span>`; action.insertAdjacentHTML('afterbegin', copyPngHtml); const copyPngBtn = img.querySelector('.cst-copy-png'); copyPngBtn.addEventListener('click', (e) => { e.stopPropagation(); copyPNGByLink(img.querySelector('img')?.getAttribute("src")||''); }); }); // see https://github.com/siyuan-note/siyuan/blob/e47b8efc2f2611163beca9fad4ee5424001515ff/app/src/menus/util.ts#L175 function copyPNGByLink(link) { if(!link) return; if (isInAndroid()) { window.JSAndroid.writeImageClipboard(link); return; } else { const canvas = document.createElement("canvas"); const tempElement = document.createElement("img"); tempElement.onload = (e) => { canvas.width = e.target.width; canvas.height = e.target.height; canvas.getContext("2d").drawImage(e.target, 0, 0, e.target.width, e.target.height); canvas.toBlob((blob) => { navigator.clipboard.write([ new ClipboardItem({ // @ts-ignore ["image/png"]: blob }) ]); }, "image/png", 1); }; tempElement.src = link; } } function isInAndroid() { return window.siyuan.config.system.container === "android" && window.JSAndroid; } })();

    代码备份地址 https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E5%9B%BE%E7%89%87%E5%A4%8D%E5%88%B6%E5%88%B0png%E6%8C%89%E9%92%AE%E6%94%BE%E5%88%B0%E5%A4%96%E5%B1%82%E5%8F%B3%E4%B8%8A%E8%A7%92.js

    1 回复
    2 操作
    wilsons 在 2025-05-13 07:57:56 更新了该回帖
    wilsons 在 2025-05-12 18:47:39 更新了该回帖
    我有个跟这个类似的求助
    8V9q7V
    @CongSec 更新下修复手机版 bug
    wilsons
  • lichlaughing

    能实现本地图片的就可以了哈哈哈 😄

  • 谢谢大佬的 js 代码,很有用

CongSec
新手可以看我发的求助帖以及汇总帖子,很有帮助的!_! 网安笔记分享:http://congsec.xyz 北京

推荐标签 标签

  • 旅游

    希望你我能在旅途中找到人生的下一站。

    98 引用 • 903 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖 • 1 关注
  • Anytype
    3 引用 • 31 回帖 • 24 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 488 关注
  • ZooKeeper

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

    59 引用 • 29 回帖 • 7 关注
  • Hibernate

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

    39 引用 • 103 回帖 • 729 关注
  • 七牛云

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

    29 引用 • 230 回帖 • 127 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 118 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 3 关注
  • 招聘

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

    188 引用 • 1057 回帖
  • CAP

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

    12 引用 • 5 回帖 • 636 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 105 关注
  • WebSocket

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

    48 引用 • 206 回帖 • 287 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 568 关注
  • TGIF

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

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

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

    49 引用 • 60 回帖 • 349 关注
  • SQLite

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

    4 引用 • 7 回帖 • 6 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • Notion

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

    10 引用 • 77 回帖
  • LeetCode

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

    209 引用 • 72 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    496 引用 • 934 回帖 • 1 关注