马黑黑 发表于 2026-5-27 21:35

Mahei TextArea文档

<style>
    .artBox { margin: 20px auto; font: normal 18px/26px sans-serif; }
    .artBox mark { padding: 2px 6px; background: #ccc; }
</style>

<div class="artBox">
    <p>Mahei TextArea(下面简称 mhta)是一款基于 h5 textarea 控件的 Web 编辑器,集成行号、当前行行号高亮、智能缩进、行移动、键盘成对符号自动完成、编辑器状态保存、效果预览等功能于一身,源码体积在10KB上下,无第三方依赖。</p>
    <h2>一、CSS和HTML</h2>
    <p>以下是简洁而基础的配套CSS设置和HTML代码结构:</p>
    <div class="codebox" data-prev="1">
&lt;style&gt;
    .ed-container { --xx: 60px; width: 1000px; height: 480px; border: 2px solid silver; background:linear-gradient(to right,#eee 59px,#aaa 60px,#fff 0); margin: 20px auto; position: relative;}
    .ed-container:hover { border-color: gray; }
    .editor { position: absolute; left: var(--xx); width: calc(100% - var(--xx)); height: 100%; box-sizing: border-box; padding: 10px; font-size: 16px; border: none; outline: none; resize: none; }
    .lnum { position: relative; margin: 0; padding: 0; color: #999; visibility: hidden; }
    .lnum:hover::before { color: red; }
    .lnum::before { position: absolute; content: attr(data-num); left: -5px; top: 0; width: calc(var(--xx) - 10px); height: 100%; text-align: right; cursor: pointer; padding: 0; box-sizing: border-box; visibility: visible; }
    .hlight { color: red; }
    .tMid { text-align: center; }
&lt;/style&gt;

&lt;div class="ed-container"&gt;
    &lt;textarea class="editor" placeholder="输入代码 ..."&gt;&lt;/textarea&gt;
&lt;/div&gt;
&lt;div class="tMid"&gt;&lt;button id="btnPre" type="button"&gt;预览效果&lt;/button&gt;&lt;/div&gt;
        </div>
        <p>CSS中,.lnum 选择器是行号 p 标签样式,.hlight 选择器是行号高亮样式,.tMid 选择器规范文本居中(可选);--xx 变量很重要,它是行号区域宽度、编辑器右移距离的重要设置。HTML结构非常简单:一个父元素包裹一个textarea标签,外加一个预览按钮。</p>
        <h2>二、脚本引入与应用</h2>
        <p>mhta 封装一个名为 TA 的对象,实例化之即可使用,实例化时需要一个参数:textarea 控件DOM实体。例如,依据上面CSS+HTML代码示例,可以这样操作:</p>
        <div class="codebox">
&lt;!-- 引入 mhta.js --&gt;
&lt;script charset="utf-8" src="mhta.js"&gt;&lt;/script&gt;

&lt;script&gt;
    const editor = document.querySelector('.editor');
    const ta = new TA(editor); // 实例化TA对象
    btnPrev.onclick = () =&gt; ta.preView(); // 预览
&lt;/script&gt;
    </div>
    <h2>三、实例</h2>
    <p>将上述一、二的代码示例进行整合,便可真正运行 mhta 编辑器(注意 maha.js 的地址真实可用):</p>
    <div class="codebox" data-prev="1">
&lt;style&gt;
    .ed-container { --xx: 60px; width: 1000px; height: 480px; border: 2px solid silver; background:linear-gradient(to right,#eee 59px,#aaa 60px,#fff 0); margin: 20px auto; position: relative;}
    .ed-container:hover { border-color: gray; }
    .editor { position: absolute; left: var(--xx); width: calc(100% - var(--xx)); height: 100%; box-sizing: border-box; padding: 10px; font-size: 16px; border: none; outline: none; resize: none; }
    .lnum { position: relative; margin: 0; padding: 0; color: #999; visibility: hidden; }
    .lnum:hover::before { color: red; }
    .lnum::before { position: absolute; content: attr(data-num); left: -5px; top: 0; width: calc(var(--xx) - 10px); height: 100%; text-align: right; cursor: pointer; padding: 0; box-sizing: border-box; visibility: visible; }
    .hlight { color: red; }
    .tMid { text-align: center; }
&lt;/style&gt;

&lt;div class="ed-container"&gt;
    &lt;textarea class="editor" placeholder="输入代码 ..."&gt;&lt;/textarea&gt;
&lt;/div&gt;
&lt;div class="tMid"&gt;&lt;button id="btnPre" type="button"&gt;预览效果&lt;/button&gt;&lt;/div&gt;

&lt;!-- 引入 mhta.js --&gt;
&lt;script charset="utf-8" src="https://638183.freep.cn/638183/web/js/mhta.js"&gt;&lt;/script&gt;

&lt;script&gt;
    const editor = document.querySelector('.editor');
    const ta = new TA(editor); // 实例化TA对象
    btnPre.onclick = () =&gt; ta.preView(); // 预览
&lt;/script&gt;
    </div>
    <h2>四、编辑器的使用</h2>
    <ul>
      <li>行号与行号高亮
            <ol>
                <li>行号 :自动生成,编辑框里有内容,其右侧就有行号;</li>
                <li>高亮 :当前行行号高亮;</li>
                <li>点击:点击行号,选中编辑框对应行。点击或选中编辑框任意行,对应行号高亮;</li>
            </ol>
      </li>
      <li>智能缩进
            <ol>
                <li>回车 :继承上一行的缩进距离。有选中文本时,选中的文本会被删除;</li>
                <li>Tab :缩进四个自然空格。有选中文本时,选中文本所有行增加四个自然空格;</li>
                <li>退格键 :若输入光标前面有四个或以上空格,删除四个空格,若不足四个空格保持退格键自然行为;</li>
            </ol>
      </li>
      <li>自动完成 :输入键盘上的 <mark>`{[('"</mark> 等成对符号,会自动补齐其右侧符号,若有选中文本,左侧符号和后侧符号将其包裹;</li>
      <li>行移动 :编辑器里的行可以上下移动,支持多行操作。方法:点击任意行或选中多行后,按 <mark>alt+↑/↓</mark> 组合键;</li>
      <li>保存编辑状态 :预览、刷新页面和关闭页面均自动触发编辑器内容的自动保存,下次相同浏览器打开相同页面自动加载;</li>
      <li>预览编辑器内容 :TA 对象提供一个预览指令,<mark>preView()</mark>,需要自设触发按钮(详情参阅示例代码)。预览页面以 _blank 方式加载;</li>
      <li>集成到自己的项目 :给 textarea 标签提供 form 父元素即可,注意 textarea 需要一个 name 属性名称以便 submit 时正确提交数据;</li>
      <li>其它 :编辑器理论上支持无限多的文本,但从性能和外观考虑,代码行数在1000行左右较为合适。</li>
    </ul>
</div>

<script type="module">
    import linenumber from 'https://638183.freep.cn/638183/web/helight/linenumber.js';
    linenumber();
</script>

马黑黑 发表于 2026-5-27 21:37

生产环境演示地址:

      简易编辑器

红影 发表于 2026-5-27 22:29

祝贺黑黑完成的Web 编辑器 Mahei TextArea ,非常简洁实用。很赞{:4_187:}

马黑黑 发表于 2026-5-27 22:31

红影 发表于 2026-5-27 22:29
祝贺黑黑完成的Web 编辑器 Mahei TextArea ,非常简洁实用。很赞

这个,据我所知,开源项目中也有一个叫 textareajs 的,不过实现思路不尽相同,功能也不尽一样

杨帆 发表于 2026-5-28 15:44

很方便,集成了实用功能,恭喜马老师再出新品{:4_180:}

马黑黑 发表于 2026-5-28 20:30

杨帆 发表于 2026-5-28 15:44
很方便,集成了实用功能,恭喜马老师再出新品

{:4_190:}
页: [1]
查看完整版本: Mahei TextArea文档