UEditor使用总结

前言

UEditor的bug太多了,为了避免大家浪费时间,把自己这几天在扩展UEditor功能时遇到的问题总结一下,希望能帮到大家 ,我是在vue框架中使用的UEditor插件,可能你在其他前端框架中使用,具体代码可能有一点点不同,但实现逻辑一样。我在做这些功能时主要参考了这几个也基于UEditor扩展的编辑器:135编辑器96编辑器

PM提的各种需求如下:

UEditor图片等比缩放

UEditor中的所有图片都是按原图的比例等比缩放

UEditor作者已经在github上提供了具体解决方法:
具体修改在ueditor.all.js 16995行(大致位置大家自己找吧) 或者 在ueditor.all.js搜索 updateTargetElement 这个方法名也行

updateTargetElement: function () {
var me = this;
var newWidth = parseInt(me.resizer.style.width);
// var newHeight = parseInt(me.resizer.style.height);
var oldHeight = parseInt(me.target.naturalHeight);
var oldWidth = parseInt(me.target.naturalWidth);
var c =(oldHeight*newWidth)/oldWidth;
domUtils.setStyles(me.target, {
'width': me.resizer.style.width,
'height': c+'px'
});
// var scale = parseInt(me.target.height)/parseInt(me.target.width);
// me.target.width = parseInt(me.resizer.style.width);
// me.target.height = parseInt(me.target.width)*scale;
// me.target.width = parseInt(me.resizer.style.width);
// me.target.height = parseInt(me.resizer.style.height);
me.attachTo(me.target);
}

链接如下:https://github.com/fex-team/ueditor/pull/2257

UEditor换图操作

要求换的图片替换当前图片,并且大小尺寸一样

这个需求我参考 135编辑器 偷了个懒,直接把图片操作浮层上的修改按钮改成换图。因为UEditor提供的修改图片功能就是替换一下图片,宽高没变。
具体操作就是在zh-cn.js文件里,搜索'modify':‘修改’,换成'modify':'换图' 就好了!

UEditor工具栏新增下拉框,实现两端缩进和字间距功能

两端缩进功能是在段落标签上加上padding-left,padding-right样式,选项为(0-3em)
字间距功能是在段落标签上加上letter-spacing,选项为(0-3px)

具体实现:

<template>
  <div class="UE-editor-wrapper">
    <script id="editor" type="text/plain"></script>
  </div>
</template>

