::highlight ๊ฐ€์ƒ ์š”์†Œ์˜ ๋“ฑ์žฅ! CSS Custom Highlight API๋กœ ํ…์ŠคํŠธ ๊ฐ•์กฐ๋ฅผ ํ˜์‹ ํ•˜๋‹ค

2025. 12. 3. 11:29ยทw. Gemini
๊ธฐ์กด์— ์›น์—์„œ ํŠน์ • ํ…์ŠคํŠธ๋ฅผ ๊ฐ•์กฐ(ํ•˜์ด๋ผ์ดํŠธ)ํ•˜๋ ค๋ฉด, ํ•ด๋‹น ํ…์ŠคํŠธ๋ฅผ <span>์ด๋‚˜ <em> ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ๊ณ  ํด๋ž˜์Šค๋ฅผ ๋ถ€์—ฌํ•œ ๋’ค CSS๋ฅผ ์ ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” DOM ๊ตฌ์กฐ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

CSS Custom Highlight API๋Š” DOM์„ ์กฐ์ž‘ํ•˜์ง€ ์•Š๊ณ  ์˜ค์ง Javascript์™€ Css๋งŒ์œผ๋กœ ํ…์ŠคํŠธ ๋ฒ”์œ„์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋Š” ์ƒˆ๋กœ์šด ํ‘œ์ค€์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

 

 

1. ์™œ Custom Highlight API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์žฅ์  ์„ค๋ช…
DOM ๋…๋ฆฝ์„ฑ & ์„ฑ๋Šฅ ํ…์ŠคํŠธ ๊ฐ•์กฐ๋ฅผ ์œ„ํ•ด HTML ํƒœ๊ทธ๋ฅผ ์‚ฝ์ž…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. DOM ์กฐ์ž‘์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๊ณ  ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.
๋ณต์žกํ•œ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…์ŠคํŠธ ๋ฒ”์œ„๋‚˜, DOM ๋…ธ๋“œ๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ๋ฒ”์œ„๋ฅผ ํ•˜๋‚˜์˜ ํ•˜์ด๋ผ์ดํŠธ๋กœ ์‰ฝ๊ฒŒ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: ๋ฌธ๋‹จ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋Š” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐ•์กฐ)
์ ‘๊ทผ์„ฑ (Accessibility) ์‚ฌ์šฉ์ž ์„ ํƒ(::selection)๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋ ˆ์ด์–ด ์œ„์— ์ ์šฉ๋˜๋ฏ€๋กœ, ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์˜ ๋ฐฉํ•ด ์—†์ด ์‹œ๊ฐ์ ์ธ ๊ฐ•์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์‰ฌ์šด ์Šคํƒ€์ผ๋ง ์ „์šฉ ๊ฐ€์ƒ ์š”์†Œ์ธ ::highlight()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CSS๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ์Šคํƒ€์ผ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. Custom Highlight API์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ

์ด API๋Š” ์ฃผ๋กœ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  1. Range ๊ฐ์ฒด (JavaScript):
    • ์—ญํ• : ํ•˜์ด๋ผ์ดํŠธํ•  ํ…์ŠคํŠธ์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. (DOM ๋…ธ๋“œ์™€ ์˜คํ”„์…‹์„ ์ง€์ •)
  2. Highlight ๊ฐ์ฒด (JavaScript):
    • ์—ญํ• : ํ•˜๋‚˜ ์ด์ƒ์˜ Range ๊ฐ์ฒด๋ฅผ ๋‹ด๋Š” ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ํ•˜์ด๋ผ์ดํŠธ ๊ทธ๋ฃน์„ ๋Œ€ํ‘œํ•ฉ๋‹ˆ๋‹ค.
  3. document.body.highlights (JavaScript Map):
    • ์—ญํ• : ๋ธŒ๋ผ์šฐ์ €์— ํ•˜์ด๋ผ์ดํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์ „์—ญ ๋งต์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— Highlight ๊ฐ์ฒด๋ฅผ ์ด๋ฆ„(ํ‚ค)๊ณผ ํ•จ๊ป˜ ๋“ฑ๋กํ•ด์•ผ ๋น„๋กœ์†Œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
  4. ::highlight(custom-name) (CSS):
    • ์—ญํ• : document.body.highlights ๋งต์— ๋“ฑ๋กํ•œ ์ด๋ฆ„์„ ์ฐธ์กฐํ•˜์—ฌ ํ•ด๋‹น ๋ฒ”์œ„์— ์‹ค์ œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

