vue3富文本编辑器vue-quill-editor、图片缩放ImageResize详细配置及使用教程

这篇具有很好参考价值的文章主要介绍了vue3富文本编辑器vue-quill-editor、图片缩放ImageResize详细配置及使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官网地址:https://vueup.github.io/vue-quill/

效果图

@vueup/vue-quill,vue.js,javascript,前端

 1、安装

npm install @vueup/vue-quill@alpha --save
npm install quill-image-extend-module --save
npm install quill-image-resize-module -- save

2、在vue.config.js中添加配置,否则quill-image-resize-module会出现Cannot read property ‘imports‘ of undefined报错问题

var webpack = require('webpack');
module.exports = {
    configureWebpack: {
        plugins: [
          new webpack.ProvidePlugin({
            'window.Quill': 'quill/dist/quill.js',
            'Quill': 'quill/dist/quill.js'
          }),
        ]
    }
}

3、创建quillTool.js(用于添加超链接、视频)

import { Quill } from '@vueup/vue-quill'
// 源码中是import直接倒入,这里要用Quill.import引入
const BlockEmbed = Quill.import('blots/block/embed')
const Link = Quill.import('formats/link')

const ATTRIBUTES = ['height', 'width']

class quillTool extends BlockEmbed {
    static create(value) {
        const node = super.create(value)
        // 添加video标签所需的属性
        node.setAttribute('controls', 'controls')
        node.setAttribute('type', 'video/mp4')
        node.setAttribute('src', this.sanitize(value))
        return node
    }

    static formats(domNode) {
        return ATTRIBUTES.reduce((formats, attribute) => {
            if (domNode.hasAttribute(attribute)) {
                formats[attribute] = domNode.getAttribute(attribute)
            }
            return formats
        }, {})
    }

    static sanitize(url) {
        return Link.sanitize(url)
    }

    static value(domNode) {
        return domNode.getAttribute('src')
    }

    format(name, value) {
        if (ATTRIBUTES.indexOf(name) > -1) {
            if (value) {
                this.domNode.setAttribute(name, value)
            } else {
                this.domNode.removeAttribute(name)
            }
        } else {
            super.format(name, value)
        }
    }

    html() {
        const { video } = this.value()
        return `<a href="${video}">${video}</a>`
    }
}
quillTool.blotName = 'video' // 这里不用改,楼主不用iframe,直接替换掉原来,如果需要也可以保留原来的,这里用个新的blot
quillTool.className = 'ql-video'
quillTool.tagName = 'video' // 用video标签替换iframe

export default quillTool

4、完整代码文章来源地址https://www.toymoban.com/news/detail-766377.html

<template>
    
    <QuillEditor :options="editorOption" contentType="html" ref="QuillEditor" class="ql-editor" />

</template>

<script>
const QEIheaders = {
    n: Math.ceil(Math.random() * 10),
    t: Math.floor(new Date().getTime() / 1000),
    c: axios.defaults.headers['authKey'] ? axios.defaults.headers['authKey'] : 'undefined',
    s: '',
}
QEIheaders.s = md5(`c=${QEIheaders.c}&t=${QEIheaders.t}&n=${QEIheaders.n}&key=yourKey`);

import { QuillEditor, Quill } from '@vueup/vue-quill'
import { ImageExtend, QuillWatch } from 'quill-image-extend-module'
import ImageResize from 'quill-image-resize-module';
import quillTool from '@/utils/quillTool'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import md5 from 'js-md5'
import axios from 'axios'
const fontSize = ['12px', '13px', '14px', '15px', '16px', '18px', '20px', '24px', '28px', '32px', '36px'];
Quill.imports['attributors/style/size'].whitelist = fontSize;
Quill.register(quillTool, true)
Quill.register(Quill.imports['attributors/style/size'], true);
Quill.register('modules/imageResize', ImageResize);
Quill.register('modules/ImageExtend', ImageExtend)

