前端vue+el-input实现输入框中文字高亮标红效果(学习自掘金博主文章)

学习自掘金文章https://juejin.cn/post/7295169886177918985

该博主的代码基于原生textarea控件和js实现,基于该博主的代码和思路,在vue下实现了相应功能

思路

生成html字符串来实现文字高亮标红效果,但是input输入控件不能渲染html字符串,那就用div来渲染html字符串,将输入框的背景和文字设置为透明,层级设置在div上面,这样用户输入时操作的是输入框,渲染时用的是下面的div。

代码

html 复制代码
 <div class="main">
            <div
              class="highlight-div"
              v-html="highlightBracketContent(inputData)"
            ></div>
            <el-input
              class="highlight-input"
              v-model="inputData"
              type="textarea"
              :autosize="{ minRows: 6 }"
              resize="none"
            ></el-input>
          </div>

我的项目中需求是把括号内的内容标红

js 复制代码
methods: {
    /** 生成中英文括号内标红的html字符串 */
    highlightBracketContent(inputText) {
	      // 匹配中英文括号内的内容(包括中文括号和英文括号)
	      const regex = /([((])(.*?)([))])/g;

      // 使用正则替换匹配到的文本,并加上红色标记
      const result = inputText.replace(
        regex,
        function (match, openBracket, content, closeBracket) {
          // openBracket 是左括号,content 是括号内的内容,closeBracket 是右括号
          if (content.includes("该数据内容仅供参考")) {
            return `${openBracket}<span style="color: red;">${content}</span>${closeBracket}`;
          } else {
            return `${openBracket}<span>${content}</span>${closeBracket}`;
          }
        }
      );
      return result;
    },

样式要注意设置el-textarea样式和div的样式保持一致,不然光标位置有问题

css 复制代码
.main {
  position: relative;
}
.highlight-div {
  position: absolute;
  top: 1px;
  left: 1px;
  height: 100%;
  box-sizing: border-box;
  font-size: 14px;
  word-break: break-all;
  white-space: pre-wrap;
  padding: 5px 15px;
  line-height: 1.5;
  color: #909399;
}
::v-deep .highlight-input {
  position: relative;
  width: 100%;
  box-sizing: border-box;
  font-size: 12px;
  background: rgba(0, 0, 0, 0);
  -webkit-text-fill-color: transparent;
  z-index: 999;
  word-break: break-all;
  .el-textarea__inner {
    -webkit-text-fill-color: transparent;
    background: rgba(0, 0, 0, 0);
    font-size: 14px;
    line-height: 1.5;
    color: #fff;
  }
}

我未处理输入框内容过多时滚动和调整输入框大小时的div,因为我直接设置输入框autosize自动调整大小,并且关闭了resize,不允许用户调整输入框大小,有相关需求的可以看下掘金文章,有相应方案和思路。

相关推荐
qetfw13 分钟前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
甲维斯14 分钟前
我要开始吹牛逼了!Kimi K3 “宇宙无敌”!
前端·人工智能
a11177621 分钟前
微光小屋-前端养成小游戏 开源项目
前端
kyriewen34 分钟前
我让AI给前端项目做了一次完整的Code Review——它和人类的差距,比我想的大得多
前端·javascript·ai编程
张鑫旭34 分钟前
快速过下我2026年上半年的前端学了些啥
前端
এ慕ོ冬℘゜1 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
hoLzwEge1 小时前
拯救低效调试!code-inspector-plugin 让代码定位如虎添翼
前端·前端框架·node.js
J船长1 小时前
烂笔头扫盲:LLM Eval 入门:从「感觉挺好」到「数据说话」的工程化落地
前端
skiyee2 小时前
被多个 UView 系 UI 库 “抄” 的 @uni-ku/root 究竟怎么实现?
前端