3. ์‹ค์ „ ํ™œ์šฉ ์˜ˆ์ œ: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐ•์กฐ

์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฒ€์ƒ‰์–ด๋ฅผ ํŽ˜์ด์ง€ ์ „์ฒด์—์„œ ์ฐพ์•„ ๊ฐ•์กฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

 

const SEARCH_HIGHLIGHT_NAME = 'search-match';
const searchTerm = 'API'; // ๊ฒ€์ƒ‰์–ด๋ผ๊ณ  ๊ฐ€์ •

/**
 * ํ…์ŠคํŠธ ๋…ธ๋“œ์—์„œ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ฐพ์•„ Range ๊ฐ์ฒด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 */
function findMatches(term) {
  const matches = [];
  const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);
  let node;

  while (node = walker.nextNode()) {
    let index = node.textContent.indexOf(term);
    while (index !== -1) {
      const range = new Range();
      range.setStart(node, index);
      range.setEnd(node, index + term.length);
      matches.push(range);
      index = node.textContent.indexOf(term, index + term.length);
    }
  }
  return matches;
}

// 1. ๊ธฐ์กด ํ•˜์ด๋ผ์ดํŠธ ์ •๋ฆฌ
document.body.highlights.get(SEARCH_HIGHLIGHT_NAME)?.clear();

// 2. ์ƒˆ๋กœ์šด ๋ฒ”์œ„(Range) ์ฐพ๊ธฐ
const ranges = findMatches(searchTerm);

// 3. Highlight ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋“ฑ๋ก (API ์ง€์› ํ™•์ธ ํ•„์š”)
if (window.CSS.highlights) {
  const highlight = new Highlight(...ranges);
  document.body.highlights.set(SEARCH_HIGHLIGHT_NAME, highlight);
}
/* JavaScript์—์„œ ๋“ฑ๋กํ•œ 'search-match' ์ด๋ฆ„์„ ์‚ฌ์šฉ */
::highlight(search-match) {
  background-color: yellow;
  color: black;
  font-weight: bold;
}

 

4. ์›น์‚ฌ์ดํŠธ ํ™œ์šฉ ๋ฐฉ์•ˆ

  • ํ†ตํ•ฉ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐ•์กฐ: ์‚ฌ์ดํŠธ ์ „์ฒด ๊ฒ€์ƒ‰ ์—”์ง„์˜ ๊ฒฐ๊ณผ๋ฅผ DOM ์กฐ์ž‘ ์—†์ด ๋น ๋ฅด๊ฒŒ ํ•˜์ด๋ผ์ดํŠธ.
  • ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ฒฝ๊ณ : ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ์ž˜๋ชป๋œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ(์˜ˆ: ์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ)๋ฅผ ํฌํ•จํ•œ ํ…์ŠคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๊ฐ•์กฐํ•˜์—ฌ ์ˆ˜์ • ํ•„์š”๋ฅผ ์•Œ๋ฆผ.
  • ์ ‘๊ทผ์„ฑ ๊ธฐ๋Šฅ: ์‚ฌ์šฉ์ž๊ฐ€ 'ํ•ต์‹ฌ ์šฉ์–ด ๋ณด๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, ๋ณต์žกํ•œ ๋ณธ๋ฌธ ๋‚ด์˜ ํ•ต์‹ฌ ๋‹จ์–ด(์˜ˆ: ํ•™์ˆ  ์šฉ์–ด)๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ๊ฐ•์กฐํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„.

 

๋ฐ”๋กœ๊ฐ€๊ธฐ ๋งํฌ 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)

