首页 > 其他分享 >CSS Custom Highlight API

CSS Custom Highlight API

时间:2024-04-29 22:59:09浏览次数:14  
标签:index const API Highlight 文本 CSS

CSS Custom Highlight API

CSS Custom Highlight API
JavaScript 创建范围并使用 CSS 定义样式来设置文档中任意文本范围的样式
该 API 允许开发者通过 CSS 自定义属性来设置文本的样式, 并将其应用到文档中的任意文本范围。
本质就是查找所有文本节点,收集匹配内容的 Range, 最后作为参数构建 Highlight 对象, 但需要注意的是其并未产生新的节点


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0" />
    <title>CSS Custom Highlight API</title>
    <style>
      .text {
        overflow-wrap: break-word;
        word-break: keep-all;
        white-space: pre-wrap;
        text-wrap: wrap;

        &::highlight(my-custom-highlight) {
          background-color: hotpink;
        }
      }
    </style>
  </head>
  <body>
    <strong>CSS Custom Highlight API</strong>
    <hr />
    <div>
      <span>搜索文本:&nbsp;</span>
      <input type="text" id="searchText" />
    </div>
    <p class="text">
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Aperiam nisi animi mollitia rem,
      placeat sint recusandae ab voluptatum, consequatur excepturi voluptatem repudiandae sed
      tempora, itaque optio distinctio ratione minus libero! Culpa eius, sint unde blanditiis
      deserunt molestiae beatae illum quidem quo alias modi aut adipisci in quia doloribus quisquam
      fugiat vero ut? Corrupti provident cupiditate velit quasi praesentium numquam ratione.
    </p>

    <script>
      // CSS Custom Highlight API
      // JavaScript 创建范围并使用 CSS 定义样式来设置文档中任意文本范围的样式
      // 该 API 允许开发者通过 CSS 自定义属性来设置文本的样式, 并将其应用到文档中的任意文本范围。
      // 就是查找所有文本节点,收集匹配内容的 Range, 最后作为参数构建 HighLight 对象, 但需要注意的是其并未产生新的节点

      const searchText = document.getElementById('searchText');
      const article = document.querySelector('.text');

      // 创建一个 TreeWalker 对象来遍历文档中的所有文本节点
      const treeWalker = document.createTreeWalker(article, NodeFilter.SHOW_TEXT);
      // console.log('treeWalker => ', treeWalker);
      const allTextNodes = [];
      let currentNode = treeWalker.nextNode();
      while (currentNode) {
        allTextNodes.push(currentNode);
        currentNode = treeWalker.nextNode();
      }

      searchText.addEventListener('input', () => {
        // 清空高亮效果
        CSS.highlights.clear();

        const searchValue = searchText.value.trimStart().trimEnd();
        if (searchValue === '') return;

        const ranges = allTextNodes.map((node) => {
          const text = node.textContent;
          // 所匹配的位置
          const indices = [];
          // 记录所有匹配的位置
          let startPos = 0;

          // 保存所有匹配的位置
          while (startPos < text.length) {
            const index = text.indexOf(searchValue, startPos);
            if (index === -1) break;
            indices.push(index);
            startPos = index + searchValue.length;
          }

          return indices.map((index) => {
            // 构建一个 Range 对象
            const range = new Range();
            // 设置 Range 的开始和结束位置
            range.setStart(node, index);
            range.setEnd(node, index + searchValue.length);
            return range;
          });
        });
        // console.log('ranges => ', ranges);

        // 构建一个 Highlight 对象并应用到文档中
        const searchResults = new Highlight(...ranges.flat());

        // 高亮效果
        CSS.highlights.set('my-custom-highlight', searchResults);
      });
    </script>
  </body>
</html>

标签:index,const,API,Highlight,文本,CSS
From: https://www.cnblogs.com/chlai/p/18166774

相关文章

  • CSS Counter Styles
    CSSCounterStyles允许您自动对HTML文档中的元素进行编号或标记。我们定义一个具有特定名称和起始值的counter,然后根据CSS规则递增或递减该计数器。使用counter-reset属性定义计数器,设置其起始值,然后使用counter-increment属性根据需要递增或递减计数器。还可以使......
  • css中内容content部分垂直居中的方法
     1、vertical-align属性让文字居中  vertical-align值有很多,常用的就是middle,bottom,text-bottom等,然而真实使用的时候,我们会发现这个属性“时灵时不灵”,有些情况下我们加了这个属性之后仍然不见img或者text有任何的变化。那是因为vertical-align只作用在inline-block或者inl......
  • REST API
    REST,全称RepresentationalStateTransfer(资源)表现层状态转移。用URL定位资源,用HTTP描述操作。REST的六项原则客户端-服务器架构客户端(请求数据)和服务器(提供数据)独立运行,增强了可扩展性和可移植性。无状态客户端向服务器发出的每个请求都必须包含理解和完成请......
  • unocss如何使用css变量
    在UnoCSS中,可以直接使用CSS变量来定义样式。但是,UnoCSS本身并不支持直接使用变量名作为类名或选择器。如果想使用CSS变量来定义样式,可以按照以下方式进行操作:在CSS文件中定义一个变量,例如--text-color:red;。在UnoCSS的样式表中,可以通过var()函数来引用该变量,例......
  • Media Session API
    MediaSessionAPI控制媒体播放和自定义媒体通知<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/>......
  • ABAP 调用外部WEBAPI
    ABAP代码如下,仅在内部测试通过,未涉及外部网络WEBAPI及跨域调用。*&---------------------------------------------------------------------**&ReportZYC_WEBAPI*&Restfulapi测试REPORTZYC_WEBAPI.DATA:LENTYPEI,"发送报文长度LEN_STRING......
  • 只用CSS实现一个自适应的正方形
    问题描述当一个div的宽度是自适应的,高度需要适配宽度的变化一起变化时,CSS的样式设置好像变得不那么容易或许大多数人都会选择js实现,没问题,性能低一点罢了但实际上纯css也能实现代码//html<divclass="container"><divclass="father"><divclass="son">test</div......
  • webapi动态创建后台任务(使用排队的后台任务)
    很多时候我们都会使用后台定时任务,但有些任务不需要定时执行,只需要请求到来时执行一次,比如请求服务器到某个地方同步数据,但请求不需要等数据同步完成再响应。这时候就可以使用排队的后台任务。基本原理是用一个队列保存任务委托,然后用一个后台定时任务依次执行队列中的委托。MSD......
  • windows api SendMessage依赖的库和头文件
    SendMessage 是WindowsAPI中的一个函数,用于向指定窗口发送消息。在WindowsAPI中,SendMessage 函数的原型定义在 winuser.h 头文件中,因此您需要包含该头文件。另外,SendMessage 函数属于User32.dll动态链接库,因此您需要在链接时引入User32.lib库。#pragmacomment......
  • WEBAPI传参及默认首页设置
    开发工具:VS2017创建WEBAPI,1.选择ASP.NETCoreWeb应用程序2.选择如下,HTTPS配置勾选去掉,暂不配置3.“属性”中调试默认界面及launchsettings.json 4.调试以后默认页面 5. ......