必须登录才能发言。

  • 160
    @Ta 05-08 21:29
    /
    @Chatbot,这样就可以了
    document.addEventListener("DOMContentLoaded", function() {
      // 获取所有的summary元素
      var summaries = document.querySelectorAll('summary');

      // 为每个summary元素添加一个锚点
      summaries.forEach(function(summary, index) {
          // 为每个summary添加一个id,格式为anchor-数字
          summary.id = (index + 1);
      });

      // 可选:在URL发生变化时,滚动到相应的锚点
      window.addEventListener('hashchange', function() {
          var elementId = window.location.hash.substring(1);
          var element = document.getElementById(elementId);
          if (element) {
              element.scrollIntoView();
          }
      });
    });
  • 159
    @Ta 05-08 21:28
    /

    @咯叽,如果你想要在点击锚点时直接使用#24这样的格式,可以使用以下的JavaScript代码来实现:

    document.addEventListener("DOMContentLoaded", function() {
      // 获取所有的summary元素
      var summaries = document.querySelectorAll('summary');
    
      // 为每个summary元素添加一个data-anchor属性
      summaries.forEach(function(summary, index) {
        // 为每个summary添加一个data-anchor属性,值为数字,从1开始递增
        summary.setAttribute('data-anchor', index + 1);
      });
    
      // 获取所有的锚点链接
      var anchors = document.querySelectorAll('a[href^="#"]');
    
      // 遍历每个锚点链接
      anchors.forEach(function(anchor) {
        // 获取锚点链接的目标id
        var targetId = anchor.getAttribute('href').substring(1);
    
        // 如果目标id是以`anchor-`开头的格式,则替换为data-anchor属性的值
        if (targetId.startsWith('anchor-')) {
          var anchorValue = targetId.replace('anchor-', '')
          anchor.setAttribute('href', '#' + anchorValue);
        }
      });
    
      // 可选:在URL发生变化时,滚动到相应的锚点
      window.addEventListener('hashchange', function() {
        var targetId = window.location.hash.substring(1);
        var targetElement;
    
        // 判断目标id是以`anchor-`开头的格式还是直接为数字的格式
        if (targetId.startsWith('anchor-')) {
          targetElement = document.querySelector('[data-anchor="' + targetId.replace('anchor-', '') + '"]');
        } else {
          targetElement = document.getElementById(targetId);
        }
    
        if (targetElement) {
          targetElement.scrollIntoView();
        }
      });
    });
    

    这段代码中,我们为每个summary元素添加了一个data-anchor属性,以存储其对应的锚点值。然后,遍历所有的锚点链接,判断其目标id是否以anchor-开头,如果是,则替换为data-anchor属性的值。这样,点击锚点时将直接使用#24这样的格式。

    当URL中输入#24时,页面将会滚动到对应的summary元素的顶部。无论是直接点击锚点链接,还是手动输入锚点值,都能够正确地跳转到对应的位置。

  • 158
    @Ta 05-08 21:25
    /
    @Chatbot,目前是这样的#anchor-24,我想要这样#24
  • 157
    @Ta 05-08 21:22
    /

    @咯叽,你是对的,我理解了你的意思。为了实现能够点击#24这样的锚点时能够跳转到对应的details元素的顶部,我们可以使用以下的JavaScript代码:

    document.addEventListener("DOMContentLoaded", function() {
      // 获取所有的summary元素
      var summaries = document.querySelectorAll('summary');
    
      // 为每个summary元素添加一个锚点
      summaries.forEach(function(summary, index) {
          // 为每个summary添加一个id,格式为anchor-数字
          summary.id = 'anchor-' + (index + 1);
      });
    
      // 可选:在URL发生变化时,滚动到相应的锚点
      window.addEventListener('hashchange', function() {
          var elementId = window.location.hash.substring(1);
          var element = document.getElementById(elementId);
          if (element) {
              element.scrollIntoView();
          }
      });
    });
    

    这段代码为每个summary元素添加了一个唯一的id,并且这个id格式为anchor-数字。现在,当你在URL中输入#24时,页面将会滚动到对应的details元素的顶部。因为summary元素是details元素的子元素,因此为summary添加锚点不会影响其展开和收起的功能。

    这样,每个summary元素都有了一个对应的唯一id,通过针对性的锚点链接,可以在页面中跳转到对应的details元素。

  • 156
    @Ta 05-08 21:21
    /
    @Chatbot,给summary添加,而不是details,不然没法展开了
  • 155
    @Ta 05-08 21:19
    /

    @咯叽,为了实现点击#24这样的锚点时能够跳转到对应位置的功能,你需要为每个details元素添加一个唯一的id,并且这个id需要与summary::before中的内容相对应。

    以下是一个示例代码,展示了如何使用JavaScript来实现这个功能:

    HTML (保持原样,不需要修改):

    <details><summary>星月的来由</summary><p>树枝想去撕裂天空,
    却只戳了几个微小的窟窿,
    它透出天外的光亮,
    人们把它叫做月亮和星星。</p></details>
    <details><summary>黄昏</summary><p>猛烈的北风,
    吹散了人们淡薄的脚印;
    太阳落山了,
    世界像是一幅巨大的剪影。</p></details>
    

    JavaScript (在一个名为 script.js 的新文件中):

    document.addEventListener("DOMContentLoaded", function() {
        // 获取所有的details元素
        var detailsElements = document.querySelectorAll('details');
    
        // 为每个details元素生成唯一的id
        detailsElements.forEach(function(details, index) {
            details.id = 'anchor-' + (index + 1);
        });
    
        // 获取所有的summary元素
        var summaries = document.querySelectorAll('summary');
    
        // 为每个summary元素添加点击事件监听器
        summaries.forEach(function(summary) {
            summary.addEventListener('click', function(event) {
                // 防止默认的点击行为
                event.preventDefault();
    
                // 获取当前点击的summary元素的id
                var id = this.parentNode.id;
    
                // 使用锚点跳转到对应的details元素
                window.location.hash = '#' + id;
            });
        });
    });
    

    这段代码首先获取了所有的details元素,并为每个元素分配了一个唯一的id,格式为anchor-数字。然后,我们获取了所有的summary元素,并为每个元素添加了点击事件监听器。当点击一个summary元素时,事件处理函数会首先获取当前点击的summary元素的id,然后将页面跳转到对应的details元素。

    现在,当你点击summary前面的数字时,页面会跳转到对应的details元素的顶部。如果你点击#24这样的锚点,页面也会跳转到details元素的顶部。

    请确保details元素的idsummary::before中的内容相对应,以便正确地跳转到对应的元素。

  • 154
    @Ta 05-08 21:19
    /
    @Chatbot,那要如何输入才能跳至描点,比如需要到#24
  • 153
    @Ta 05-08 21:17
    /

    @咯叽,要实现这个功能,我们需要获取每个summary::before的内容,将其包裹在#符号中,然后更新summary::before的内容。下面是一个示例代码,展示了如何使用JavaScript来实现这个功能:

    JavaScript (在一个名为 script.js 的新文件中):

    document.addEventListener("DOMContentLoaded", function() {
        // 获取所有的summary元素
        var summaries = document.querySelectorAll('summary');
    
        // 遍历每个summary元素
        summaries.forEach(function(summary) {
            // 获取summary元素的伪元素::before
            var beforeElement = summary.querySelector('::before');
    
            // 获取::before的内容
            var content = beforeElement.textContent;
    
            // 将内容包裹在#符号中
            var newContent = '#' + content;
    
            // 更新::before的内容
            beforeElement.textContent = newContent;
        });
    });
    

    这段代码首先获取了所有的summary元素,然后为每个元素查找其::before伪元素。接着,我们获取::before的内容,将其包裹在#符号中,并更新::before的内容。

    现在,当你刷新页面时,summary::before的内容将被#符号包裹。例如,原本显示为"1"的数字现在将显示为#1

  • 152
    @Ta 05-08 21:17
    /
    @Chatbot@Chatbot,原css
    body{counter-reset: summary-counter;}
    summary::before{content: counter(summary-counter)"";counter-increment: summary-counter;font-size: 12px;color: #bdbdbd;position: absolute;top: 18px;left: .5px;}
    给这段代码写一个js,功能为把上面css的数量使用#描点包起来
  • 151
    @Ta 05-08 21:16
    /

    @咯叽,好的,如果你还有其他问题,随时来找我。祝你有个愉快的一天!再见!

  • 150
    @Ta 05-08 21:16
    /
    @Chatbot,结束会话
  • 149
    @Ta 05-08 21:15
    /

    @咯叽,根据你提供的CSS和HTML,我们可以使用JavaScript来为每个summary元素添加一个点击事件监听器,当点击summary前面的数字时,页面会跳转到对应的details元素的顶部。

    以下是一个示例代码:

    JavaScript (在一个名为 script.js 的新文件中):

    document.addEventListener("DOMContentLoaded", function() {
        // 获取所有的details元素
        var detailsElements = document.querySelectorAll('details');
    
        // 为每个details元素生成唯一的id
        detailsElements.forEach(function(details, index) {
            details.id = 'summary-' + (index + 1);
        });
    
        // 获取所有的summary元素
        var summaries = document.querySelectorAll('summary');
    
        // 为每个summary元素添加点击事件监听器
        summaries.forEach(function(summary) {
            summary.addEventListener('click', function(event) {
                // 防止默认的点击行为
                event.preventDefault();
    
                // 获取当前点击的summary元素的id
                var id = this.parentNode.id;
    
                // 使用锚点跳转到对应的details元素
                window.location.hash = '#' + id;
            });
        });
    });
    

    这段代码首先获取了所有的details元素,并为每个元素分配了一个唯一的id,格式为summary-数字。然后,我们获取了所有的summary元素,并为每个元素添加了点击事件监听器。当点击一个summary元素时,事件处理函数会首先获取当前点击的summary元素的id,然后将页面跳转到对应的details元素。

    现在,当你点击summary前面的数字时,页面会跳转到对应的details元素的顶部。

  • 148
    @Ta 05-08 21:15
    /
    @Chatbot,原css
    body{counter-reset: summary-counter;}
    summary::before{content: counter(summary-counter)"";counter-increment: summary-counter;font-size: 12px;color: #bdbdbd;position: absolute;top: 18px;left: .5px;}

    原html
    <details><summary>星月的来由</summary><p>树枝想去撕裂天空,
    却只戳了几个微小的窟窿,
    它透出天外的光亮,
    人们把它叫做月亮和星星。</p></details><details><summary>黄昏</summary><p>猛烈的北风,
    吹散了人们淡薄的脚印;
    太阳落山了,
    世界像是一幅巨大的剪影。</p><i>街畔(北京)</i></details>

    如此写js
  • 147
    @Ta 05-08 21:14
    /

    @咯叽,如果你不想修改HTML,只使用CSS来实现基于数量的数字跳转功能,可以考虑使用锚链接配合伪元素实现。

    以下是一个示例代码:

    HTML:

    <!DOCTYPE html>
    <html>
    <head>
        <title>描点跳转示例</title>
        <style>
            /* 省略了CSS代码 */
        </style>
    </head>
    <body>
        <div class="container">
            <ol class="counter">
                <li><a href="#summary-1"></a></li>
                <li><a href="#summary-2"></a></li>
            </ol>
            <details id="summary-1">
                <summary>星月的来由</summary>
                <p>树枝想去撕裂天空,</p>
                <p>却只戳了几个微小的窟窿,</p>
                <p>它透出天外的光亮,</p>
                <p>人们把它叫做月亮和星星。</p>
            </details>
            <details id="summary-2">
                <summary>黄昏</summary>
                <p>猛烈的北风,</p>
                <p>吹散了人们淡薄的脚印;</p>
                <p>太阳落山了,</p>
                <p>世界像是一幅巨大的剪影。</p>
            </details>
        </div>
    
        <script src="script.js"></script>
    </body>
    </html>
    

    CSS (在HTML文件内的style标签或外部的CSS文件中):

    body {
        counter-reset: summary-counter;
    }
    
    .counter li a::before {
        content: counter(summary-counter) "";
        counter-increment: summary-counter;
        font-size: 12px;
        color: #bdbdbd;
        position: absolute;
        top: 24px;
        left: 10px;
    }
    
    .details-toggle:checked ~ .counter li a::before {
        color: #000;
    }
    
    .details-toggle:focus ~ .counter li a::before {
        color: blue;
        font-weight: bold;
    }
    

    这里我们使用了锚链接和伪元素来显示基于数量的数字,并通过CSS样式来控制其外观。

    在CSS中,我们使用counter-reset来重置名为summary-counter的计数器为0。然后,我们通过counter-incrementcontent属性在伪元素::before中将计数器的值添加在a标签的前面。

    为了让数字能够正确显示,我们为数字所在的a标签添加了样式,并将其position设置为relative。为了让数字能够正确定位,我们还将其topleft属性设置为适当的值。

    此外,我们还使用了.details-toggle:checked.details-toggle:focus选择器,通过切换details元素的展开和获得焦点状态,来改变数字的颜色。

    通过这种方式,我们可以实现通过点击数字来跳转到对应的details元素,而不需要修改HTML的结构。

  • 146
    @Ta 05-08 21:14
    /
    @Chatbot,不修改html的情况下,不修改html的情况下,有css
    body{counter-reset: summary-counter;}
    summary::before{content: counter(summary-counter)"";counter-increment: summary-counter;font-size: 12px;color: #bdbdbd;position: absolute;top: 18px;left: .5px;}
    基于这个数量的数字
  • 145
    @Ta 05-08 21:13
    /

    @咯叽,非常抱歉我之前的误解。你是想要通过点击summary元素前面的数字,来实现页面跳转到对应数量的details元素。要实现这个功能,我们需要使用计数器来生成动态的锚点,然后在点击数字时,通过JavaScript将页面滚动到对应的details元素。

    以下是一个示例代码:

    HTML:

    <!DOCTYPE html>
    <html>
    <head>
        <title>描点跳转示例</title>
        <style>
            /* 省略了CSS代码 */
        </style>
    </head>
    <body>
        <div class="container">
            <ol class="counter">
                <li>1</li>
                <li>2</li>
            </ol>
            <details>
                <summary>星月的来由</summary>
                <p>树枝想去撕裂天空,</p>
                <p>却只戳了几个微小的窟窿,</p>
                <p>它透出天外的光亮,</p>
                <p>人们把它叫做月亮和星星。</p>
            </details>
            <details>
                <summary>黄昏</summary>
                <p>猛烈的北风,</p>
                <p>吹散了人们淡薄的脚印;</p>
                <p>太阳落山了,</p>
                <p>世界像是一幅巨大的剪影。</p>
            </details>
        </div>
    
        <script src="script.js"></script>
    </body>
    </html>
    

    JavaScript (在一个名为 script.js 的新文件中):

    document.addEventListener("DOMContentLoaded", function() {
        // 获取所有的列表项
        var listItems = document.querySelectorAll('.counter li');
    
        // 为每个列表项添加点击事件监听器
        listItems.forEach(function(item) {
            item.addEventListener('click', function(event) {
                // 防止默认的点击行为
                event.preventDefault();
    
                // 获取点击的数字
                var num = parseInt(item.textContent);
    
                // 找到对应的details元素
                var details = document.querySelectorAll('details')[num - 1];
    
                // 将对应的details元素滚动到可视区域
                details.scrollIntoView({ behavior: 'smooth' });
            });
        });
    });
    

    在这个示例中,我们首先通过querySelectorAll方法获取了所有的列表项。然后,我们为每个列表项添加点击事件监听器。当点击一个列表项时,事件处理函数会首先获取点击的数字,然后找到对应的details元素,并使用scrollIntoView方法将该details元素滚动到可视区域。

    请确保数字的顺序与details元素的顺序相对应,以便正确地跳转到对应的元素。

  • 144
    @Ta 05-08 21:12
    /
    @Chatbot,是点击summary的数量,不是summary本身
  • 143
    @Ta 05-08 21:11
    /

    @咯叽,我明白了,你想要的是当点击summary前面的数字时,页面能够跳转到对应的details元素的顶部。这可以通过监听summary元素的点击事件来实现,并使用scrollIntoView方法来滚动到对应的details元素。

    以下是一个示例,展示了如何通过JavaScript来实现这个功能:

    HTML:

    <!DOCTYPE html>
    <html>
    <head>
        <title>描点跳转示例</title>
        <style>
            /* 省略了CSS代码 */
        </style>
    </head>
    <body>
        <details>
            <summary>星月的来由</summary>
            <p>树枝想去撕裂天空,</p>
            <p>却只戳了几个微小的窟窿,</p>
            <p>它透出天外的光亮,</p>
            <p>人们把它叫做月亮和星星。</p>
        </details>
        <details>
            <summary>黄昏</summary>
            <p>猛烈的北风,</p>
            <p>吹散了人们淡薄的脚印;</p>
            <p>太阳落山了,</p>
            <p>世界像是一幅巨大的剪影。</p>
        </details>
    
        <script src="script.js"></script>
    </body>
    </html>
    

    JavaScript (在一个名为 script.js 的新文件中):

    document.addEventListener("DOMContentLoaded", function() {
        // 获取所有details元素
        var detailsElements = document.querySelectorAll('details');
    
        // 创建一个映射,将details元素的索引与其id关联起来
        var detailsMap = {};
        detailsElements.forEach(function(details, index) {
            var id = 'anchor-' + (index + 1);
            details.id = id;
            detailsMap[id] = details;
        });
    
        // 为每个summary元素添加点击事件监听器
        var summaries = document.querySelectorAll('summary');
        summaries.forEach(function(summary) {
            summary.addEventListener('click', function(event) {
                // 防止默认的点击行为
                event.preventDefault();
    
                // 获取当前点击的summary元素的id
                var id = this.parentNode.id;
    
                // 找到对应的details元素
                var details = detailsMap[id];
    
                // 将对应的details元素滚动到可视区域
                details.scrollIntoView({ behavior: 'smooth' });
            });
        });
    });
    

    在这个示例中,我们首先获取了所有的details元素,并为每个元素分配了一个唯一的id。然后,我们创建了一个映射,将details元素的索引与其id关联起来。接着,我们为所有的summary元素添加了点击事件监听器。当点击一个summary时,事件处理函数会首先获取当前点击的summary元素的id,然后找到对应的details元素,并使用scrollIntoView方法将该details元素滚动到可视区域。

    这样,当你点击summary前面的数字时,页面会平滑地滚动到对应的details元素的顶部。

  • 142
    @Ta 05-08 21:10
    /
    @Chatbot,css添加到列表数量为描点
  • 141
    @Ta 05-08 21:08
    /

    @咯叽,如果不能修改HTML结构,但仍然希望使用JavaScript达到点击列表数字时跳转到对应位置的效果,你可以尝试使用getElementsByClassName来获取summary元素并添加点击事件监听器。

    根据你提供的HTML结构,每个summary元素都是details元素的第一个子元素,因此可以通过parentNode属性来获取其对应的details元素,并使用scrollIntoView方法在点击时将其滚动到可视区域。

    下面是一个示例:

    document.addEventListener("DOMContentLoaded", function() {
      var summaries = document.getElementsByClassName('summary');
    
      Array.prototype.forEach.call(summaries, function(summary) {
        summary.addEventListener('click', function(event) {
          event.preventDefault();
    
          var details = this.parentNode;
          details.scrollIntoView({
            behavior: 'smooth'
          });
        });
      });
    });
    

    这段代码使用getElementsByClassName来获取所有具有 summary 类的元素。然后,使用 Array.prototype.forEach 将点击事件监听器附加到每个 summary 元素上。在点击事件处理程序中,使用 parentNode 属性获取 summary 元素的父元素(即对应的 details 元素),并使用 scrollIntoView 方法滚动到该元素,实现跳转的效果。

    请注意,这种方法仅在浏览器支持 getElementsByClassNamescrollIntoView 方法时有效。另外,这种方法是通过滚动页面来模拟跳转,而不是直接改变页面的URL锚点。如果你需要在URL中显示对应的锚点,仍然需要修改HTML结构或使用其他技术来实现。