'w. Gemini' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Google Labs 'Learn' ์นดํ…Œ๊ณ ๋ฆฌ ํ•ต์‹ฌ ์ •๋ฆฌ: ํ•™์Šต์˜ ๋ฏธ๋ž˜ TOP 3  (0) 2026.03.16
Google Labs๊ฐ€ ์ œ์•ˆํ•˜๋Š” '์ฐฝ์ž‘์˜ ๋ฏธ๋ž˜'์™€ Create ์นดํ…Œ๊ณ ๋ฆฌ ์†Œ๊ฐœ.  (0) 2026.03.16
์—ฐ์Šต ๋ฌธ์ œ 3: ๋ณตํ•ฉ ๋ ˆ์ด์•„์›ƒ  (0) 2025.11.18
์—ฐ์Šต ๋ฌธ์ œ 2: ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋–จ์–ด์ง€๋Š” ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ  (0) 2025.11.18
์—ฐ์Šต ๋ฌธ์ œ 1: ๊ธฐ๋ณธ ๋ฐ˜์‘ํ˜• ์นด๋“œ ๋ ˆ์ด์•„์›ƒ  (0) 2025.11.18
'w. Gemini' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Google Labs 'Learn' ์นดํ…Œ๊ณ ๋ฆฌ ํ•ต์‹ฌ ์ •๋ฆฌ: ํ•™์Šต์˜ ๋ฏธ๋ž˜ TOP 3
  • Google Labs๊ฐ€ ์ œ์•ˆํ•˜๋Š” '์ฐฝ์ž‘์˜ ๋ฏธ๋ž˜'์™€ Create ์นดํ…Œ๊ณ ๋ฆฌ ์†Œ๊ฐœ.
  • ์—ฐ์Šต ๋ฌธ์ œ 3: ๋ณตํ•ฉ ๋ ˆ์ด์•„์›ƒ
  • ์—ฐ์Šต ๋ฌธ์ œ 2: ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋–จ์–ด์ง€๋Š” ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ
๋น™๊ณ ๊ตฌ๋ง›ํƒ•
๋น™๊ณ ๊ตฌ๋ง›ํƒ•
  • ๋น™๊ณ ๊ตฌ๋ง›ํƒ•
    ๐•Ž๐”ผ๐”น ๐”ธ๐•ƒ๐•ƒ ๐•ƒ๐•†๐”พ
    ๋น™๊ณ ๊ตฌ๋ง›ํƒ•
    • ์ „์ฒด๋ณด๊ธฐ
      • w. Claude
      • w. GPTs
      • w. Grok
      • w. Gemini
      • After. 2025
      • Before. 2021
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๋ฐฉ๋ช…๋ก
    • ๊ธ€์“ฐ๊ธฐ
    • ๊ด€๋ฆฌ์ž
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ํฌ๋กฌ ๋ถ„ํ•  ๋ณด๊ธฐ
    ie9 ์„  ๋ฒ„๊ทธ
    ํƒญ ์ „ํ™˜ ๊ฐ€์†
    ie collapse ๋ฒ„๊ทธ
    input fileํƒœ๊ทธ ๋ฐ”๊พธ๊ธฐ
    box-shadow
    border-collapse ์˜ค๋ฅ˜
    ํฌ๋กฌ ์ฝ๊ธฐ ๋ชจ๋“œ
    css3
    footer ํ•˜๋‹จ์— ๊ณ ์ •
    footer ๊ณ ์ •
    min-height:100%
    ํฌ๋กฌ ๊ตฌ๊ธ€ ๋ Œ์ฆˆ
    ํฌ๋กฌ ์ˆจ๊ฒจ์ง„ ๊ธฐ๋Šฅ
    ํฌ๋กฌ ์ œ๋ฏธ๋‚˜์ด
    ํฌ๋กฌ ๊ฟ€ํŒ
    ์ œ๋ฏธ๋‚˜์ด
    ํฌ๋กฌ
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
๋น™๊ณ ๊ตฌ๋ง›ํƒ•
::highlight ๊ฐ€์ƒ ์š”์†Œ์˜ ๋“ฑ์žฅ! CSS Custom Highlight API๋กœ ํ…์ŠคํŠธ ๊ฐ•์กฐ๋ฅผ ํ˜์‹ ํ•˜๋‹ค
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”