当前位置: 首页 > article >正文

Vue3集成quill-blot-formatter:为富文本编辑器赋能图片自由缩放

1. 为什么你的富文本编辑器需要图片缩放功能最近在做一个内容管理系统的项目时遇到了一个很头疼的问题用户上传的图片总是撑破编辑器容器导致整个页面排版乱七八糟。更糟的是用户无法调整图片大小只能被迫接受这种糟糕的体验。这让我意识到一个成熟的富文本编辑器图片缩放功能不是锦上添花而是刚需。想象一下这样的场景你在写一篇技术博客插入了一张代码截图。截图太大会影响阅读体验太小又看不清代码细节。这时候如果能像在Word里那样简单地拖动图片角落就能调整大小那该多方便这就是quill-blot-formatter要解决的问题。在Vue3生态中Quill是最受欢迎的富文本编辑器之一但它原生并不支持图片缩放。quill-blot-formatter这个插件就是专门为解决这个问题而生的。它能让你的Quill编辑器拥有类似Word的图片操作体验自由缩放、拖拽调整位置甚至还能旋转图片。2. 5分钟快速集成quill-blot-formatter2.1 安装依赖的正确姿势首先我们需要安装必要的依赖。这里有两个选择npm或者yarn。我个人更推荐yarn因为它的依赖解析速度更快特别是在大型项目中。# 使用npm安装 npm install quill-blot-formatter vueup/vue-quill # 或者使用yarn yarn add quill-blot-formatter vueup/vue-quill安装时有个小坑要注意确保你的项目已经安装了Vue3。我在第一次尝试时因为项目还在用Vue2结果各种报错。如果你是从零开始建议先用Vite创建一个新的Vue3项目npm create vitelatest my-quill-project --template vue2.2 基础配置与模块注册安装完成后我们需要在组件中引入并注册模块。这里有个关键点quill-blot-formatter需要先注册到Quill实例中才能使用。import { QuillEditor, Quill } from vueup/vue-quill import BlotFormatter from quill-blot-formatter import vueup/vue-quill/dist/vue-quill.snow.css // 关键步骤注册blotFormatter模块 Quill.register(modules/blotFormatter, BlotFormatter)注册模块这一步很容易被忽略。我刚开始就忘了注册结果配置了半天发现功能就是不生效排查了好久才发现问题。记住任何Quill插件在使用前都需要先注册3. 完整配置与实战演示3.1 编辑器组件模板现在我们来编写编辑器组件的模板部分。这里使用Vue3的Composition API写法template div classeditor-container QuillEditor refeditorRef contentTypehtml v-model:contentcontent :optionsoptions stylemin-height: 500px; width: 100% / /div /template几个关键属性说明refeditorRef方便我们在脚本中访问编辑器实例contentTypehtml指定内容格式为HTMLv-model:contentcontent双向绑定编辑器内容:optionsoptions传入编辑器配置3.2 编辑器配置详解接下来是核心的配置部分。我们使用Vue3的ref来定义响应式配置对象const options ref({ theme: snow, // 使用snow主题这是Quill最流行的主题 bounds: document.body, // 限制拖拽边界为body debug: warn, // 只显示警告及以上级别的日志 modules: { // 工具栏配置 toolbar: [ [bold, italic, underline, strike], // 文字样式 [blockquote, code-block], // 引用和代码块 [{ list: ordered }, { list: bullet }], // 列表 [{ indent: -1 }, { indent: 1 }], // 缩进 [{ size: [small, false, large, huge] }], // 字体大小 [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题 [{ color: [] }, { background: [] }], // 颜色 [{ align: [] }], // 对齐 [clean], // 清除格式 [link, image, video], // 媒体 ], // 图片缩放配置 blotFormatter: { // 这里可以添加具体配置 } }, placeholder: 请输入内容..., // 占位文本 readOnly: false // 非只读模式 })这个配置包含了Quill编辑器的常用工具栏按钮以及我们重点关注的blotFormatter配置。默认情况下blotFormatter不需要额外配置就能工作但如果你想自定义行为可以在这里添加参数。4. 高级技巧与常见问题解决4.1 自定义图片缩放行为quill-blot-formatter提供了一些配置选项来自定义图片缩放行为。比如你可能想限制图片的最大缩放比例blotFormatter: { img: { maxWidth: 800, // 最大宽度 maxHeight: 600, // 最大高度 minWidth: 100, // 最小宽度 minHeight: 100 // 最小高度 } }在实际项目中我建议设置合理的最大尺寸限制防止用户上传超大图片导致页面布局混乱。同时最小尺寸限制可以避免图片被缩得太小看不清。4.2 处理图片上传问题虽然quill-blot-formatter解决了图片缩放问题但图片上传功能还需要额外处理。Quill默认的图片处理是base64编码这会导致内容非常长。更好的做法是上传到服务器后返回URL。这里分享一个我常用的图片上传处理方案const imageHandler async () { const input document.createElement(input) input.setAttribute(type, file) input.setAttribute(accept, image/*) input.click() input.onchange async () { const file input.files[0] if (!file) return // 这里添加你的上传逻辑 const formData new FormData() formData.append(image, file) try { const res await axios.post(/api/upload, formData) const url res.data.url const quill editorRef.value.getQuill() const range quill.getSelection() quill.insertEmbed(range.index, image, url) } catch (error) { console.error(上传失败:, error) } } } // 在options中配置图片处理 modules: { toolbar: { handlers: { image: imageHandler } } }4.3 常见问题排查图片缩放不生效检查是否正确地注册了模块Quill.register(modules/blotFormatter, BlotFormatter)确保配置中包含了blotFormatter: {}检查Quill版本是否兼容拖拽手柄不显示确认CSS是否正确加载检查是否有其他CSS覆盖了插件的样式移动端兼容性问题quill-blot-formatter主要针对桌面端优化移动端可能需要额外处理触摸事件我在实际项目中遇到过这些问题特别是移动端兼容性。最终解决方案是在移动端隐藏缩放功能改为固定宽度显示图片。5. 性能优化与最佳实践5.1 按需加载模块如果你的项目对性能敏感可以考虑动态加载Quill和quill-blot-formatterconst setupEditor async () { const { default: Quill } await import(quill) const { default: BlotFormatter } await import(quill-blot-formatter) Quill.register(modules/blotFormatter, BlotFormatter) // 初始化编辑器... }这种方式可以减少初始加载时间特别是当富文本编辑器不是页面核心功能时。5.2 内容清理策略用户可能会从Word或其他地方复制内容到编辑器这些内容往往带有大量冗余样式。我建议在保存内容前进行清理import { cleanHtml } from ./utils const handleSave () { const cleanedContent cleanHtml(content.value) // 保存清理后的内容 }清理函数可以根据你的需求定制比如移除特定的CSS类、固定图片尺寸等。5.3 与后端的数据交互当内容需要保存到数据库时建议对图片URL进行转存处理防止外链失效对HTML内容进行消毒防止XSS攻击压缩大尺寸图片一个完整的保存流程可能是这样的const saveContent async () { // 1. 提取内容中的所有图片 const images extractImages(content.value) // 2. 转存外部图片到自己的CDN const processedImages await processImages(images) // 3. 替换内容中的图片URL const processedContent replaceImageUrls(content.value, processedImages) // 4. 消毒HTML内容 const sanitizedContent sanitizeHtml(processedContent) // 5. 保存到数据库 await api.saveContent({ content: sanitizedContent, images: processedImages }) }这套流程虽然复杂但在生产环境中非常必要。我在一个项目中因为没有做图片转存结果用户引用的外部图片后来失效了导致大量内容无法正常显示。

