若依富文本添加字体 Editor 若依 vue Quill插件富文本框,文字大小设置,添加字体 对齐方式

时间:2025-02-16 19:24:58
  • <template>
  • <div>
  • <el-upload
  • :action="uploadUrl"
  • :before-upload="handleBeforeUpload"
  • :on-success="handleUploadSuccess"
  • :on-error="handleUploadError"
  • name="file"
  • :show-file-list="false"
  • :headers="headers"
  • style="display: none"
  • ref="upload"
  • v-if=" == 'url'"
  • ></el-upload>
  • <div class="editor" ref="editor" :style="styles"></div>
  • </div>
  • </template>
  • <script>
  • import Quill from "quill";
  • import "quill/dist/";
  • import "quill/dist/";
  • import "quill/dist/";
  • import { getToken } from "@/utils/auth";
  • let fontFamily = [
  • "标准字体",
  • "宋体",
  • "黑体",
  • "微软雅黑",
  • "楷体",
  • "仿宋",
  • "Arial",
  • "苹方"
  • ];
  • ["attributors/style/font"].whitelist = fontFamily;
  • (["attributors/style/font"]);
  • // 自定义文字大小
  • let fontSize = ["16px", "18px", "20px", "22px", "24px", "36px"];
  • ["attributors/style/size"].whitelist = fontSize;
  • (["attributors/style/size"]);
  • // 新增行高 没效果
  • // let Parchment = ("parchment");
  • // let lingHeight = ["initial", "10", "25", "1.75", "2", "3", "4"];
  • // class lineHeightAttributor extends {}
  • // const lineHeightStyle = new lineHeightAttributor("lineHeight", "line-height", {
  • // scope: ,
  • // whitelist: lingHeight
  • // });
  • // ({ "formats/lineHeight": lineHeightStyle }, true);
  • // 对齐方式样式都改成style方式,而不是class
  • let Align = ("attributors/style/align");
  • = ["right", "center", "justify"];
  • (Align, true);
  • export default {
  • name: "Editor",
  • props: {
  • /* 编辑器的内容 */
  • value: {
  • type: String,
  • default: ""
  • },
  • /* 高度 */
  • height: {
  • type: Number,
  • default: null
  • },
  • /* 最小高度 */
  • minHeight: {
  • type: Number,
  • default: null
  • },
  • /* 只读 */
  • readOnly: {
  • type: Boolean,
  • default: false
  • },
  • // 上传文件大小限制(MB)
  • fileSize: {
  • type: Number,
  • default: 5
  • },
  • /* 类型(base64格式、url格式) */
  • type: {
  • type: String,
  • default: "url"
  • }
  • },
  • data() {
  • return {
  • uploadUrl: .VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
  • headers: {
  • Authorization: "Bearer " + getToken()
  • },
  • Quill: null,
  • currentValue: "",
  • options: {
  • theme: "snow",
  • bounds: ,
  • 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"], // 链接、图片、视频
  • [{ font: fontFamily }],
  • [{ size: fontSize }], // 文字大小
  • // [{ lineheight: lingHeight }] // 行高
  • ]
  • },
  • placeholder: "请输入内容",
  • readOnly:
  • }
  • };
  • },
  • computed: {
  • styles() {
  • let style = {};
  • if () {
  • = `${}px`;
  • }
  • if () {
  • = `${}px`;
  • }
  • return style;
  • }
  • },
  • watch: {
  • value: {
  • handler(val) {
  • if (val !== ) {
  • = val === null ? "" : val;
  • if () {
  • ();
  • }
  • }
  • },
  • immediate: true
  • }
  • },
  • mounted() {
  • ();
  • },
  • beforeDestroy() {
  • = null;
  • },
  • methods: {
  • init() {
  • const editor = this.$;
  • = new Quill(editor, this.options);
  • // 如果设置了上传地址则自定义图片上传事件
  • if (this.type == "url") {
  • let toolbar = ("toolbar");
  • ("image", value => {
  • = "image";
  • if (value) {
  • this.$.$children[0].$refs.input.click();
  • } else {
  • .format("image", false);
  • }
  • });
  • }
  • ();
  • .on("text-change", (delta, oldDelta, source) => {
  • const html = this.$[0].innerHTML;
  • const text = ();
  • const quill = ;
  • = html;
  • this.$emit("input", html);
  • this.$emit("on-change", { html, text, quill });
  • });
  • .on("text-change", (delta, oldDelta, source) => {
  • this.$emit("on-text-change", delta, oldDelta, source);
  • });
  • .on("selection-change", (range, oldRange, source) => {
  • this.$emit("on-selection-change", range, oldRange, source);
  • });
  • .on("editor-change", (eventName, ...args) => {
  • this.$emit("on-editor-change", eventName, ...args);
  • });
  • },
  • // 上传前校检格式和大小
  • handleBeforeUpload(file) {
  • // 校检文件大小
  • if () {
  • const isLt = file.size / 1024 / 1024 < ;
  • if (!isLt) {
  • this.$message.error(`上传文件大小不能超过 ${} MB!`);
  • return false;
  • }
  • }
  • return true;
  • },
  • handleUploadSuccess(res, file) {
  • // 获取富文本组件实例
  • let quill = ;
  • // 如果上传成功
  • if (res.code == 200) {
  • // 获取光标所在位置
  • let length = ().index;
  • // 插入图片 为服务器返回的图片地址
  • (
  • length,
  • "image",
  • .VUE_APP_BASE_API +
  • );
  • // 调整光标到最后
  • (length + 1);
  • } else {
  • this.$message.error("图片插入失败");
  • }
  • },
  • handleUploadError() {
  • this.$message.error("图片插入失败");
  • }
  • }
  • };
  • </script>
  • <style>
  • .editor,
  • .ql-toolbar {
  • white-space: pre-wrap !important;
  • line-height: normal !important;
  • }
  • .quill-img {
  • display: none;
  • }
  • .ql-snow .ql-tooltip[data-mode="link"]::before {
  • content: "请输入链接地址:";
  • }
  • .ql-snow .-editing -action::after {
  • border-right: 0px;
  • content: "保存";
  • padding-right: 0px;
  • }
  • .ql-snow .ql-tooltip[data-mode="video"]::before {
  • content: "请输入视频地址:";
  • }
  • .ql-snow .-size .ql-picker-label::before,
  • .ql-snow .-size .ql-picker-item::before {
  • content: "14px";
  • }
  • .ql-snow .-size .ql-picker-label[data-value="small"]::before,
  • .ql-snow .-size .ql-picker-item[data-value="small"]::before {
  • content: "10px";
  • }
  • .ql-snow .-size .ql-picker-label[data-value="large"]::before,
  • .ql-snow .-size .ql-picker-item[data-value="large"]::before {
  • content: "18px";
  • }
  • .ql-snow .-size .ql-picker-label[data-value="huge"]::before,
  • .ql-snow .-size .ql-picker-item[data-value="huge"]::before {
  • content: "32px";
  • }
  • .ql-snow .-header .ql-picker-label::before,
  • .ql-snow .-header .ql-picker-item::before {
  • content: "文本";
  • }
  • .ql-snow .-header .ql-picker-label[data-value="1"]::before,
  • .ql-snow .-header .ql-picker-item[data-value="1"]::before {
  • content: "标题1";
  • }
  • .ql-snow .-header .ql-picker-label[data-value="2"]::before,
  • .ql-snow .-header .ql-picker-item[data-value="2"]::before {
  • content: "标题2";
  • }
  • .ql-snow .-header .ql-picker-label[data-value="3"]::before,
  • .ql-snow .-header .ql-picker-item[data-value="3"]::before {
  • content: "标题3";
  • }
  • .ql-snow .-header .ql-picker-label[data-value="4"]::before,
  • .ql-snow .-header .ql-picker-item[data-value="4"]::before {
  • content: "标题4";
  • }
  • .ql-snow .-header .ql-picker-label[data-value="5"]::before,
  • .ql-snow .-header .ql-picker-item[data-value="5"]::before {
  • content: "标题5";
  • }
  • .ql-snow .-header .ql-picker-label[data-value="6"]::before,
  • .ql-snow .-header .ql-picker-item[data-value="6"]::before {
  • content: "标题6";
  • }
  • .ql-snow .-font .ql-picker-label::before,
  • .ql-snow .-font .ql-picker-item::before {
  • content: "标准字体";
  • }
  • /* .ql-snow .-font .ql-picker-label[data-value="serif"]::before,
  • .ql-snow .-font .ql-picker-item[data-value="serif"]::before {
  • content: "衬线字体";
  • }
  • .ql-snow .-font .ql-picker-label[data-value="monospace"]::before,
  • .ql-snow .-font .ql-picker-item[data-value="monospace"]::before {
  • content: "等宽字体";
  • } */
  • /*
  • 字体
  • */
  • .ql-snow .-font {
  • width: 80px;
  • }
  • .ql-snow .-font .ql-picker-label[data-value="宋体"]::before,
  • .ql-snow .-font .ql-picker-item[data-value="宋体"]::before {
  • content: "宋体";
  • }
  • .ql-snow .-font .ql-picker-label[data-value="黑体"]::before,
  • .ql-snow .-font .ql-picker-item[data-value="黑体"]::before {
  • content: "黑体";
  • }
  • .ql-snow .-font .ql-picker-label[data-value="微软雅黑"]::before,
  • .ql-snow .-font .ql-picker-item[data-value="微软雅黑"]::before {
  • content: "微软雅黑";
  • }
  • .ql-snow .-font .ql-picker-label[data-value="楷体"]::before,
  • .ql-snow .-font .ql-picker-item[data-value="楷体"]::before {
  • content: "楷体";
  • }
  • .ql-snow .-font .ql-picker-label[data-value="仿宋"]::before,
  • .ql-snow .-font .ql-picker-item[data-value="仿宋"]::before {
  • content: "仿宋";
  • }
  • .ql-snow .-font .ql-picker-label[data-value="Arial"]::before,
  • .ql-snow .-font .ql-picker-item[data-value="Arial"]::before {
  • content: "Arial";
  • }
  • .ql-snow .-font .ql-picker-label[data-value="苹方"]::before,
  • .ql-snow .-font .ql-picker-item[data-value="苹方"]::before {
  • content: "苹方";
  • }
  • .ql-snow .-size .ql-picker-label[data-value="16px"]::before,
  • .ql-snow .-size .ql-picker-item[data-value="16px"]::before {
  • content: "16px";
  • }
  • .ql-snow .-size .ql-picker-label[data-value="18px"]::before,
  • .ql-snow .-size .ql-picker-item[data-value="18px"]::before {
  • content: "18px";
  • }
  • .ql-snow .-size .ql-picker-label[data-value="20px"]::before,
  • .ql-snow .-size .ql-picker-item[data-value="20px"]::before {
  • content: "20px";
  • }
  • .ql-snow .-size .ql-picker-label[data-value="22px"]::before,
  • .ql-snow .-size .ql-picker-item[data-value="22px"]::before {
  • content: "22px";
  • }
  • .ql-snow .-size .ql-picker-label[data-value="24px"]::before,
  • .ql-snow .-size .ql-picker-item[data-value="24px"]::before {
  • content: "24px";
  • }
  • .ql-snow .-size .ql-picker-label[data-value="36px"]::before,
  • .ql-snow .-size .ql-picker-item[data-value="36px"]::before {
  • content: "36px";
  • }
  • /* .ql-snow .-lineheight {
  • width: 70px;
  • }
  • .ql-snow .-lineheight .ql-picker-label::before {
  • content: "行高";
  • }
  • .ql-snow
  • .-lineheight
  • .ql-picker-item[data-value="initial"]::before {
  • content: "默认";
  • }
  • .ql-snow .-lineheight .ql-picker-item[data-value="10"]::before {
  • content: "10";
  • }
  • .ql-snow .-lineheight .ql-picker-item[data-value="25"]::before {
  • content: "25";
  • }
  • .ql-snow .-lineheight .ql-picker-item[data-value="1.75"]::before {
  • content: "1.75";
  • }
  • .ql-snow .-lineheight .ql-picker-item[data-value="2"]::before {
  • content: "2";
  • }
  • .ql-snow .-lineheight .ql-picker-item[data-value="3"]::before {
  • content: "3";
  • }
  • .ql-snow .-lineheight .ql-picker-item[data-value="4"]::before {
  • content: "4";
  • }
  • .ql-snow .-lineheight .ql-picker-item[data-value="5"]::before {
  • content: "5";
  • } */
  • </style>