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

相关推荐
Mr -老鬼1 小时前
Rust与Go:从学习到实战的全方位对比
学习·golang·rust
laplace01231 小时前
# 第四章|智能体经典范式构建 —— 学习笔记(详细版)
笔记·学习
程序猿零零漆1 小时前
Spring之旅 - 记录学习 Spring 框架的过程和经验(十四)SpringMVC的请求处理
学习·spring·pandas
别了,李亚普诺夫1 小时前
PCB设计大师篇笔记
笔记·嵌入式硬件·学习
西瓜堆1 小时前
提示词工程学习笔记: IT技术行业提示词推荐
笔记·学习
全栈前端老曹1 小时前
【包管理】npm init 项目名后底层发生了什么的完整逻辑
前端·javascript·npm·node.js·json·包管理·底层原理
HHHHHY1 小时前
mathjs简单实现一个数学计算公式及校验组件
前端·javascript·vue.js
boooooooom1 小时前
Vue3 provide/inject 跨层级通信:最佳实践与避坑指南
前端·vue.js
一颗烂土豆1 小时前
Vue 3 + Three.js 打造轻量级 3D 图表库 —— chart3
前端·vue.js·数据可视化
青莲8431 小时前
Android 动画机制完整详解
android·前端·面试