仅为文本区域编辑器中下拉菜单中出现的单词设置不同的颜色(angular)

Setting a different color only for words which came out of dropdown in textarea editor(angular)

我做了什么:

我有一个 下拉列表。我还有一个 textarea。我在 textarea 中输入文本,我还从 下拉列表 中选择单词并将其添加到 textarea。这部分我已经完成了。

问题:

现在我想区分来自 下拉菜单 的单词。所以我想用红色单独显示那些特定的词。通过 dropdown 输入的任何单词或与任何 dropdown 值相同的手动输入的任何单词都应显示在 中红色 颜色。这就是我想要做的。我搜索了 Whosebug,但我可以找到任何解决方案。知道的请帮忙

代码:

我的HTML:

<textarea #text [(ngModel)]='textValue' rows="10" cols="70">
</textarea>
<div>
  <mat-form-field class="input-style">
    <label>Dropdown</label>

    <mat-select (change)="changeValue($event)">
      <mat-option *ngFor="let li of list4" [value]="li">
        {{li}}
      </mat-option>
    </mat-select>
  </mat-form-field>
</div>

我的TS:

  changeValue(ev) {
        this.textValue += ` ${ev.value}`;
      }

我附上了我的 stackblitz link: https://stackblitz.com/edit/angular-mat-form-field-tfw6de?file=app%2Fform-field-prefix-suffix-example.ts

您无法更改 <textarea> 中单词的颜色,但可以使用 contenteditable 属性制作 <div><span><p>看起来像 .

在此处查看如何更改可编辑 div 的颜色:

为了让您在 angular 打字稿中编写 jquery 样式,请导入:

import $ from 'jquery';

更新 04-04-2021 请查看 Owen Kevin 在 中的回答,因为我的代码不不要考虑“滚动”

在文本区域内“突出显示”文本的唯一方法是有两层,一层带有文本区域,另一层带有 div 和 [innerHtml]

textarea 的问题是您需要使用与 div

相同的字体系列

来自this codePen.html喜欢

<div class="container" [style.width]="text.getBoundingClientRect().width+'px'"
                      [style.height]="text.getBoundingClientRect().height+'px'">
  <div class="backdrop">
    <div class="highlights" [innerHtml]="textFormatted"></div>
  </div>
  <textarea #text [ngModel]='textValue' (ngModelChange)="change($event)" rows="10" cols="40">
</textarea>
</div>

函数“格式化”

  formatted(message:string)
  {
    return message.replace(/\n/g, "<br />").replace(this.regExpr,"<mark>$&</mark>")
  }

用所选词中的“标记”替换消息

  regExpr=new RegExp(this.list4.map(x=>'('+x+')').join('|'),"g");

记得每次更改文本区域时调用 this.formatted

  changeValue(ev) {
    this.textValue += ` ${ev.value}`;
    this.textFormatted=this.formatted(this.textValue);
  }
  change(message:string)
  {
    this.textValue = message;
    this.textFormatted=this.formatted(this.textValue);

  }

而且,看! .css 更改标记应该在 styles.css

stackblitz

Update 如果我们想变成斜体是我们需要透明的文本区域颜色和彩色的“高光”。这使光标“松散”。

.highlights {
    ...
    color: #444;
}
textarea {
  ....
  color: transparent;
}

我们可以使用 -webkit-text-fill-color,但它不是标准 css(适用于 FireFox、Chrome 和 Edge)

@supports (-webkit-text-stroke: 1px black) {
  textarea {
    color:#444;
    -webkit-text-stroke: 1px transparent;
    -webkit-text-fill-color: transparent;
  }
}

modiffied stackblitz