html部分
<el-upload class="avatar-uploader quill-img"
:action="uploadImgUrl"
name="file"
:data="qiniu"
:headers="headers"
:show-file-list="false"
:on-success="quillImgSuccess"
:on-error="uploadError"
:before-upload="quillImgBefore"
accept='.jpg,.jpeg,.png,.gif'></el-upload>
<quill-editor class="editor"
v-model="content"
ref="quillEditor"
:options="editorOption"
@change="onEditorChange($event)"
@ready="ready($event)"></quill-editor>
</div>
js部分
import {getToken} from '@/utils/auth'
import {getUpLoadToken} from '@/utils/upload.js'
import {quillEditor} from 'vue-quill-editor'
import Quill from 'quill'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import {lineHeightStyle} from '@/utils/lineHeight'
const fontSizeStyle = Quill.import('attributors/style/size')
fontSizeStyle.whitelist = ['12px', '14px', '16px', '18px', '20px', '24px', '28px', '36px', '48px', '72px']
Quill.register(fontSizeStyle, true)
const Font = Quill.import('attributors/style/font')
const fonts = ['SimSun', 'SimHei', 'Microsoft-YaHei', 'KaiTi', 'FangSong']
Font.whitelist = fonts
Quill.register(Font, true)
export default {
props: {
value: {
type: String,
default: '',
},
height: {
type: Number,
default: null,
},
minHeight: {
type: Number,
default: null,
},
readOnly: {
type: Boolean,
default: false,
},
fileSize: {
type: Number,
default: 5,
},
type: {
type: String,
default: 'url',
},
maxSize: {
type: Number,
default: 4000,
},
},
components: {quillEditor},
data() {
return {
qiniu: {
token:
'获取的七牛云token',
qiniu_url:
upload_qiniu_addr:
},
content: this.value,
editorOption: {
placeholder: '',
theme: 'snow',
placeholder: '请输入内容',
modules: {
toolbar: {
container: [
['bold', 'italic', 'underline', 'strike'],
['blockquote', 'code-block'],
[{header: 1}, {header: 2}],
[{list: 'ordered'}, {list: 'bullet'}],
[{script: 'sub'}, {script: 'super'}],
[{indent: '-1'}, {indent: '+1'}],
[{direction: 'rtl'}],
[{size: fontSizeStyle.whitelist}],
[{lineheight: ['1', '1.5', '1.8', '2', '3', '4', '5']}],
[{header: [1, 2, 3, 4, 5, 6, false]}],
[{color: []}, {background: []}],
[{font: fonts}],
[{align: []}],
['clean'],
['image', 'video'],
],
handlers: {
lineheight: (value) => {
if (value) {
let quill = this.$refs.quillEditor.quill
quill.format('lineHeight', value)
}
},
image: (value) => {
if (value) {
document.querySelector('.avatar-uploader input').click()
} else {
this.quill.format('image', false)
}
},
},
},
history: {
delay: 1000,
maxStack: 50,
userOnly: false,
},
},
},
uploadImgUrl:
headers: {
Authorization: 'Bearer ' + getToken(),
},
}
},
watch: {
value: function () {
this.content = this.value
},
},
methods: {
UpLoadToken() {
getUpLoadToken()
.then((res) => {
if (res.code == 200) {
this.token = res.data
} else {
console.log('errr-token')
}
})
.catch((err) => {
console.log(err)
})
},
onEditorBlur() {
},
onEditorFocus() {
},
onEditorChange() {
this.$emit('input', this.content)
},
ready() {
Quill.register({'formats/lineHeight': lineHeightStyle}, true)
},
quillImgBefore(file) {
let fileType = file.type
if (fileType === 'image/jpeg' || fileType === 'image/png') {
return true
} else {
this.$message.error('请插入图片类型文件(jpg/jpeg/png)')
return false
}
},
quillImgSuccess(res, file) {
console.log(res, 'res')
let quill = this.$refs.quillEditor.quill
if (res.hash) {
let length = quill.getSelection().index
quill.insertEmbed(length, 'image', '拼接链接地址' + res.hash)
quill.setSelection(length + 1)
} else {
this.$message.error('图片插入失败')
}
},
uploadError() {
this.$message.error('图片插入失败')
},
},
}
css部分
.editor {
line-height: normal !important;
}
.quill-img {
display: none;
}
.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']::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='small']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before {
content: '10px';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='large']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before {
content: '18px';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='huge']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before {
content: '32px';
}
.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: '等宽字体';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-label::before {
content: '行高';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='1']::before {
content: '1';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='1.5']::before {
content: '1.5';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='1.8']::before {
content: '1.8';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='2']::before {
content: '2';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='3']::before {
content: '3';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='4']::before {
content: '4';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='5']::before {
content: '5';
}
.ql-snow .ql-picker.ql-lineheight {
width: 70px;
}
.ql-snow {
.ql-picker.ql-size {
.ql-picker-label[data-value='12px']::before,
.ql-picker-item[data-value='12px']::before {
content: '12px';
}
.ql-picker-label[data-value='14px']::before,
.ql-picker-item[data-value='14px']::before {
content: '14px';
}
.ql-picker-label[data-value='16px']::before,
.ql-picker-item[data-value='16px']::before {
content: '16px';
}
.ql-picker-label[data-value='18px']::before,
.ql-picker-item[data-value='18px']::before {
content: '18px';
}
.ql-picker-label[data-value='20px']::before,
.ql-picker-item[data-value='20px']::before {
content: '20px';
}
.ql-picker-label[data-value='24px']::before,
.ql-picker-item[data-value='24px']::before {
content: '24px';
}
.ql-picker-label[data-value='28px']::before,
.ql-picker-item[data-value='28px']::before {
content: '28px';
}
.ql-picker-label[data-value='36px']::before,
.ql-picker-item[data-value='36px']::before {
content: '36px';
}
.ql-picker-label[data-value='48px']::before,
.ql-picker-item[data-value='48px']::before {
content: '48px';
}
.ql-picker-label[data-value='72px']::before,
.ql-picker-item[data-value='72px']::before {
content: '72px';
}
}
.ql-picker.ql-font {
.ql-picker-label[data-value='SimSun']::before,
.ql-picker-item[data-value='SimSun']::before {
content: '宋体';
font-family: 'SimSun' !important;
}
.ql-picker-label[data-value='SimHei']::before,
.ql-picker-item[data-value='SimHei']::before {
content: '黑体';
font-family: 'SimHei';
}
.ql-picker-label[data-value='Microsoft-YaHei']::before,
.ql-picker-item[data-value='Microsoft-YaHei']::before {
content: '微软雅黑';
font-family: 'Microsoft YaHei';
}
.ql-picker-label[data-value='KaiTi']::before,
.ql-picker-item[data-value='KaiTi']::before {
content: '楷体';
font-family: 'KaiTi' !important;
}
.ql-picker-label[data-value='FangSong']::before,
.ql-picker-item[data-value='FangSong']::before {
content: '仿宋';
font-family: 'FangSong';
}
}
}