美文网首页前端之路web学习
纯前端打造一个简易实时预览的markdown编辑器

纯前端打造一个简易实时预览的markdown编辑器

作者: 关爱单身狗成长协会 | 来源:发表于2016-08-07 11:33 被阅读9324次

    先下载https://github.com/chjj/markedhttps://github.com/ajaxorg/ace-builds/插件,还有JQuery也是不可少的
    --在线markdown编辑器参考,https://www.zybuluo.com/mdeditor https://maxiang.io/

    第一步 搭建布局:
    1.构思布局(以下是总体布局)

    总体样式.png

    2.项目下新建个index.html页面,写入以下代码:

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title>markdown编辑器</title>
            <style type="text/css">
                * {
                    margin: 0;
                    padding: 0;
                    outline: none;
                    border-radius: 0;
                }
                
                html,
                body {
                    width: 100%;
                    height: 100%;
                    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
                    background-color: #ebebeb;
                }
                #toolbar {
                    height: 50px;
                    background-color: #444;
                    width: 100%;
                    color: #fff;
                    line-height: 50px;
                }
                #container {
                    overflow: auto;
                    position: absolute;
                    bottom: 0;
                    left: 0;
                    right: 0;
                    top: 50px;
                }
                #editor-column,
                #preview-column {
                    width: 49.5%;
                    height: 100%;
                    overflow: auto;
                    position: relative;
                    background-color: #fff;
                }
                .pull-left {
                    float: left;
                }
                
                .pull-right {
                    float: right;
                }
            </style>
        </head>
    
        <body>
            <div id="toolbar"></div>
            <div id="container">
                <div id="editor-column" class="pull-left">
                    <div id="panel-editor">
                    </div>
                </div>
                <div id="preview-column" class="pull-right">
                    <div id="panel-preview">
                    </div>
                </div>
            </div>
        </body>
    
    </html>
    

    效果预览

    第二步 引入资源实现初步效果:
    1.项目下创建js文件夹
    2.解从下载好的压缩包解marked/lib下的marked.js到js文件夹
    3.解从下载好的压缩包解ace-builds/src到js文件夹重命名为ace
    4.引入js文件
    (注:markdown.css是markdown样式文件,可以自行编写或从网上下载 比如:github-markdown-css)

    <!DOCTYPE html>
    <html> 
        <head>
            <meta charset='UTF-8'>
            <title>markdown编辑器</title>
            <script src="js/jquery-2.1.4.min.js"></script>
            <script src="js/marked.js"></script> 
            <script src="js/ace/ace.js"></script>
                    <link href="markdown.css" rel="stylesheet" />
                    <!--略-->
    

    5初始化插件

    (先添加编辑区和显示区代码)

     <!--略-->
    #mdeditor,#preview,#panel-editor,#panel-preview{
                    height: 100%;
                    width: 100%;
                }
            </style>
        </head>
    
        <body>
            <div id='toolbar'></div>
            <div id='container'>
    <div id='editor-column' class='pull-left'>
                    <div id='panel-editor'>
                                            <!--编辑区-->
                        <div class="editor-content" id="mdeditor" ></div>
    
                    </div> 
                </div>
                <div id='preview-column' class='pull-right'>
                    <div id='panel-preview'>
                                            <!--显示区-->
                        <div id="preview" class="markdown-body"></div>
    
                    </div>
                </div> 
    
     <!--略-->
    

    (先添加初始化代码)

    <!--略-->
    <script>
                var acen_edit = ace.edit('mdeditor'); 
                acen_edit.setTheme('ace/theme/chrome');
                acen_edit.getSession().setMode('ace/mode/markdown');
                acen_edit.renderer.setShowPrintMargin(false);
                $("#mdeditor").keyup(function() {
                    $("#preview").html(marked(acen_edit.getValue()));
                });
            </script>
        </body>
    
    </html>
    
    效果预览

    第三步 添加工具到工具栏示例:

    1.编写公用方法
    (其实点击工具主要是在编辑器里自动插入本来手打的符号)

    function insertText(val){
                    acen_edit.insert(val);//光标位置插入
                }
    
    <div id='toolbar'>
                <button onclick="insertText('**?**')">加粗</button>
                <button onclick="insertText('_?_')">斜体</button>
                <button onclick="insertText('>')">引用</button>
                .....
            </div>
    

    第四步 ace.js API 实现编辑器设置功能:

    <div id='toolbar'>
               <button onclick="insertText('**?**')">加粗</button>
               <button onclick="insertText('_?_')">斜体</button>
               <button onclick="insertText('>')">引用</button>
               .....
               
               设置:
               <select id="theme" size="1">
                   <optgroup label="Bright">
                       <option value="ace/theme/chrome">Chrome</option>
                       <option value="ace/theme/clouds">Clouds</option>
                       <option value="ace/theme/crimson_editor">Crimson Editor</option>
                       <option value="ace/theme/dawn">Dawn</option>
                       <option value="ace/theme/dreamweaver">Dreamweaver</option>
                       <option value="ace/theme/eclipse">Eclipse</option>
                       <option value="ace/theme/github">GitHub</option>
                       <option value="ace/theme/iplastic">IPlastic</option>
                       <option value="ace/theme/solarized_light">Solarized Light</option>
                       <option value="ace/theme/textmate">TextMate</option>
                       <option value="ace/theme/tomorrow">Tomorrow</option>
                       <option value="ace/theme/xcode">XCode</option>
                       <option value="ace/theme/kuroir">Kuroir</option>
                       <option value="ace/theme/katzenmilch">KatzenMilch</option>
                       <option value="ace/theme/sqlserver">SQL Server</option>
                   </optgroup>
                   <optgroup label="Dark">
                       <option value="ace/theme/ambiance">Ambiance</option>
                       <option value="ace/theme/chaos">Chaos</option>
                       <option value="ace/theme/clouds_midnight">Clouds Midnight</option>
                       <option value="ace/theme/cobalt">Cobalt</option>
                       <option value="ace/theme/gruvbox">Gruvbox</option>
                       <option value="ace/theme/idle_fingers">idle Fingers</option>
                       <option value="ace/theme/kr_theme">krTheme</option>
                       <option value="ace/theme/merbivore">Merbivore</option>
                       <option value="ace/theme/merbivore_soft">Merbivore Soft</option>
                       <option value="ace/theme/mono_industrial">Mono Industrial</option>
                       <option value="ace/theme/monokai">Monokai</option>
                       <option value="ace/theme/pastel_on_dark">Pastel on dark</option>
                       <option value="ace/theme/solarized_dark">Solarized Dark</option>
                       <option value="ace/theme/terminal">Terminal</option>
                       <option value="ace/theme/tomorrow_night">Tomorrow Night</option>
                       <option value="ace/theme/tomorrow_night_blue">Tomorrow Night Blue</option>
                       <option value="ace/theme/tomorrow_night_bright">Tomorrow Night Bright</option>
                       <option value="ace/theme/tomorrow_night_eighties">Tomorrow Night 80s</option>
                       <option value="ace/theme/twilight">Twilight</option>
                       <option value="ace/theme/vibrant_ink">Vibrant Ink</option>
                   </optgroup>
               </select>
               字体大小
               <select id="fontsize" size="1">
                   <option value="10px">10px</option>
                   <option value="11px">11px</option>
                   <option value="12px" selected="selected">12px</option>
                   <option value="13px">13px</option>
                   <option value="14px">14px</option>
                   <option value="16px">16px</option>
                   <option value="18px">18px</option>
                   <option value="20px">20px</option>
                   <option value="24px">24px</option>
               </select> 
               代码折行
               <select id="folding" size="1">
                   <option value="manual">manual</option>
                   <option value="markbegin" selected="selected">mark begin</option>
                   <option value="markbeginend">mark begin and end</option>
               </select>
               自动换行
               <select id="soft_wrap" size="1">
                   <option value="off">Off</option>
                   <option value="40">40 Chars</option>
                   <option value="80">80 Chars</option>
                   <option value="free">Free</option>
               </select>
               全选样式<input type="checkbox" name="select_style" id="select_style" checked=""> 
               光标行高光<input type="checkbox" name="highlight_active" id="highlight_active" checked="">
               显示行号<input type="checkbox" id="show_gutter" checked=""> 
               打印边距<input type="checkbox" id="show_print_margin" checked="">
           </div>
    <!---略--->
    ......
               $("#theme").change(function() {
                   acen_edit.setTheme($(this).val());
               })
               $("#fontsize").change(function() {
                   acen_edit.setFontSize($(this).val());
               }) 
               $("#folding").change(function() {
                   session.setFoldStyle($(this).val());
               })
               $("#select_style").change(function() {
                   acen_edit.setOption("selectionStyle", this.checked ? "line" : "text");
               })
               $("#highlight_active").change(function() {
                   acen_edit.setHighlightActiveLine(this.checked);
               })
               $("#soft_wrap").change(function() {
                   acen_edit.setOption("wrap", $(this).val());
               })
               $("#show_print_margin").change(function() {
                       acen_edit.renderer.setShowPrintMargin(this.checked);
               })
    
    效果

    (更多API查看ace.js官网)

    ok!我就说道这里了。感兴趣的小伙伴自行DIY吧!

    相关文章

      网友评论

      • 风雨火_c192:我想找一个可以为django使用的前端Markdown插件,看了你的文章后很有收获,谢谢
      • 来个芒果:感谢,另外方便向您请教一个问题吗?
        为什么我引入js文件以后后台提示失败?但实际上编辑器一切正常,只是后台报错,错误信息如:
        127.0.0.1 - - [23/Sep/2017 19:13:46] "GET /js/jquery-3.2.1.min.js HTTP/1.1" 404 -
        127.0.0.1 - - [23/Sep/2017 19:13:46] "GET /js/marked.js HTTP/1.1" 404 -
        127.0.0.1 - - [23/Sep/2017 19:13:46] "GET /js/ace/ace.js HTTP/1.1" 404 -
        来个芒果:@关爱单身狗成长协会 谢谢,已解决
        关爱单身狗成长协会:404的话 就是 未找到路径呀!你看看 浏览器端有没有 报错,如果浏览器端也报404那就是路径问题,如果浏览器端 没有报错,只是后台报错那我就不知道了:joy:
      • a36a9fcacf12:弄是弄好了,接下来等导出markdown 文本然后还有对样式进行一些修改。。因为想用这个保存一些note比较到数据库。
        a36a9fcacf12:@关爱单身狗成长协会 因为我想用这个打造一个自己的编辑器。把markdown笔记全部放入数据库中,整合以前的笔记,为了确保切换服务器时候的url改变问题,就是图片、文章问题(自己搞一个能看的就行) 用wp或echo遇到这些还有上传图片路径问题(不想改源码 浪费时间)干脆想自己造个轮子。刚好就看到你这篇文章。ace我以前找过但是不想配,当时的欲望没那么强2333.
        关爱单身狗成长协会:@莜_叶 不明觉厉:joy:
        a36a9fcacf12:找到方法了。。 万能的stack
      • Sunny旋律:请问一下,文章末尾说的ace.js官网是个github地址,哪里看api呢。有没有api文档
        关爱单身狗成长协会:顶部 引言处 第二个超链接是github地址,github地址里面提到了的 ,原始地址在https://github.com/ajaxorg/ace
        示例文档在 https://ace.c9.io/
      • Sunny旋律:第五步这里,#mdeditor#preview,样式间缺少了一个逗号,所以其他读者会出现无法编辑的情况,改成以下就可以了
        #mdeditor,#preview,#panel-editor,#panel-preview{
        height: 100%;
        width: 100%;
        }
        关爱单身狗成长协会:哈哈哈,厉害!!
      • 304eb4a4f50b:请问怎么实现两个模块的同步滚动呢
        关爱单身狗成长协会:出现滚动条 是因为 内容宽或高度超过了容器宽高,所以你可以先获取到某个容器与内容之间的顶部距离差,然后设置另外一个容器的相对距离。当然有办法设置滚动条高度也是可以的。当然有的编辑器插件本身就可以获取到滚动条位置或内容位置差。
      • 菩提老鹰:您好,刚开始接触这块,还有些生疏, 能否把你上面的例子共享一下?和三楼一样是不可编辑的
        关爱单身狗成长协会:我估计是 在第二步的 5.初始化插件的代码 你没覆盖修改 我在那边故意留了一段 html代码和css代码片段 可能是 `#panel-editor,#mdeditor {
        width: 100%;
        height: 100%
        }` 样式没加上
      • d6628ab81785:照这么写编辑框无法编辑是什么原因呢
        Revoll:楼主估计删了些逗号之类的吧
        关爱单身狗成长协会:造成无法编辑的情况很多,比如浏览器兼容性,js文件是否正确引入,js代码是否报错,css样式导致编辑区被挡住之类的。有兴趣我推荐你看看[editor.md](https://pandao.github.io/editor.md/examples/index.html),使用起来也方便的呢~
      • 和奇谷朴:有没有 另存为 word的功能
        关爱单身狗成长协会:@和奇谷朴 word没有txt或js倒是有

      本文标题:纯前端打造一个简易实时预览的markdown编辑器

      本文链接:https://www.haomeiwen.com/subject/teklsttx.html