quill富文本编辑器 自定义字体和大小 以及提交和回显

2023-11-04

 

 

第一步:引入quill样式,我是下载到本地了
<!-- 主题样式 -->
<link rel="stylesheet" href="${request.contextPath}/statics/css/quill.snow.css">
<link rel="stylesheet" href="${request.contextPath}/statics/css/quill.bubble.css">
<link rel="stylesheet" href="${request.contextPath}/statics/css/quill.core.css">
第二步:引入js
<script src="${request.contextPath}/statics/js/quill.js"></script>
<script src="${request.contextPath}/statics/js/quill.min.js"></script> 

第三步:html部分代码

<div class="form-group">
    <div class="col-sm-2 control-label">内容</div>
    <div class="col-sm-10 ql-snow">
        <div id="content" class="ql-editor" style="height: 800px" v-model="messageInfo.content"></div>
    </div>
</div>

第四步:

quill: function(){
    const toolbarOptions = [
        ['bold', 'italic', 'underline', 'strike'],        // toggled buttons
        ['blockquote', 'code-block'],

        [{ header: 1 }, { header: 2 }],               // custom button values
        [{ list: 'ordered'}, { list: 'bullet' }],
        [{ script: 'sub'}, { script: 'super' }],      // superscript/subscript
        [{ indent: '-1'}, { indent: '+1' }],          // outdent/indent
        [{ direction: 'rtl' }],                         // text direction

        [{ size: ['small', false, 'large', 'huge'] }],  // custom dropdown
        [{ header: [1, 2, 3, 4, 5, 6, false] }],

        [{ color: [] }, { background: [] }],          // dropdown with defaults from
        //theme
        [{ font: [] }],
        [{ align: [] }],
        ['link', 'image'],
        ['clean']                                         // remove formatting button
    ];

    var options = {
        modules: {
            toolbar: toolbarOptions
        },
        placeholder: 'Compose an epic...',
        readOnly: false,
        theme: 'snow'
    };

    const quill = new Quill('#content',options);

获取富文本里面的数据:

const content = document.querySelector('#content').children[0].innerHTML

回显方式:

const content = document.querySelector('#content').children[0].innerHTML
quill.pasteHTML(vm.helpCenter.content + content)

设置字体格式:

在html处引入自定义的字体格式css

css:

.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=SimSun]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=SimSun]::before {
    content: "宋体";
    font-family: "SimSun";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=SimHei]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=SimHei]::before {
    content: "黑体";
    font-family: "SimHei";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Microsoft-YaHei]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Microsoft-YaHei]::before {
    content: "微软雅黑";
    font-family: "Microsoft YaHei";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=KaiTi]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=KaiTi]::before {
    content: "楷体";
    font-family: "KaiTi";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=FangSong]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=FangSong]::before {
    content: "仿宋";
    font-family: "FangSong";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Arial]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Arial]::before {
    content: "Arial";
    font-family: "Arial";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Times-New-Roman]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Times-New-Roman]::before {
    content: "Times New Roman";
    font-family: "Times New Roman";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=sans-serif]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=sans-serif]::before {
    content: "sans-serif";
    font-family: "sans-serif";
}

.ql-font-SimSun {
    font-family: "SimSun";
}
.ql-font-SimHei {
    font-family: "SimHei";
}
.ql-font-Microsoft-YaHei {
    font-family: "Microsoft YaHei";
}
.ql-font-KaiTi {
    font-family: "KaiTi";
}
.ql-font-FangSong {
    font-family: "FangSong";
}
.ql-font-Arial {
    font-family: "Arial";
}
.ql-font-Times-New-Roman {
    font-family: "Times New Roman";
}
.ql-font-sans-serif {
    font-family: "sans-serif";
}

在js中加入
//字体样式
var fonts = ['SimSun', 'SimHei','Microsoft-YaHei','KaiTi','FangSong','Arial','Times-New-Roman','sans-serif'];
var Font = Quill.import('formats/font');
Font.whitelist = fonts; //将字体加入到白名单

下面的font改成:

[{ font: fonts }],

设置字体大小:

在html处引入自定义的字体大小css
css:

.ql-snow .ql-picker.ql-size,
.ql-snow .ql-picker.ql-header {
    width: 75px !important;
}

.ql-snow .ql-picker.ql-font {
    width: 80px !important;
}

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

.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';
    font-size: 16px;
}

.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';
    font-size: 16px;
}

