textarea模拟高亮关键字

位置: 首页 > 代码集锦
[发布: 2026.7.6  作者: 马黑  阅读: 24]
<style>
    .tMid { text-align: center; }
    .hlight { background: tan; }
    /* 编辑区域容器 */
    .wrap {
        width: 600px;
        height: 460px;
        box-sizing: border-box;
        padding: 0;
        margin: 20px auto 0;
        position: relative;
    }
    /* 编辑区域内 pre 和 textarea 核心属性 */
    .edCommon {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        font: normal 18px/24px Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
        background: none;
        white-space: pre-wrap;
        word-break: break-all;
        box-sizing: border-box;
        overflow: auto;
        border: 1px solid gray;
        outline: none;
        resize: none;
        padding: 12px;
        margin: 0;
        transition: 1s;
    }
    /* pre 初始状态 */
    #pre { color: blue; transform: translate(-50%, 0); }
    /* textarea 初始状态 */
    #ta { color: black; transform: translate(50%, 0); }
</style>

<h2 class="tMid">textarea模拟高亮关键字</h2>
<p class="tMid">检验方法:在文本框输入任何文字后选择任意文字,匹配选择文字的字符将以背景高亮的形式呈现。编辑区内两个元素合并、分离状态下均可操作。</p>
<!-- 编辑区 :pre 在前 textarea 在后 -->
<div class="wrap">
    <pre id="pre" class="edCommon">pre</pre>
    <textarea id="ta" class="edCommon" placeholder="请输入 ..."></textarea>
</div>
<p class="tMid"><button onclick="separateElms(this)">合并</button></p>

<script>
    let keyword = ''; // 查找关键词

    // 辅助演示 :两个元素的 分离/叠加
    function separateElms(btn) {
        if (btn.textContent === '分离') {
            ta.style.transform = 'translate(50%, 0)';
            pre.style.transform = 'translate(-50%, 0)';
            pre.style.color = 'blue';
        } else {
            ta.style.transform = 'translate(0, 0)';
            pre.style.transform = 'translate(0, 0)';
            pre.style.color = 'transparent';
        }
        btn.textContent = btn.textContent === '分离' ? '合并' : '分离';
    }
    
    function syncScroll(e) {
        const targetElm = e.target === pre ? ta : pre;
        targetElm.scrollTop = e.target.scrollTop;
        targetElm.scrollLeft = e.target.scrollLeft;
    }
    
    // 核心函数 :高亮关键词函数
    function hlight() {
        if (!ta.value) {
            pre.innerHTML = '';
            return;
        }
        // 处理 textarea 内容(转义尖括号)
        let code = ta.value.replaceAll('<', '&lt;').replaceAll('>', '&gt;');
        // 若查找关键词存在高亮所有匹配的关键词
        if (keyword) code = code.replaceAll(
            keyword, 
            `<span class="hlight">${keyword}</span>`
        );
        pre.innerHTML = code; // 处理结果呈现在 pre 里
    }
    
    ta.oninput = () => hlight(); // textarea 输入时处理高亮关键字
        
    ta.onscroll = (e) => syncScroll(e); // 滚动同步
    
    pre.onscroll = (e) => syncScroll(e); // 滚动同步
    
    // 编辑框选择事件
    ta.onmouseup = () => {
        const start = ta.selectionStart;
        const end = ta.selectionEnd;
        if (start === end) return;
        keyword = ta.value.substring(start, end);
        if (keyword) hlight(); // 有关键词高亮显示
    };
</script>

前一篇: JS节流通用版
下一篇: 没有了

发表评论:

  
 

评论列表 [0条]

Copyright © 2023 All Right Reserved 马黑PHP文章管理整站系统v1.8
联系我们: gxblk@163.com