🚀前端轻松实现网页内容转换:一键复制、保存图片及生成 Markdown

简介: 在现代前端开发中,提升用户的交互体验至关重要。本文将详细介绍如何使用 HTML2Canvas 和 Turndown 两个强大的 JavaScript 库,实现将网页选中文本转化为图片并保存或复制到剪贴板,或将内容转换为 Markdown 格式。文章包含核心代码实现、技术细节和功能拓展方向,为开发者提供了一个轻量级的解决方案,提升用户体验。

引言

在现代前端开发中,用户交互体验的提升一直是开发者关注的重点。想象一下,当用户在网页上选中文本时,不仅可以复制,还能直接保存为图片,或者一键生成 Markdown 格式的文本。这一切都可以通过 HTML2CanvasTurndown 两个强大的 JavaScript 库轻松实现。本篇博客将向你展示如何在前端实现这些功能,提升用户的互动体验。

功能点

  • 复制为图片

    复制为图片后

    用户可以通过选择网页上的文本内容,然后点击弹出的选项,将其转换为图片并复制到剪贴板。这项功能使用了HTML2Canvas库来实现,它可以将网页元素渲染为Canvas对象,并进一步转换为图片。

  • 保存为图片

    保存为图片

    除了复制,用户还可以将生成的图片保存到本地。通过HTML2CanvastoDataURL方法,我们可以生成一个Base64格式的图片,并使用浏览器的下载功能将其保存。

  • 复制为Markdown

    复制为Markdown后

    对于需要纯文本的用户来说,将网页内容转换为Markdown格式非常实用。我们使用Turndown库来实现这一功能,它能够将HTML格式的内容快速转换为Markdown文本,并直接复制到剪贴板。

使用技术

html2canvas

html2canvas 是一个强大的工具,可以将网页元素渲染为图片。通过它,我们可以轻松地将选中的网页内容转换为 PNG 图片,并保存或复制到剪贴板。

配置项
属性名 默认值 描述
useCORS false 是否尝试使用 CORS 从服务器加载图片
allowTaint false 是否允许不同源的图片污染画布
scale window.devicePixelRatio 用于渲染的比例,默认为浏览器设备像素比率

Turndown

Turndown 是一个用于将 HTML 转换为 MarkdownJavaScript 库。它通常用于将富文本内容从网页或其他 HTML 格式转换为纯文本 Markdown 格式,以便在不同平台上显示或存储。

Window.getComputedStyle()

Window.getComputedStyle()方法返回一个对象,该对象在应用活动样式表并解析这些值可能包含的任何基本计算后报告元素的所有 CSS 属性的值。私有的 CSS 属性值可以通过对象提供的 API 或通过简单地使用 CSS 属性名称进行索引来访问。

Window.getSelection

返回一个 Selection 对象,表示用户选择的文本范围或光标的当前位置。

Selection

Selection 对象表示用户选择的文本范围或插入符号的当前位置。它代表页面中的文本选区,可能横跨多个元素。文本选区由用户拖拽鼠标经过文字而产生。

Selection 对象所对应的是用户所选择的 ranges(区域),俗称拖蓝。默认情况下,该函数只针对一个区域。

“拖蓝”是中文网络用语,指用户用鼠标选择文本时,文本背景变成蓝色的现象。大多数操作系统和浏览器在用户选择文本时,会将选中的文本背景变为蓝色,以表示该区域被选中。这个过程被称为“拖蓝”或“拖选”,通常用来描述用户通过鼠标选择文本的行为,例如在网页上选择文字后进行复制或高亮操作。

属性
  • isCollapsed

    返回一个布尔值,用于判断选区的起始点和终点是否在同一个位置。

  • rangeCount

    返回该选区所包含的连续范围的数量。

方法
  • getRangeAt

    返回一个包含当前选区内容的区域对象。

    在代码中,const range = selection.getRangeAt(0) 中的 0 是用来获取当前用户选择的文本范围 (range) 列表中的第一个范围对象。通常情况下,当用户在网页上选择文本时,只会创建一个 Range 对象。因此,使用 getRangeAt(0) 来获取这个范围对象是最常见和安全的做法。

    在绝大多数的浏览器中,用户只能一次选择一个连续的文本范围(即一个 Range 对象)。因此,getRangeAt(0) 可以确保我们获取到当前的选区。如果用户有多个选区,getRangeAt(0) 仅获取第一个。

    通常情况下,不会使用 addRange 添加多个 Range 对象到选区,除非你正在编写一个允许非连续选择的自定义逻辑。

Range

Range 接口表示一个包含节点与文本节点的一部分的文档片段。

方法
  • getBoundingClientRect

    返回一个 DOMRect 对象,其绑定了 Range 的整个内容。

  • cloneContents

    返回一个复制 Range 中所有节点的文档片段

核心实现

在实现过程中,首先需要监听用户的文本选择操作。当用户完成选择时,展示一个操作按钮,提供“复制为图片”、“保存为图片”以及“复制为 Markdown”的选项。以下是核心代码段:

// 方法:将选中内容渲染为图片并复制到剪贴板
const copyAsImage = async () => {
   
  if (hiddenContent.value) {
   
    hiddenContent.value.style.display = 'block'; // 显示隐藏内容
    try {
   
      const canvas = await HTML2CanvasService(hiddenContent.value, {
    useCORS: true });
      const blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
      if (blob) {
   
        navigator.clipboard.write([new ClipboardItem({
    'image/png': blob })]);
        ElMessage.success('图片已复制到剪贴板');
      }
    } catch (error) {
   
      ElMessage.error('转换为图片时出错');
    } finally {
   
      hiddenContent.value.style.display = 'none'; // 重新隐藏内容
    }
  }
};

