这个编辑器将采用分栏布局,左侧是 Markdown 实时预览区,右侧是编辑区,这符合大多数现代 Markdown 编辑器的使用习惯。

markdown编辑器网页端源码
(图片来源网络,侵删)

功能特点

  • 实时预览: 在左侧编辑区输入 Markdown,右侧会实时渲染成 HTML。
  • 分栏布局: 使用 Flexbox 布局,编辑区和预览区可以自由调整大小。
  • 代码高亮: 使用 highlight.js 库,支持多种编程语言的语法高亮。
  • 响应式设计: 在小屏幕设备上,编辑区和预览区会自动切换为上下布局。
  • 简洁美观: 使用原生 CSS,不依赖 UI 框架,代码轻量且易于理解和修改。

第一步:创建项目文件

创建一个项目文件夹,markdown-editor,并在其中创建以下三个文件:

  1. index.html (网页结构)
  2. style.css (样式表)
  3. script.js (JavaScript 逻辑)

第二步:编写 HTML 代码 (index.html)

这个文件定义了编辑器的基本结构,包括一个标题、一个可拖动的分隔栏,以及两个主要的内容区域(编辑区和预览区)。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">Markdown 编辑器</title>
    <link rel="stylesheet" href="style.css">
    <!-- 引入 highlight.js 的 CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
</head>
<body>
    <header>
        <h1>Markdown 实时预览编辑器</h1>
    </header>
    <main class="editor-container">
        <!-- 可拖动的分隔栏 -->
        <div class="resizer" id="resizer"></div>
        <!-- Markdown 编辑区 -->
        <section class="editor" id="editor">
            <textarea id="markdown-input" placeholder="在这里输入 Markdown..."># 欢迎使用 Markdown 编辑器
这是一个功能简单的实时预览编辑器。
## 功能特点
*   实时预览
*   代码高亮
*   响应式布局
### 代码示例
你可以在这里写代码,并实现语法高亮:
```javascript
function hello(name) {
    console.log(`Hello, ${name}!`);
}
hello("World");

引用

这是引用的内容,你可以用它来强调某段文字。


加粗斜体 也是支持的。

markdown编辑器网页端源码
(图片来源网络,侵删)

祝您使用愉快!

    <!-- HTML 预览区 -->
    <section class="preview" id="preview">
        <!-- 预览内容将在这里渲染 -->
    </section>
</main>
<!-- 引入 marked.js 用于解析 Markdown -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<!-- 引入 highlight.js 用于代码高亮 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<!-- 引入 marked 的 highlight.js 插件 -->
<script src="https://cdn.jsdelivr.net/npm/marked-highlight/lib/index.umd.min.js"></script>
<!-- 引入自定义的 JavaScript -->
<script src="script.js"></script>
```

第三步:编写 CSS 代码 (style.css)

这个文件负责编辑器的所有样式,包括布局、颜色、字体和分隔栏的拖动效果。

