🚀前端轻松实现网页内容转换:一键复制、保存图片及生成 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

目录
相关文章
|
19天前
|
前端开发 JavaScript API
(前端3D模型开发)网页三维CAD中加载和保存STEP模型
本文介绍了如何使用`mxcad3d`库在网页上实现STEP格式三维模型的导入与导出。首先,通过官方教程搭建基本项目环境,了解核心对象如MxCAD3DObject、Mx3dDbDocument等的使用方法。接着,编写了加载和保存STEP模型的具体代码,包括HTML界面设计和TypeScript逻辑实现。最后,通过运行项目验证功能,展示了从模型加载到保存的全过程。此外,`mxcad3d`还支持多种其他格式的三维模型文件操作。
|
1月前
|
缓存 前端开发 JavaScript
前端开发的必修课:如何让你的网页在弱网环境下依然流畅运行?
【10月更文挑战第30天】随着移动互联网的普及,弱网环境下的网页性能优化变得尤为重要。本文详细介绍了如何通过了解网络状况、优化资源加载、减少HTTP请求、调整弱网参数和代码优化等方法,提升网页在弱网环境下的加载速度和流畅性,从而改善用户体验。
139 4
|
1月前
|
XML 前端开发 JavaScript
前端大神揭秘:如何让你的网页秒变炫酷,让用户欲罢不能的5大绝招!
前端开发不仅是技术活,更是艺术创作。本文揭秘五大前端开发技巧,包括合理运用CSS动画、SVG图形、现代JavaScript框架、优化网页性能及注重细节设计,助你打造炫酷网页,提升用户体验。
81 30
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
50 5
|
1月前
|
存储 编解码 前端开发
惊!前端新手也能秒懂的高级技巧,轻松提升网页颜值与性能!
本文针对前端新手,介绍了三个简单易学的高级技巧,帮助提升网页的颜值和性能。包括使用CSS框架快速美化网页、优化图片资源加快加载速度,以及利用ARIA属性和媒体查询提高网页的可访问性和响应性。示例代码清晰,适合初学者上手实践。
41 3
|
1月前
|
存储 前端开发 搜索推荐
(前端直接编辑CAD)网页CAD二次开发中线型表的使用方法
在DWG数据库中,线型样式存储在线型样式表 `McDbLinetypeTable` 中,每个线型表记录对象 `McDbLinetypeTableRecord` 对应一种线型样式。本文介绍了如何获取、添加、遍历、删除和修改线型样式,并提供了绘制不同线型的示例代码,包括虚线、点划线和带文字的线型。通过在线示例demo,用户可以实践修改CAD图纸中的实体线型及其样式。
|
1月前
|
搜索推荐 前端开发 开发者
前端开发的必修课:如何让你的网页在搜索引擎中脱颖而出?
【10月更文挑战第31天】前端开发不仅是构建网页与用户间桥梁的关键,还需注重搜索引擎优化(SEO)。优化网页结构、合理使用关键词、提升加载速度及整合社交媒体等技巧,能帮助网页在搜索引擎中脱颖而出,吸引更多用户。
39 5
|
1月前
|
机器学习/深度学习 前端开发 JavaScript
前端小白也能学会的高大上技巧:如何让你的网页支持语音控制?
【10月更文挑战第31天】你是否曾梦想过只需动动嘴皮子就能操控网页?现在,这个梦想触手可及。即使你是前端小白,也能轻松学会让网页支持语音控制的高大上技巧。本文将介绍语音控制的基本概念、实现方法和具体示例,带你走进语音控制的奇妙世界。通过Web Speech API,你只需掌握基本的HTML、CSS和JavaScript知识,就能实现语音识别和控制功能。快来尝试吧!
201 4
|
1月前
|
前端开发 JavaScript 搜索推荐
前端小白也能学会的高大上技巧:如何让你的网页支持暗黑模式?
【10月更文挑战第30天】随着现代网页设计的发展,暗黑模式已成为一种流行趋势,提升了用户的阅读体验并增强了网页的适应性。本文介绍了如何通过简单的HTML、CSS和JavaScript实现网页的暗黑模式。首先,定义两种主题的CSS样式;然后,使用JavaScript实现模式切换逻辑,并自动检测系统主题。通过这些步骤,前端小白也能轻松掌握暗黑模式的实现,提升网页的用户体验和个性化水平。
89 4
|
1月前
|
前端开发 JavaScript 数据处理
前端界的宝藏技术:掌握这些,让你的网页秒变交互神器!
【10月更文挑战第31天】前端开发藏有众多宝藏技术,如JavaScript异步编程和Web Components。异步编程通过Promise、async/await实现复杂的网络请求,提高代码可读性;Web Components则允许创建可重用、封装良好的自定义组件,提升代码复用性和独立性。此外,CSS动画、SVG绘图等技术也极大丰富了网页的视觉和交互体验。不断学习和实践,让网页秒变交互神器。
32 2