这一段代码展示了如何使用 HTML2Canvas 将选中的网页内容渲染为图片并复制到剪贴板。用户可以轻松地将网页上的任意选中内容保存为图片并分享。

保存图片到本地

通过稍微调整,我们还可以将选中的内容保存为本地 PNG 文件。这对于需要将内容进行本地存档的用户来说非常有用。

// 方法:将选中内容保存为图片
const saveAsImage = async () => {
   
  if (hiddenContent.value) {
   
    hiddenContent.value.style.display = 'block';
    try {
   
      const canvas = await HTML2CanvasService(hiddenContent.value, {
    useCORS: true });
      const image = canvas.toDataURL('image/png');
      const link = document.createElement('a');
      link.href = image;
      link.download = `screenshot_${
     Date.now()}.png`;
      link.click();
      ElMessage.success('图片已保存');
    } catch (error) {
   
      ElMessage.error('保存图片时出错');
    } finally {
   
      hiddenContent.value.style.display = 'none';
    }
  }
};

在这段代码中,我们使用了 canvas.toDataURL 方法将 Canvas 对象转换为 Base64 编码的图片数据,然后通过动态创建一个 <a> 标签实现文件下载。

Markdown 转换

我们可以通过以下代码实现选中文本的 Markdown 转换,并复制到剪贴板:

// 方法:将选中内容转换为 Markdown
const copyAsMarkdown = () => {
   
  if (hiddenContent.value) {
   
    const turnDownService = new TurnDownService();
    const markdownContent = turnDownService.turndown(hiddenContent.value.innerHTML);
    navigator.clipboard.writeText(markdownContent).then(() => {
   
      ElMessage.success('Markdown 已复制到剪贴板');
    });
  }
};

这段代码展示了如何使用 Turndown 将 HTML 内容转换为 Markdown 格式,并通过 navigator.clipboard.writeText 将结果复制到剪贴板中,用户可以方便地将其粘贴到任何 Markdown 编辑器中。

项目后续迭代

为了提升该工具的实用性,我计划进行以下几个方面的迭代:

  • Tampermonkey[油猴]插件: 正在开发中,目标是将该功能集成到Tampermonkey脚本中,方便用户在各种网页中使用。
  • 谷歌浏览器插件: 也在进行中,最终希望通过浏览器扩展的形式,让用户能更轻松地访问和使用该工具。

总结

通过这篇博客,我们了解了如何使用HTML2CanvasTurndown实现将网页内容转换为图片和Markdown格式的功能。该工具不仅提升了用户体验,也为开发者提供了一个轻量级的解决方案。如果你对这类功能有需求,欢迎尝试并进一步改进。


希望这个博客内容能够满足你的需求!

完整代码:arrow_right:GitHub

目录
相关文章
|
6天前
|
JavaScript 前端开发 Python
django接收前端vue传输的formData图片数据
django接收前端vue传输的formData图片数据
14 4
|
4天前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
10 1
|
8天前
|
前端开发 JavaScript 编译器
不走弯路,纯前端如何把图片导出成视频!
【10月更文挑战第3天】不走弯路,纯前端如何把图片导出成视频!
26 3
|
9天前
|
JavaScript 前端开发 编译器
吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
【10月更文挑战第2天】吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
25 2
|
11天前
|
移动开发 前端开发 JavaScript
前端开发:从零到一构建响应式网页
【10月更文挑战第1天】前端开发:从零到一构建响应式网页
25 2
|
10天前
|
Web App开发 缓存 前端开发
前端RAG:使用Transformers.js手搓纯网页版RAG(二)- 基于qwen1.5-0.5B
本文继续探讨了RAG的后半部分,通过在浏览器中运行qwen1.5-0.5B模型实现了增强搜索全流程。然而,由于浏览器与模型性能限制,该方案更适合研究、离线及高隐私场景。文章提供了完整的前端代码,让读者能够动手尝试。此外,详细介绍了代码框架、知识库准备、模型初始化及问答实现等步骤,并展示了实际运行效果。受限于当前技术,除非在离线或高隐私环境下,网页大模型的应用仍需进一步优化。
23 0
|
10天前
|
存储 自然语言处理 文字识别
纯前端RAG:使用Transformers.js实现纯网页版RAG(一)
本文将分两部分教大家如何在网页中实现一个RAG系统,本文聚焦于深度搜索功能。通过浏览器端本地执行模型,可实现文本相似度计算和问答匹配,无需依赖服务器。RAG搜索基于高维向量空间,即使不完全匹配也能找到意义相近的结果。文中详细介绍了如何构建知识库、初始化配置、向量存储及相似度计算,并展示了实际应用效果。适用于列表搜索、功能导航、文档查询及表单填写等多种场景。
28 0
|
25天前
|
缓存 边缘计算 前端开发
关于前端性能优化问题,认识网页加载过程和防抖节流
该文章详细探讨了前端性能优化的方法,包括理解网页加载过程、实施防抖和节流技术来提升用户体验和性能。
|
6天前
|
Ubuntu Linux 测试技术
Linux系统之部署轻量级Markdown文本编辑器
【10月更文挑战第6天】Linux系统之部署轻量级Markdown文本编辑器
30 0
Linux系统之部署轻量级Markdown文本编辑器
|
2月前
|
存储 安全 数据安全/隐私保护
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
98 0