相关文章:

Vue3集成quill-blot-formatter:为富文本编辑器赋能图片自由缩放

1. 为什么你的富文本编辑器需要图片缩放功能? 最近在做一个内容管理系统的项目时,遇到了一个很头疼的问题:用户上传的图片总是撑破编辑器容器,导致整个页面排版乱七八糟。更糟的是,用户无法调整图片大小,只…...

从零到一:基于CodeSys的PLC实现PROFINET IO设备通讯实战

1. 从零搭建CodeSys工程环境 第一次打开CodeSys开发环境时,我对着空白的界面发呆了五分钟——这和我熟悉的西门子TIA Portal完全不同。作为工业自动化领域的新手,建议你先在电脑上安装最新版CodeSys 3.5 SP17(截至2023年主流版本)…...

5分钟搞定图文对话AI:Qwen2.5-VL-7B模型部署与Chainlit前端调用教程

5分钟搞定图文对话AI:Qwen2.5-VL-7B模型部署与Chainlit前端调用教程 1. 快速了解Qwen2.5-VL-7B模型 1.1 模型简介 Qwen2.5-VL-7B-Instruct-GPTQ是基于Qwen2.5-VL-7B-Instruct模型的GPTQ量化版本,专门用于图文对话任务。这个多模态模型能够同时理解图像…...

一步步来:在星图平台完成Qwen3-VL与飞书的联动配置

一步步来:在星图平台完成Qwen3-VL与飞书的联动配置 作者注:在上篇中,我们完成了 Qwen3-VL:30B 在 CSDN 星图 AI 云平台的私有化部署。本篇将聚焦于如何通过 Clawdbot 将该算力底座正式接入飞书(Lark),打造专…...

解决VS2019中LNK1181错误:.obj文件无法打开的隐藏陷阱