<script>
  export default {
    name: 'UE',
    data () {
      return {
        editor: null
      }
    },
    mounted () {
      const _this = this
      this.editor = window.UE.getEditor('editor', this.config) // 初始化UE
      this.editor.addListener('ready', function () {}
    },
    methods: {
      //设置两端缩进
      setJustify () {
        let objItems = [{id: 0, name: '默认'}, {id: 1, name: '1em'}, {id: 2, name: '2em'}, {id: 3, name: '3em'}]
        window.UE.registerUI('justifyjustifycenter', function (editor, uiName) {
          editor.registerCommand(uiName, {
            execCommand: function (cmdName, item) {
              this.execCommand('paragraph', 'p', {style: 'padding-left: ' + item.value + 'em; padding-right: ' + item.value + 'em'})
              return true
            }
          })
          let items = []
          for (var i = 0; i < objItems.length; i++) {
            var item = objItems[i]
            items.push({
              label: item['name'],
              value: item['id']
            })
          }
          let combox = new window.UE.ui.Combox({
            editor: editor,
            items: items,
            onselect: function (t, index) {
              editor.execCommand(uiName, this.items[index])
            },
            title: '两端缩进',
            initValue: '两端缩进'
          })
          return combox
        }, [42])  // [42]控制下拉框在工具栏的位置
      },
      // 设置字间距
      setLetterSpacing () {
        let objItems = [{id: 0, name: '默认'}, {id: 1, name: '1px'}, {id: 2, name: '2px'}, {id: 3, name: '3px'}]
        window.UE.registerUI('replacekey', function (editor, uiName) {
          editor.registerCommand(uiName, {
            execCommand: function (cmdName, item) {
              this.execCommand('paragraph', 'p', {style: 'letter-spacing:' + item.value + 'px'})
              return true
            }
          })
          var items = []
          for (var i = 0; i < objItems.length; i++) {
            var item = objItems[i]
            items.push({
              label: item['name'],
              value: item['id']
            })
          }
          var combox = new window.UE.ui.Combox({
            editor: editor,
            items: items,
            onselect: function (t, index) {
              editor.execCommand(uiName, this.items[index])
            },
            title: '字间距',
            initValue: '字间距'
          })
          return combox
        }, [33]) // [33]控制下拉框在工具栏的位置
      }
    },
    created () {
      // 设置两端缩进
      this.setJustify()
      // 设置字间距
      this.setLetterSpacing()
    }
  }
</script>

结果展示


字间距和两端缩进

UEditor工具栏新增按钮

我没有这个需求,但实现方法不难,参考一下这个吧。https://blog.csdn.net/zzq900503/article/details/77050823

UEditor引用样式修改

类似于简书这样的引用样式

实现方法:
在/themes/iframe.css 这个文件下面加上

.view .view blockquote {  /*加上.view .view是因为防止污染全局的blockquote样式*/
  padding: 12px 20px;
  background-color: #f2f2f2;
  border-left: 6px solid #b3b3b3;
  font-size: 16px;
  font-weight: 400;
  line-height: 26px;
  margin: 0 0 20px;
}

UEditor增加字体选项

字体选项新增:(Optima-Regular, PingFangTC-light)、Zapfino、Futura-Medium、MarkerFelt-Thin、Cochin-BoldItalic、CourierNewPS-ItalicMT

实现方法:
修改三个文件:ueditor.config.js、zh-cn.js、en.js。搜索fontfamily,在fontfamily处添加需要的字体类型即可。参考:https://blog.csdn.net/shiwodecuo/article/details/51644186

UEditor图片伸缩框位置bug

这个问题是我设置config:{autoHeightEnabled: false}出现滚动条时,图片选中时的伸缩框位置定位不对,我也不太清楚为什么。可能是我使用的版本有问题,问题见下图:

图片伸缩框位置不对

这个问题我没看出问题出在什么地方了,但是通过css设置解决了。
具体实现:

  1. 第一步,设置config:{autoHeightEnabled: true}。

这样编辑框就能无限延长,定位问题就解决了,但是项目中编辑器一定是有定高的,所以我们要给整个编辑器外面加个class="edit-wrapper"的盒子:类似于

<div class="edit-area" ref="editArea">
  <div class="edit-area-box"></div> <!--这个垫片对工具栏固定定位有用,后面会说-->
  <div class="edit-wrapper">
    <editor :defaultMsg="profileValue" :config="config" @openImgUpload="openImgUpload" ref="ue"></editor>
  </div>
</div>

设置

.edit-area {
  width: 100%;
  height: 100%;
  overflow: auto;
}

这时,图片伸缩框可以正常定位了,但是出现滚动条时,工具栏也跟着滚动了


工具栏不能固定
  1. 第二步,固定工具栏
    具体参靠以下代码:
```.edit-area-box {  /*工具栏的空盒子垫片,高度就是工具栏的高度,自己量~*/
        width: 100%;
        height: 110px;
      }
      .edit-area {  /*编辑器的高度*/
        width: 100%;
        height: calc(100% - 110px);
        overflow: auto;
      }
      /deep/ .edui-editor-toolbarbox {  /*编辑器工具栏固定定位,脱离文档流,位置自己调,记得设置宽度*/
        position: fixed !important;
        top: 20px !important;
        width: 500px !important;
      }
      /deep/ .UE-editor-wrapper {
        height: 100%;
        overflow: auto;
      }
      /*这个也很重要,不知道是不是工具栏脱离文档流时引起的bug,就是出现滚动条时,输入文字时,编辑区域顶部出现一段空白,我看了一下是个有高度的空盒子,估计是作者在出现滚动条时,计算了一下工具栏的高度,而我们的工具栏已经脱离文档流了,所以把这个空盒子的高度设置为auto就好了*/
      /deep/ .edui-editor { 
        &.edui-default {
          & > :first-child {
            height: auto !important;
          }
        }
      }
    }
  1. 第三步,到这时基本大功告成,但还有一个小问题,就是出现滚动条时,编辑内容,编辑区域跳动,然后就有下面这种情况了:


    image.png

    继续改进!找到/themes/iframe.css ,加上

.view body.view {  /*把编辑区域的iframe窗口的body的默认margin:8px,*/
  margin: 0 8px;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,728评论 1 92
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,033评论 4 62
  • 1.新建一个文本文件,取名delete-svn-folders.txt,注意每一行前面不要留空格 2.将下列代码粘...
    怪兽123阅读 548评论 0 3
  • 本文应该会持续更新, 上次更新 : 20170309 18:58:34 最近更新 20170315 10:33:...
    travin阅读 1,519评论 0 3
  • 图片在后面,打开才有哦! 多肉植物 步骤 这是很久之前画的,应该说是大学的时候,现在已经毕业啦!哈哈 希望我的梦...
    Lying颖英阅读 234评论 2 5