.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';
    font-size: 16px;
}

.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';
    /*font-size: 18px;*/
    font-size: 16px;
}

.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';
    font-size: 16px;
    /*font-size: 20px;*/
}

.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';
    font-size: 16px;
    /*font-size: 24px;*/
}

.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';
    font-size: 16px;
    /*font-size: 32px;*/
}

.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';
    font-size: 16px;
    /*font-size: 36px;*/
}

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

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

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

js处加入:

let Size = Quill.import('attributors/style/size')
Size.whitelist = ['10px', '12px', '14px', '16px', '18px', '20px','24px','32px','36px','48px','64px','72px']
Quill.register(Size, true)

然后下面size:

[{ size: ['10px', '12px', '14px', '16px', '18px', '20px','24px','32px','36px','48px','64px','72px'] }],  // custom dropdown

自定义行高:

css:

.ql-lineHeight::before {
    content: "行高:";
    position: relative;
    top: 2px;
}

.ql-lineHeight .ql-picker-label {
    left: 50px;
    top: -19px;
}

.ql-lineHeight .ql-picker-options {
    left: 40px;
}

.ql-picker.ql-lineHeight .ql-picker-label[data-value='1-0']::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value='1-0']::before {
    content: "1.0";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="1-1"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="1-1"]::before {
    content: "1.1";
}

.ql-picker.ql-lineHeight .ql-picker-label[data-value="1-2"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="1-2"]::before {
    content: "1.2";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="1-3"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="1-3"]::before {
    content: "1.3";
}

.ql-picker.ql-lineHeight .ql-picker-label[data-value="1-4"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="1-4"]::before {
    content: "1.4";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="1-5"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="1-5"]::before {
    content: "1.5";
}

.ql-picker.ql-lineHeight .ql-picker-label[data-value="1-6"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="1-6"]::before {
    content: "1.6";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="1-7"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="1-7"]::before {
    content: "1.7";
}

.ql-picker.ql-lineHeight .ql-picker-label[data-value="1-8"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="1-8"]::before {
    content: "1.8";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="1-9"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="1-9"]::before {
    content: "1.9";
}

.ql-picker.ql-lineHeight .ql-picker-label[data-value="2-0"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-0"]::before {
    content: "2.0";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="2-1"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-1"]::before {
    content: "2.1";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="2.2"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-2"]::before {
    content: "2.2";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="2-3"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-3"]::before {
    content: "2.3";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="2-4"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-4"]::before {
    content: "2.4";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="2-5"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-5"]::before {
    content: "2.5";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="2-6"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-6"]::before {
    content: "2.6";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="2-7"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-7"]::before {
    content: "2.7";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="2-8"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-8"]::before {
    content: "2.8";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="2-9"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="2-9"]::before {
    content: "2.9";
}
.ql-picker.ql-lineHeight .ql-picker-label[data-value="3-0"]::before,
.ql-picker.ql-lineHeight .ql-picker-item[data-value="3-0"]::before {
    content: "3.0";
}
.ql-editor {
    max-height: 500px;
}
.ql-lineHeight-1-0 {
    line-height: 1;
}

.ql-lineHeight-1-1 {
    line-height: 1.1;
}

.ql-lineHeight-1-2 {
    line-height: 1.2;
}
.ql-lineHeight-1-3 {
    line-height: 1.3;
}
.ql-lineHeight-1-4 {
    line-height: 1.4
}
.ql-lineHeight-1-5 {
    line-height: 1.5;
}
.ql-lineHeight-1-6 {
    line-height: 1.6;
}
.ql-lineHeight-1-7 {
    line-height: 1.7;
}
.ql-lineHeight-1-8 {
    line-height: 1.8;
}
.ql-lineHeight-1-9 {
    line-height: 1.9;
}
.ql-lineHeight-2-0 {
    line-height: 2;
}
.ql-lineHeight-2-1 {
    line-height: 2.1;
}
.ql-lineHeight-2-2 {
    line-height: 2.2;
}
.ql-lineHeight-2-3 {
    line-height: 2.3;
}
.ql-lineHeight-2-4 {
    line-height: 2.4
}
.ql-lineHeight-2-5 {
    line-height: 2.5;
}
.ql-lineHeight-2-6 {
    line-height: 2.6;
}
.ql-lineHeight-2-7 {
    line-height: 2.7;
}
.ql-lineHeight-2-8 {
    line-height: 2.8;
}
.ql-lineHeight-2-9 {
    line-height: 2.9;
}
.ql-lineHeight-3-0 {
    line-height: 2;
}