1. 当VS2019突然报错LNK1181时,我的第一反应 那天下午我正在调试一个三维点云处理项目,刚把PCL库的几十个.lib文件粘贴到附加依赖项里,按下F5编译的瞬间,熟悉的红色错误提示突然弹出——"LNK1181: 无法打开输入文件.obj"…...

Nakagami-m 分布——从理论到无线通信实践

1. Nakagami-m分布的前世今生 第一次听说Nakagami-m分布时,我正在调试一个无线传感器网络项目。当时遇到信号强度波动异常的问题,导师随口说了句"这现象用Nakagami建模可能更合适",从此这个神秘分布就成了我的研究伙伴。简单来说&a…...

3个革命性突破让游戏开发者实现AI无缝协作开发

3个革命性突破让游戏开发者实现AI无缝协作开发 【免费下载链接】Godot-MCP An MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude 项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP 开发困境:传统…...

手把手教你用Qwen3-Embedding-0.6B:从下载到调用全流程实战

手把手教你用Qwen3-Embedding-0.6B:从下载到调用全流程实战 1. 引言 你有没有遇到过这样的场景?想在自己的应用里加入智能搜索功能,让用户输入一句话就能找到最相关的文档;或者想给海量的文章自动分类,省去人工打标签…...

使用Typora撰写技术博客:图文并茂展示OFA-Image-Caption模型效果

使用Typora撰写技术博客:图文并茂展示OFA-Image-Caption模型效果 1. 引言:为什么选择Typora来写技术博客? 写技术博客,尤其是涉及模型效果展示的,最头疼的就是排版。代码、图片、文字混在一起,格式总是调…...

Sqlite3 数据库文件查看全攻略:从基础命令到高级查询技巧

SQLite3 数据库文件查看全攻略:从基础命令到高级查询技巧 SQLite3作为轻量级数据库引擎的代表,凭借其零配置、无服务器和单文件存储的特性,已成为移动应用、嵌入式系统和桌面软件的首选数据存储方案。对于开发者而言,熟练掌握SQLi…...

Navicat Premium 12 永久激活保姆级教程(附最新补丁下载)

Navicat Premium 12 高效使用指南:从安装到高级功能解析 在数据库管理领域,Navicat Premium 12 作为一款功能全面的图形化工具,为开发者提供了便捷的数据操作体验。不同于简单的激活教程,本文将深入探讨如何充分发挥这款软件的全部…...

Qwen-Image Web服务企业落地:制造业产品说明书配图AI生成降本增效实践

Qwen-Image Web服务企业落地:制造业产品说明书配图AI生成降本增效实践 1. 引言:制造业配图的痛点与机遇 如果你在制造业工作过,一定对产品说明书不陌生。那些厚厚的册子,每一页都需要配上清晰的图片——产品外观图、内部结构图、…...

基于STM32的MQ-135空气质量传感器驱动移植与数据读取实战

基于STM32的MQ-135空气质量传感器驱动移植与数据读取实战 最近在做一个室内环境监测的小项目,需要检测空气中的有害气体,于是就用上了MQ-135这个经典的空气质量传感器。很多刚开始接触STM32和传感器的朋友可能会觉得,把传感器用起来挺复杂的&…...

二十八、立创·梁山派天空星开发板RTC实时时钟配置与断电走时实战

