前端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,不允许用户调整输入框大小,有相关需求的可以看下掘金文章,有相应方案和思路。

相关推荐
镜宇秋霖丶4 小时前
2026.5.6@霖宇博客制作中遇见的问题
前端·javascript·vue.js
计算机专业码农一枚4 小时前
微信小程序 uniapp+vue高校社团管理
vue.js·微信小程序·uni-app
小李子呢02115 小时前
前端八股Vue---Vue-router路由管理器
前端·javascript·vue.js
百锦再6 小时前
Auto.js变成基础知识学习
开发语言·javascript·学习·sqlite·kotlin·android studio·数据库开发
KuaCpp6 小时前
C++新特性学习
c++·学习
洛_尘7 小时前
Python 5:使用库
java·前端·python
Bigger7 小时前
Bun 能上生产吗?我的实战结论
前端·node.js·bun
kyriewen8 小时前
你的前端滤镜慢得像PPT?用Rust+WebAssembly,一秒处理4K图
前端·rust·webassembly
kyriewen118 小时前
你等的Babel编译,够喝三杯咖啡了——用Rust重写的SWC,只需眨个眼
开发语言·前端·javascript·后端·性能优化·rust·前端框架
IT_陈寒9 小时前
SpringBoot自动配置坑了我,原来要这样绕过去
前端·人工智能·后端