/* 全局样式和基础设置 */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
    background-color: #f4f7f6;
    color: #333;
    line-height: 1.6;
}
header {
    background-color: #2c3e50;
    color: white;
    padding: 1rem;
    text-align: center;
    box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
h1 {
    font-size: 1.8rem;
    font-weight: 500;
}
/* 编辑器容器 */
.editor-container {
    display: flex;
    height: calc(100vh - 60px); /* 减去 header 的高度 */
    position: relative;
}
/* 编辑区和预览区通用样式 */
.editor, .preview {
    padding: 2rem;
    overflow-y: auto;
    flex: 1; /* 默认各占一半空间 */
}
.editor {
    background-color: #fdfbfb;
    border-right: 1px solid #ddd;
}
#markdown-input {
    width: 100%;
    height: 100%;
    border: none;
    outline: none;
    font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
    font-size: 14px;
    resize: none;
    background-color: transparent;
}
/* 预览区样式 */
.preview {
    background-color: #ffffff;
    padding: 2rem;
}
.preview h1, .preview h2, .preview h3 {
    margin-top: 1.5rem;
    margin-bottom: 0.5rem;
    color: #2c3e50;
}
.preview h1 { font-size: 2em; }
.preview h2 { font-size: 1.5em; border-bottom: 1px solid #eaecef; padding-bottom: 0.3rem; }
.preview h3 { font-size: 1.25em; }
.preview p {
    margin-bottom: 1rem;
}
.preview ul, .preview ol {
    margin-bottom: 1rem;
    padding-left: 2rem;
}
.preview blockquote {
    margin: 1rem 0;
    padding: 0 1rem;
    color: #6a737d;
    border-left: 0.25em solid #dfe2e5;
}
.preview code {
    font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
    background-color: #f6f8fa;
    padding: 0.2rem 0.4rem;
    border-radius: 3px;
    font-size: 0.9em;
}
.preview pre {
    background-color: #282c34;
    padding: 1rem;
    border-radius: 6px;
    overflow-x: auto;
}
.preview pre code {
    background-color: transparent;
    padding: 0;
    color: #abb2bf; /* 代码高亮的默认颜色 */
}
.preview strong {
    font-weight: bold;
}
.preview em {
    font-style: italic;
}
/* 分隔栏样式 */
.resizer {
    width: 4px;
    background-color: #ccc;
    cursor: col-resize;
    position: relative;
    transition: background-color 0.2s;
}
.resizer:hover {
    background-color: #999;
}
/* 响应式布局 */
@media (max-width: 768px) {
    .editor-container {
        flex-direction: column;
    }
    .editor {
        border-right: none;
        border-bottom: 1px solid #ddd;
        height: 50vh; /* 移动端各占一半高度 */
    }
    .preview {
        height: 50vh; /* 移动端各占一半高度 */
    }
    .resizer {
        width: 100%;
        height: 4px;
        cursor: row-resize;
    }
}

第四步:编写 JavaScript 代码 (script.js)

这是编辑器的核心逻辑,它负责:

  1. 初始化 markedhighlight.js
  2. 监听编辑区的输入事件。
  3. 将 Markdown 文本转换为 HTML。
  4. 将转换后的 HTML 渲染到预览区。
  5. 实现分隔栏的拖动功能。
document.addEventListener('DOMContentLoaded', () => {
    // --- 1. 初始化 marked 和 highlight.js ---
    // 配置 marked,使用 highlight.js 插件进行代码高亮
    marked.setOptions({
        highlight: function(code, lang) {
            if (lang && hljs.getLanguage(lang)) {
                try {
                    return hljs.highlight(code, { language: lang }).value;
                } catch (err) {}
            }
            // 如果没有指定语言或语言不支持,则返回纯文本
            return hljs.highlightAuto(code).value;
        },
        breaks: true, // 支持 GFM (GitHub Flavored Markdown) 的换行
    });
    // --- 2. 获取 DOM 元素 ---
    const markdownInput = document.getElementById('markdown-input');
    const preview = document.getElementById('preview');
    const resizer = document.getElementById('resizer');
    const editor = document.getElementById('editor');
    const editorContainer = document.querySelector('.editor-container');
    // --- 3. 实时预览功能 ---
    const updatePreview = () => {
        const markdownText = markdownInput.value;
        const htmlContent = marked.parse(markdownText);
        preview.innerHTML = htmlContent;
    };
    // 监听输入事件,实时更新预览
    markdownInput.addEventListener('input', updatePreview);
    // 初始加载时执行一次,显示初始内容
    updatePreview();
    // --- 4. 分隔栏拖动功能 ---
    let isResizing = false;
    resizer.addEventListener('mousedown', (e) => {
        isResizing = true;
        document.body.style.cursor = 'col-resize'; // 更改鼠标样式
        document.body.style.userSelect = 'none'; // 防止拖动时选中文本
        e.preventDefault(); // 防止拖动时选中文本
    });
    document.addEventListener('mousemove', (e) => {
        if (!isResizing) return;
        // 计算新的宽度
        const containerWidth = editorContainer.offsetWidth;
        const newEditorWidth = e.clientX - editorContainer.offsetLeft;
        // 设置最小和最大宽度限制
        const minWidth = 200;
        const maxWidth = containerWidth - 200;
        if (newWidth > minWidth && newWidth < maxWidth) {
            editor.style.flex = `0 0 ${newWidth}px`;
            preview.style.flex = `1 1 ${containerWidth - newWidth}px`;
        }
    });
    document.addEventListener('mouseup', () => {
        isResizing = false;
        document.body.style.cursor = 'default';
        document.body.style.userSelect = '';
    });
});

如何运行

  1. 将以上三段代码分别保存到 index.html, style.css, 和 script.js 文件中。
  2. 确保这三个文件在同一个文件夹 markdown-editor 下。
  3. 用任意现代浏览器(如 Chrome, Firefox, Edge)打开 index.html 文件。

你就可以看到一个功能齐全的 Markdown 编辑器了!

markdown编辑器网页端源码
(图片来源网络,侵删)

代码结构和依赖说明

  • marked.js: 一个功能强大的、速度极快的 Markdown 解析器和编译器,它将 Markdown 字符串转换成 HTML 字符串。
  • highlight.js: 一个通用的语法高亮库,它能够识别多种编程语言,并将其源代码渲染成带有颜色和样式的 HTML。
  • marked-highlight: 这是 marked.js 的一个官方插件,用于将 highlight.js 集成到 marked 的渲染流程中,实现代码块的自动高亮。
  • CDN 引入: 为了方便,我们通过 CDN (Content Delivery Network) 引入了这些库,这样你就不需要手动下载和配置它们。

扩展建议

这个基础版本已经可以很好地工作,你可以基于此进行扩展:

  1. 增加工具栏: 添加加粗、斜体、标题、列表、链接、代码块等按钮,点击按钮自动在光标位置插入对应的 Markdown 语法。
  2. 保存和加载: 使用 localStorage 将编辑器的内容保存在浏览器中,实现下次打开时自动恢复,或者实现导出为 .md.html 文件的功能。
  3. 切换主题: 增加“日间/夜间”模式切换按钮,修改 CSS 变量来改变整体配色。
  4. 支持更多 Markdown 语法: 如表格、任务列表、数学公式 (KaTeX) 等。