Содержание
В конце июня вышел Firefox 140 и теперь CSS Custom Highlight API стал доступен во всех браузерах.
Что это такое?
Иногда нам нужно что-то выделить визуально в тексте. Например, подсветить ошибку или раскрасить выделенный пользователем текст.
В этом нам могли помочь псевдоэлементы ::selection, ::inactive-selection, ::spelling-error и ::grammar-error.
Если задача была посложней — например, подсветка синтаксиса в коде либо визуализация кастомных ошибок — то приходилось оборачивать нужные фрагменты текста в span’ы и добавлять им соответствующие CSS-классы.
Это могло быть не очень удобным, плюс могло аффектить перформанс страницы.
Чтобы решить эту проблему был придуман CSS Custom Highlight API, который позволяет стилизовать фрагменты текста без оборачивания их в дополнительные элементы.
Как с ним работать?
Для начала нужно создать объект Range, который будет хранить информацию о выделенном тексте:
const text = document.getElementById('text');
const range = new Range();
// указываем начало выделяемого текста
range.setStart(text, 10);
// указываем конец выделяемого текста
range.setEnd(text, 20);
Далее создаём объект Highlight. Он представляет коллекцию наших рэнжей — обращаясь к хайлайту, мы сможем разом раскрасить все рэнжи:
// в примере передаём один рэнж,
// но можно передать сколько угодно range объектов через запятую
const highlight = new Highlight(range);
Регистрируем хайлайт:
CSS.highlights.set('my-highlight', highlight);
И, напоследок, стилизуем:
::highlight(my-highlight) {
background-color: pink;
color: black;
}
Где использовать?
Custom Highlight API может пригодиться для:
- реализации поиска текста на странице — например, как тут;
- подсветки кастомных ошибок в тексте, если вы делаете что-то наподобие Grammarly;
- подсветки синтаксиса кода — Брамус написал подробную статью о том, как подружить Prism и Custom Highlight API, а Андре Руфферт на её основе собрал веб-компонент для подсветки синтаксиса.