js:

行高数据:

lineHeightList: ['1-0', '1-1','1-2','1-3','1-4','1-5','1-6','1-7','1-8','1-9','2-0','2-1','2-2','2-3','2-4','2-5','2-6','2-7','2-8','2-9','3-0']
const Parchment = Quill.import('parchment');
class lineHeightAttributor extends Parchment.Attributor.Class {}
const lineHeightStyle = new lineHeightAttributor(
    "lineHeight",
    "ql-lineHeight",
    {
        scope: Parchment.Scope.INLINE,
        whitelist: vm.lineHeightList
    }
);
// 注册实例
Quill.register({ "formats/lineHeight": lineHeightStyle }, true);
下面toolber:[{ lineHeight: vm.lineHeightList}],

文件上传服务器

const quill1 = new Quill('#content',options);
var toolbar = quill1.getModule('toolbar');
toolbar.addHandler('image', imageUpload);
function imageUpload(value)
{
    //点击图片,则value值为true
    if(value) {
        //创建隐藏的文件上传input
        const input = document.createElement('input');
        input.setAttribute('type', 'file');
        input.setAttribute('accept', 'image/*');
        input.click();
        input.onchange = function() {
            const file = input.files[0];
            //判断文件是否为图片
            if(! /image\/\w+/.test(file.type)) {
                console.log('只能选择图片');
                return false;
            } else {
                //使用FormData创建键值对数据
                var fd = new FormData();
                fd.append('file', file);
                $.ajax({
                    type: 'post',
                    url: '/sys/oss/upload',//后台接口,我是用的是阿里的oss
                    dataType: 'json',
                    contentType: false,
                    processData: false,
                    data: fd,
                    success: function (result) {
                        //上传成功,准备将图片插入编辑框中
                        if (result.code === 0) {
                            //取得上传后返回所在的路径
                            var imgUrl = result.url;
                            //取得图片应该所在的位置
                            quill1.focus()
                            var currentPosition = quill1.getSelection().index;
                            //插入编辑框
                            quill1.insertEmbed(currentPosition, 'image', imgUrl);
                            //显示成功提示
                        } else {
                            console.log(result);
                        }
                    },
                    error: function (jqXHR) {
                        console.log('错误,' + jqXHR.status);
                    }
                });
            }
        }
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

quill富文本编辑器 自定义字体和大小 以及提交和回显 的相关文章

随机推荐

  • Spring Boot 获取接口调用者的IP

    需求 我们实现一个登陆功能时 可能会有需要记录登陆者IP的需求 用于系统安全分析或账户来源分析 当然还有更多应用场景 工具类如下 来源于网络 已兼容K8S 代理的情况 import org slf4j Logger import org s
  • 树莓派解决 vim 编辑器中文乱码问题

    目录 1 问题由来 2 乱码问题演示 3 解决方案 4 问题解决 1 问题由来 我们用树莓派做项目的时候经常需要在电脑编写程序代码 然后再把代码移植进树莓派进行运行 我们用电脑编写程序的时候避免不了都会写很多中文注释 当我们把 file c
  • 【BEV Review】论文 Delving into the Devils of Bird’s-eye-view 2022-9 笔记

    背景 一般来说 自动驾驶车辆的视觉传感器 比如摄像头 安装在车身上方或者车内后视镜上 无论哪个位置 摄像头所得到的都是真实世界在透视视图 Perspective View 下的投影 世界坐标系到图像坐标系 这种视图与人类的视觉系统很类似 因
  • 表单数据自动封装到javaBean中

    页面表单数据的自动封装到javaBean中 先定义一个Bean类 package com test public class Bean private String name private Integer sex public Strin
  • AD19铺铜操作

    1 在Keep OUT层沿板子边缘画出板子形状 2 PCB设计界面右上角 设置 PCB Editor General 勾选 铺铜修改后自动重铺 3 铺铜之前 打一些过孔 连接板子上下两层 双层板 并设置为GND网络 右边Properties
  • 复制文件夹所有内容 和 删除整个文件夹的2个函数

    选择自 hycapril 的 Blog 实现一个静态方法将指定文件夹下面的所有内容copy到目标文件夹下面 如果目标文件夹为只读属性就会报错 April 18April2005 In STU public static void CopyD
  • keil4 破解心得

    keil4 破解心得 Obj STM32 FD SDCard MP3 axf error L6047U The size nb 在编译时出现 Obj STM32 FD SDCard MP3 axf error L6047U The size
  • bes2300之环境搭建(一)

    目录 环境搭建 sdk文件结构介绍 编译 烧录 配置烧录选项 选择端口 启动升级 简单使用 环境搭建 安装编译工具链 gcc arm none eabi 4 9 2014q4 20141203 win32 exe make 3 81 exe
  • GPIO工作模式

    参考链接 STM32 STM32F4 GPIO八种模式及工作原理详解 Z小旋 CSDN博客 stm32io口的八种工作模式 GPIO 即通用I O 输入 输出 端口 是STM32可控制的引脚 STM32芯片的GPIO引脚与外部设备连接起来
  • [备忘]域用户登陆出现“此工作站和主域间的信任关系失败”错误解决方法

    症状 登陆域用户 出现错误 此工作站和主域间的信任关系失败 并无法登陆 解决方案 1 使用本地用户登录 更改当前 域 为 工作组 如默认的WORKGROUP等 并输入具有域管理权限的用户名 密码 随后此电脑上的 域 将会被删除 2 重启电脑
  • Flink入门看完这篇文章就够了

    文章目录 第一章 概述 第一节 什么是Flink 第二节 Flink特点 第三节 Flink应用场景 第四节 Flink核心组成 第五节 Flink处理模型 流处理和批处理 第六节 流处理引擎的技术选型 拓展 什么是最多一次 最少一次和仅一
  • 算法基础之数组理论

    算法基础之数组理论 1 前言 2 数组基础定义 3 数组增删改查 3 1基本功能 3 2添加元素 3 3查询和修改元素 3 4包含 搜索和删除元素 3 5其他 3 6检验 4 动态数组及其时间复杂度 4 1动态数组的实现 4 2增删改查时间
  • 阿里云通义千问向全社会开放,近期将开源更大参数规模大模型

    9月13日 阿里云宣布通义千问大模型已首批通过备案 并正式向公众开放 广大用户可登录通义千问官网体验 企业用户可以通过阿里云调用通义千问API 通义千问在技术创新和行业应用上均位居大模型行业前列 IDC最新的AI大模型评估报告显示 通义千问
  • 【YModem】YModem串口IAP升级例程+YModem串口工具

    目录 YModem协议传输的过程 IAP例程 YModem串口工具 YModem技术手册 手把手教你如何实现自动固件更新 YModem协议是由XModem协议演变而来的 每包数据可以达到1024字节 是一个非常高效的文件传输协议 Ymode
  • ChatGPT多场景应用之基本应用

    人工智能 AI 无疑是近年来最流行和最先进的技术之一 生成式 AI模型正在促进众多任务 实现效率和自动化 目前 ChatGPT是风靡互联网的主要生成人工智能模型 据 Similar Web 称 自 2022 年 11 月发布以来 其访问量已
  • 【c语言五子棋】自定义类型五子棋/井字棋:胜负判断

    一 算法思路 由于五子棋规则比较简单 我们可以胜负判断分为以下几个方面分别判断 1 横向判断 2 竖向判断 3 斜向判断 从左下到右上 4 斜向判断 从左上到右下 二 算法原理 算法来源 参考字符串匹配的处理方法 具体可以参考 从头到尾彻底
  • 腾讯COS,Cloudbase API用法教程详细

    Chinar blog www chinar xin 腾讯云 COS Cloudbase API 本文提供全流程 中文翻译 Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无限可能 Chinar 心分享 心创新 助力快速
  • 使用GCC和Makefile编译c文件

    Ubuntu下使用GCC和Makefile编译c文件 目录 Ubuntu下使用GCC和Makefile编译c文件 前言 一 GGC命令行模式 1 vim创建文件 2 gcc编译 1 编译出目标文件 2 链接为可执行文件 3 运行 二 VS2
  • 没有苹果开发者账号能否创建ios证书-最新

    在2020年以前 注册苹果开发者账号后 就可以使用香蕉云编生成证书 但2020年后 因为注册苹果开发者账号需要使用Apple Developer app注册开发者账号 所以需要缴费才能创建ios证书了 所以新政策出来后 只能使用香蕉云编 注
  • quill富文本编辑器 自定义字体和大小 以及提交和回显

    第一步 引入quill样式 我是下载到本地了 第二步 引入js