// 工具栏配置
const toolbarOptions = [
    ['bold', 'italic', 'underline', 'strike'], // 加粗 斜体 下划线 删除线
    ["blockquote", "code-block"], // 引用
    [{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表
    [{ script: "sub" }, { script: "super" }], // 上标/下标
    [{ indent: '-1' }, { indent: '+1' }], // 缩进
    [{ direction: 'rtl' }], // 文本方向
    [{ size: fontSize }], // 字体大小
    [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
    [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
    [{ font: [] }], // 字体种类
    [{ align: [] }], // 对齐方式
    ['clean'], // 清除文本格式
    ['link', 'image', 'video'] // 链接、图片、视频
]

export default {
    mixins: [ tool ],
    components: { QuillEditor },
    data() {
        return {
            editorOption: {
                theme: 'snow',
                placeholder: '请输入',
                modules: {
                    imageResize: {}, // 声明imageResize模块,必须的!
                    ImageExtend: {
                        name: 'file_name', // 参数名
                        action: window.BASE_URL + '/upload/image', // 服务器地址,如果为空则采用base64插入图片
                        headers: xhr => { // 设置请求头参数
                            for(let item of Object.keys(QEIheaders)){
                                xhr.setRequestHeader(item, QEIheaders[item])
                            }
                        },
                        response: res => {
                            return `res.data.filepath`
                        },
                        size: 8, // 图片不能超过8M
                        sizeError: () => {
                            this.$message.error('粘贴图片大小不能超过8MB!')
                        }
                    },
                    toolbar: {
                        container: toolbarOptions,
                        handlers: {
                            image: function(value) {
                                QuillWatch.emit(this.quill.id)
                            },
                            link: function(value) {
                                if (value) {
                                    var href = prompt('请输入链接地址:')
                                    this.quill.format('link', href)
                                } else {
                                    this.quill.format('link', false)
                                }
                            },
                            video: function(value) {
                                if (value) {
                                    var href = prompt('请输入视频链接:')
                                    this.quill.format('video', href)
                                } else {
                                    this.quill.format('video', false)
                                }
                            }
                        }
                    }
                }
            },
        }
    },

    mounted(){
        // 解决富文本编辑器自动获取焦点问题
        //document.querySelector('.FSDcontent').scrollTo(0,0) // 设置相关容器滚动到顶部
        this.$refs.QuillEditor.getQuill().enable(false) // 禁用
        this.$nextTick(() => {
            this.$refs.QuillEditor.getQuill().enable(true) // 启用
        },100)
    },
}
</script>

<style>

    .ql-snow .ql-container {
        height: 300px;
        line-height: normal;
        width: auto;
    }

    .ql-snow span.ql-size {
        max-width: 80px !important;
    }

    .ql-snow .ql-tooltip[data-mode="link"]::before {
        content: "请输入链接地址:";
    }

    .ql-snow .ql-tooltip.ql-editing a.ql-action::after {
        border-right: 0px;
        content: "保存";
        padding-right: 0px;
    }

    .ql-snow .ql-tooltip[data-mode="video"] {
        left: 0 !important;
    }

    .ql-snow .ql-tooltip[data-mode="video"]::before {
        content: "请输入视频地址:";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item::before {
        content: "14px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12px"]::before {
        content: "12px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="13px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="13px"]::before {
        content: "13px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14px"]::before {
        content: "14px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16px"]::before {
        content: "16px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="17px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="17px"]::before {
        content: "17px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18px"]::before {
        content: "18px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="19px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="19px"]::before {
        content: "19px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20px"]::before {
        content: "20px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="21px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="21px"]::before {
        content: "21px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="22px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22px"]::before {
        content: "22px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="23px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="23px"]::before {
        content: "23px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="24px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24px"]::before {
        content: "24px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="25px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="25px"]::before {
        content: "25px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="26px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="26px"]::before {
        content: "26px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="27px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="27px"]::before {
        content: "27px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="28px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28px"]::before {
        content: "28px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="29px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="29px"]::before {
        content: "29px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="30px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="30px"]::before {
        content: "30px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="31px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="31px"]::before {
        content: "31px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="32px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32px"]::before {
        content: "32px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="33px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="33px"]::before {
        content: "33px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="34px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="34px"]::before {
        content: "34px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="35px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="35px"]::before {
        content: "35px";
    }

    .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="36px"]::before,
    .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36px"]::before {
        content: "36px";
    }

    .ql-snow .ql-picker.ql-header .ql-picker-label::before,
    .ql-snow .ql-picker.ql-header .ql-picker-item::before {
        content: "文本";
    }

    .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
    .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
        content: "标题1";
    }

    .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
    .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
        content: "标题2";
    }

    .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
    .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
        content: "标题3";
    }

    .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
    .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
        content: "标题4";
    }

    .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
    .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
        content: "标题5";
    }

    .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
    .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
        content: "标题6";
    }

    .ql-snow .ql-picker.ql-font .ql-picker-label::before,
    .ql-snow .ql-picker.ql-font .ql-picker-item::before {
        content: "标准字体";
    }

    .ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
    .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {
        content: "衬线字体";
    }

    .ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
    .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {
        content: "等宽字体";
    }

