Как подсветить или изменить стиль некоторых букв в строке

89
01 июля 2021, 17:10

Как сделать подобие подсветки синтаксиса?

На входе есть строка 1235aa2323aa

<span class="input_text" contenteditable="true">1235aa2323aa</span>

На выходе должно получится что-то вроде 1235aa2323aa, где цифры и буквы имеют разные css стили которые применяются при вводе символов.

Answer 1

Такой костыль придумался... поставить поверх вашего элемента прозрачный textarea (input), ровно с теми же размерами и шрифтом, а при вводе текста - обновлять его в span. Проблема в том, что caret-color плохо поддерживается браузерами.

let inp = document.querySelector('.input_text'); 
let invis = document.querySelector('.invis'); 
 
inp.innerHTML = color(inp.innerText); 
 
invis.addEventListener('input', function() { 
  inp.innerHTML = color(this.value); 
  this.style.height = (this.scrollHeight + 2) + 'px'; 
}); 
 
function color(txt) { 
  return txt.replace(/(\d+)/g, '<span class="number">$1</span>') 
}
.input_text { 
  display: inline-block; 
  width: 200px; 
  background-color: #22282b; 
  padding: 5px; 
  box-sizing: border-box; 
  color: #f7ed7e; 
  font-size: 18px; 
  font-family: 'Helvetica'; 
} 
 
.number { 
  color: #ed593c; 
} 
 
.invis { 
  position: absolute; 
  left: 0; 
  width: 200px; 
  padding: 4px; 
  font-size: 18px; 
  font-family: 'Helvetica'; 
  box-sizing: border-box; 
  background-color: transparent; 
  color: transparent; 
  caret-color: #f7ed7e; 
  outline: none; 
  border: 1px solid red; 
  resize: none; 
  overflow: hidden; 
}
<div style="position: relative"> 
  <span class="input_text" spellcheck="false" contenteditable>1235aa2323aa</span> 
  <textarea class="invis" spellcheck="false">1235aa2323aa</textarea> 
</div>

Answer 2

Через replace искать что подсветить и делать обертку с нужными стилями https://jsfiddle.net/1jm2cfqz/

document.querySelector('.input_text').innerHTML = document.querySelector('.input_text').innerHTML.replace(/\d/g, '<b>$&</b>')
Answer 3

Обернул каждый символ в тэг

$(document).ready(function() { 
  $(".my-text").keydown(function(event) { 
    const parElem = $(".my-text") 
    event.preventDefault(); 
    let newEl; 
    const kCode = event.keyCode; 
    if (kCode >= 48 && kCode <= 57) { 
        newEl = `<span class="num">${String.fromCharCode(kCode)}</span>`; 
        } else { 
          newEl =`<span class="str">${String.fromCharCode(kCode)}</span>`; 
        } 
    if(kCode === 8) { 
      $('span').last().remove(); 
    } else { 
      parElem.html(parElem.html() + newEl) 
    } 
     
  }); 
});
.num { 
  color: red; 
} 
.str { 
  color: blue; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<p class="my-text" contenteditable="true"> 
  text 
</p>

Нужно доработать поведение для других keyCode-ов, но вроде-бы работает

READ ALSO
Нету стилей css в php

Нету стилей css в php

http://robloxsellerru/pages/account//account

352
Как передать массив переменных в template? [закрыт]

Как передать массив переменных в template? [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

147
unresolved external symbol в C++ на пустом месте

unresolved external symbol в C++ на пустом месте

В коде не существует ничего под именнем _DXGI_DEBUG_ALL или в чего то в этом духе, существует только DXGI_DEBUG_ALL (без нижнего подчеркивания)При линковке...

145
Build pcre2(10.33) static library for multi-width application

Build pcre2(10.33) static library for multi-width application

Столкнулся с проблемой сборки библиотеки pcre2, с параметром PCRE2_CODE_UNIT_WIDTH 0, для UTF-8, UTF-16, UTF-32, сборка проходит без проблем, однако при сборке для...

174