二十八、立创梁山派天空星开发板RTC实时时钟配置与断电走时实战 很多朋友在用单片机做项目时,都遇到过需要记录时间的情况,比如数据采集要打上时间戳,或者设备需要定时自动开关机。这时候,一个靠谱的实时时钟(RTC&…...

ScanObjectNN:真实世界点云分类的突破性基准数据集

ScanObjectNN:真实世界点云分类的突破性基准数据集 【免费下载链接】scanobjectnn 项目地址: https://gitcode.com/gh_mirrors/sc/scanobjectnn 在三维视觉领域,点云分类技术的发展长期受限于合成数据集与真实环境的差异。ScanObjectNN作为首个基…...

BilibiliDown音频提取实用指南:如何高效获取B站音频资源

BilibiliDown音频提取实用指南:如何高效获取B站音频资源 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors…...

手把手教你DIY热成像仪电源模块:从TP4056充电到MP2161降压全流程

手把手教你DIY热成像仪电源模块:从TP4056充电到MP2161降压全流程 热成像技术正从专业领域逐步走进创客的实验室。无论是工业检测、安防监控还是智能家居,热成像仪都展现出独特的价值。而作为整个系统的"心脏",电源模块的设计直接决…...

AXI协议实战:如何用写选通优化你的FPGA数据传输(附代码示例)

AXI协议实战:如何用写选通优化你的FPGA数据传输(附代码示例) 在FPGA开发中,AXI协议作为高性能片上总线标准,其写选通(WSTRB)机制常被开发者忽视。实际上,合理运用这一特性可以显著提升数据传输效率&#xf…...

ENU坐标系与地心地固坐标系转换实战指南

1. ENU坐标系基础概念解析 第一次接触ENU坐标系时,我也被这个看似简单的三维坐标系绕晕过。直到在无人机导航项目中踩了几个坑才明白,这个以观测者为中心的坐标系,其实是连接抽象数学和真实物理世界的关键桥梁。 ENU坐标系全称东北天坐标系&a…...

浏览器P2P革命:FilePizza无服务器文件传输技术全解析

浏览器P2P革命:FilePizza无服务器文件传输技术全解析 【免费下载链接】filepizza :pizza: Peer-to-peer file transfers in your browser 项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza 一、技术原理:如何让浏览器成为直接对话的&…...

Kali与编程・旁站入侵・大白话版(超好懂)

大家好,我是 Kali 与编程讲师老 K,B 站和网易云课堂讲师,致力于帮助小白轻松学会 Kali 与编程,接下来你将搞懂什么是《旁站入侵》。 很多刚学渗透的同学,一听旁站入侵就觉得很高深,其实特别好理解。先拆开…...

Qwen3-4B Instruct-2507详细步骤:基于device_map=‘auto‘的显存优化部署

Qwen3-4B Instruct-2507详细步骤:基于device_mapauto的显存优化部署 1. 项目简介 今天要给大家分享的是一个基于阿里通义千问Qwen3-4B-Instruct-2507模型的高性能文本对话服务部署方案。这个模型专门针对纯文本处理场景进行了优化,移除了视觉相关的冗余…...

构建企业级人工智能高质量数据集:方法与路径

姜春宇 白玉真 刘渊 王超伦(中国信息通信研究院,北京 100191)摘 要 当前,我国人工智能数据集面临质量评估方法缺失、能力建设体系不明确等挑战。梳理了人工智能数据集的构成和分类,结合结构化数据质量评估,…...

内存故障诊断与系统稳定性测试:Memtest86+深度技术指南

内存故障诊断与系统稳定性测试:Memtest86深度技术指南 【免费下载链接】memtest86plus memtest86plus: 一个独立的内存测试工具,用于x86和x86-64架构的计算机,提供比BIOS内存测试更全面的检查。 项目地址: https://gitcode.com/gh_mirrors/…...

Qwen-Image-Lightning极简教程:无需复杂设置,输入中文就出图

Qwen-Image-Lightning极简教程:无需复杂设置,输入中文就出图 1. 为什么选择Qwen-Image-Lightning 如果你正在寻找一款简单易用、生成速度快、支持中文输入的AI绘画工具,Qwen-Image-Lightning绝对值得尝试。这个基于Qwen旗舰底座的文生图模型…...

ACadSharp技术解析与实践指南:高效处理CAD文件的.NET解决方案

ACadSharp技术解析与实践指南:高效处理CAD文件的.NET解决方案 【免费下载链接】ACadSharp C# library to read/write cad files like dxf/dwg. 项目地址: https://gitcode.com/gh_mirrors/ac/ACadSharp 在当今数字化设计领域,CAD文件处理已成为工…...

NJU PA4避坑指南:RISC-V分页机制中那些容易翻车的细节问题

NJU PA4实战指南:RISC-V分页机制深度解析与调试技巧 在计算机系统课程的教学实践中,RISC-V架构的Sv32分页机制实现往往是学生面临的最大挑战之一。作为南京大学PA4实验的核心内容,理解分页机制的工作原理并正确实现相关功能,不仅关…...

手把手教你用Bat_To_ExeConverter制作伪装成jpg的钓鱼exe(红队必备)

红队实战:高级社工钓鱼中的文件伪装技术解析 在网络安全攻防演练中,社会工程学攻击往往是最难防御的一环。作为红队成员,掌握有效的社工钓鱼技巧不仅能提升演练的真实性,更能帮助企业发现安全体系中的薄弱环节。本文将深入探讨一种…...

Windows本地部署Coze-Studio:从零到一,手把手攻克配置与向量模型难题

1. 环境准备与代码拉取 第一次在Windows上部署Coze-Studio时,我踩了不少坑。这个开源项目确实强大,但官方文档写得实在让人头疼。下面我会用最直白的语言,带你一步步搞定整个部署过程。 首先确保你的Windows系统满足这些基本条件:…...

Zotero Reading List:构建系统化文献阅读管理体系

Zotero Reading List:构建系统化文献阅读管理体系 【免费下载链接】zotero-reading-list Keep track of whether youve read items in Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-reading-list 价值定位:重新定义学术文献管理方…...