• js楼层导航点击跳转偶尔不生效bug


    问题描述

    根据元素距离顶部距离的数组进行判断要跳转的位置,有时候会出现跳转不生效的原因

    代码

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    7. <title>Documenttitle>
    8. <style>
    9. * {
    10. box-sizing: border-box;
    11. margin: 0;
    12. padding: 0;
    13. }
    14. .wrap {
    15. width: 1000px;
    16. margin: 0 auto;
    17. }
    18. .box1 {
    19. height: 300px;
    20. background: darkcyan;
    21. }
    22. .box2 {
    23. height: 587px;
    24. background: cadetblue;
    25. }
    26. .box3 {
    27. height: 478px;
    28. background: palevioletred;
    29. }
    30. .box4 {
    31. height: 287px;
    32. background: darkmagenta;
    33. }
    34. .box5 {
    35. height: 671px;
    36. background: darkorange;
    37. }
    38. .box6 {
    39. height: 354px;
    40. background: pink;
    41. }
    42. .toolbar {
    43. display: flex;
    44. width: 80px;
    45. background: darkgoldenrod;
    46. position: fixed;
    47. flex-direction: column;
    48. right: 10px;
    49. top: 100px;
    50. }
    51. .toolbar .item {
    52. height: 80px;
    53. display: flex;
    54. align-items: center;
    55. justify-content: center;
    56. }
    57. .toolbar .active {
    58. background: darkkhaki;
    59. color: #fff;
    60. }
    61. style>
    62. head>
    63. <body>
    64. <div class="toolbar">
    65. <div class="item" data-index="0">1div>
    66. <div class="item" data-index="1">2div>
    67. <div class="item" data-index="2">3div>
    68. <div class="item" data-index="3">4div>
    69. <div class="item" data-index="4">5div>
    70. <div class="item" data-index="5">6div>
    71. div>
    72. <div class="wrap">
    73. <p>内容p>
    74. <p>内容p>
    75. <p>内容p>
    76. <p>内容p>
    77. <p>内容p>
    78. <p>内容p>
    79. <p>内容p>
    80. <p>内容p>
    81. <p>内容p>
    82. <p>内容p>
    83. <div class="box box1">1div>
    84. <div class="box box2">2div>
    85. <div class="box box3">3div>
    86. <div class="box box4">4div>
    87. <div class="box box5">5div>
    88. <div class="box box6">6div>
    89. <p>内容p>
    90. <p>内容p>
    91. <p>内容p>
    92. <p>内容p>
    93. <p>内容p>
    94. <p>内容p>
    95. <p>内容p>
    96. <p>内容p>
    97. <p>内容p>
    98. <p>内容p>
    99. <p>内容p>
    100. <p>内容p>
    101. <p>内容p>
    102. <p>内容p>
    103. <p>内容p>
    104. <p>内容p>
    105. <p>内容p>
    106. <p>内容p>
    107. <p>内容p>
    108. <p>内容p>
    109. <p>内容p>
    110. <p>内容p>
    111. <p>内容p>
    112. <p>内容p>
    113. <p>内容p>
    114. <p>内容p>
    115. <p>内容p>
    116. <p>内容p>
    117. <p>内容p>
    118. <p>内容p>
    119. <p>内容p>
    120. <p>内容p>
    121. div>
    122. <script>
    123. let boxList = document.querySelectorAll(".box");
    124. let itemList = document.querySelectorAll(".item");
    125. let heights = []; //所有的box距离顶部的高度
    126. boxList.forEach(function (box) {
    127. heights.push(box.offsetTop);
    128. });
    129. console.log(heights);
    130. window.onscroll = function () {
    131. let _active = document.querySelector(".active");
    132. if (_active) {
    133. _active.classList.remove("active");
    134. }
    135. let _scrollTop = parseInt(document.documentElement.scrollTop);
    136. // console.log("_scrollTop", _scrollTop);
    137. for (let i = heights.length - 1; i >= 0; i--) {
    138. if (_scrollTop >= heights[i]) {
    139. itemList[i].classList.add("active");
    140. break;
    141. }
    142. }
    143. };
    144. let _toolbar = document.querySelector(".toolbar");
    145. _toolbar.onclick = function (e) {
    146. if (e.target.className === "item") {
    147. let index = e.target.dataset.index;
    148. console.log(index);
    149. document.documentElement.scrollTop = heights[index];
    150. }
    151. };
    152. script>
    153. body>
    154. html>

    解决办法

    具体原因是这一行代码判断问题,应该是dpi缩放导致的

    1. if (_scrollTop >= heights[i]) {
    2. itemList[i].classList.add("active");
    3. break;
    4. }

    可以通过将元素距离顶部的距离的数组加1,让其肯定大于,从而解决偶尔不触发的问题

    1. _toolbar.onclick = function (e) {
    2. if (e.target.className === "item") {
    3. let index = e.target.dataset.index;
    4. console.log(index);
    5. document.documentElement.scrollTop = heights[index] + 1;//关键代码
    6. }
    7. };

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

  • 相关阅读:
    山海鲸可视化B/S架构应用
    商业合作保密协议 (4)
    黑客(网络安全)技术速成自学
    java线程池大小_线程池大小设置多少合适?
    Postgresql RECORD与%ROWTYPE类型
    BurpSuite安装
    web前端-javascript-立即执行函数(说明、例子)
    一文读懂Llama 2(从原理到实战)
    Bootstrap Blazor 组件库 Row 布局组件(栅格系统)
    数学术语之源——群同态的“核(kernel)”
  • 原文地址:https://blog.csdn.net/qq_45547094/article/details/126581749