</style>

到了这里,关于vue3富文本编辑器vue-quill-editor、图片缩放ImageResize详细配置及使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue-quill-editor富文本编辑器-扩展表格、图片调整大小

    上篇文章已经讲到、vue-quill-editor的基本配置和图片转成url 这篇文章主要使用插件来完成 图片调整大小 和 表格的插件使用( 这两个目前quill 版本并不兼容 如果有大神解决了还望指点 ) 参考文章: vue-quill-editor 富文本编辑器支持图片拖拽和放大缩小_*且听风吟的博客-CSDN博

    2024年02月04日
    浏览(24)
  • Vue +vue-quill-editor+ Element UI使用富文本编辑器,上传图片,上传视频

    如果你们有问题,可以发评论提问,我看见一定回复!!!!! 一、基本使用 1、下载vue-quill-editor组件 2、引入· 富文本组件 方式一:全局引入 (在 main.js 文件中) 方式二:按需引入 (在 单个组件 中引用) 3、工具栏相关配置 4、设置工具栏中文提示 5、修改vue-quill-editor字体

    2024年02月08日
    浏览(23)
  • 【移动端VUE】使用富文本编辑器插件 vue-quill-editor 以及移动端适配踩过的坑

    合同填写审批意见时使用富文本编辑器填写,支持字体较粗、修改颜色,最后审批历史可以展示出业务填写的效果,实现结果: 1. 安装 vue-quill-editor 2、引入 - 全局引入 在 main.js 中引入插件 - 局部引入 3、使用VueQuillEditor 这里展示局部使用的代码 然后就实现了产品想要的结果

    2023年04月08日
    浏览(27)
  • Vue3 中vue-quill富文本编辑器图片缩放

     导包   添加配置   注: 该编辑器已经不在维护了,很古老了,打包后如果报错,建议使用其他编辑器

    2024年04月25日
    浏览(13)
  • vue3使用quill富文本编辑器,保姆级教程,富文本踩坑解决

    本文是封装成组件使用 先放效果图 先封装组件,建立如下目录 全部代码如下, 使用 本文是第二个页面使用这个富文本编辑器有可能watch监听中找不到ref,如果不能正常使用可以稍微改装下在onMounted里赋值然后在setValue里抛出就好 保姆级教程,有问题欢迎提出

    2024年02月11日
    浏览(26)
  • 简版的富文本编辑器、VUE+ElementUI 富文本编辑器 element ui富文本编辑器的使用(quill-editor) 不好用你来打我!全网醉简单!要复杂的别来!

    实现效果   1.安装插件 npm install vue-quill-editor --save 2.安装成功后在package.json中查看 3.在main.js中全局引入插件 4.页面实现 感谢老哥: ElementUI生成富文本编辑器 https://blog.csdn.net/keplerm/article/details/123379511?spm=1001.2101.3001.6650.9utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCom

    2024年02月16日
    浏览(24)
  • element ui富文本编辑器的使用(quill-editor)

    可以拖拽图片大小及其位置 为了便于大家直接使用,直接把script以及css放在一个页面里,之际copy就可以使用 注意: 1、我是在elementUi使用的,上传图片以及页面的访问需要有登录权限,所以我的上传图片视频的组件里有:headers=“headers”,携带登录权限 2、需要更改自己的上

    2024年02月03日
    浏览(19)
  • Vue3项目中使用富文本编辑器

    tinymce简介 一、 安装 二、使用步骤 1. 封装组件 2. 组件中挂载 3.应用富文本 总结 TinyMCE 是一款易用、且功能强大的所见即所得的富文本编辑器。跟其他富文本编辑器相比,有着丰富的插件,支持多种语言,能够满足日常的业务需求并且免费。 一、安装Tinymce 注意:版本可根据

    2024年02月15日
    浏览(23)
  • vue3项目使用富文本编辑器-wangeditor

    1.下载依赖 2.插件版本  3.使用 引入css和组件 配置方法 模板(标签)中插入 效果  

    2024年02月09日
    浏览(25)
  • Vue3中快速简单使用CKEditor 5富文本编辑器

    CKEditor 5就是内嵌在网页中的一个富文本编辑器工具 CKEditor 5开发文档(英文):https://ckeditor.com/docs/ckeditor5/latest/index.html 接下来带你快速熟悉CKEditor 5在Vue3中简单使用,看最终效果图👇 本文项目采用CKEditor 5定制经典配置(ckeditor5-build-classic) + @ckeditor/ckeditor5-vue 官网定制,选

    2024年02月09日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包