如何制作垂直进度指示器地图

3

我正在为一个朋友的项目工作,想知道如何实现类似于此页面上书籍垂直滚动效果的效果 https://pudding.cool/2019/06/summer-reading/

我想复制的垂直滚动条指示器位于页面右侧

我查看了代码,并发现它们使用了特定的类作为多个div,但不确定是否有其他方法来实现这一点

编辑:发布时匆忙,以下是更多信息。

我查阅了W3学校有关如何创建滚动指示器的指南 https://www.w3schools.com/howto/howto_js_scroll_indicator.asp 并能够修改它以使其固定和垂直,现在我正在尝试使用这个概念来镜像上面所示的目标结果。我制作了一个非常基本的fiddle

https://jsfiddle.net/sq0z314o/

// When the user scrolls the page, execute myFunction
window.onscroll = function() {myFunction()};

function myFunction() {
  var winScroll = document.body.scrollTop || document.documentElement.scrollTop;
  var height = document.documentElement.scrollHeight - document.documentElement.clientHeight;
  var scrolled = (winScroll / height) * 100;
  document.getElementById("myBar").style.height = scrolled + "%";
}
/* Style the header: fixed position (always stay at the top) */
.scroll {
 position: fixed;
 top: 0;
 z-index: 1;
 height: 100%;
 background-color: #f1f1f1;
}

/* The progress container (grey background) */
.progress-container {
 height: 100%;
 width: 8px;
 background: #ccc;
}

/* The progress bar (scroll indicator) */
.progress-bar {
 width: 8px;
 background: #4caf50;
 height: 0%;
}
.content {
  width: 75%;
  margin: auto;
}
<div class="scroll">
    <div class="progress-container">
        <div class="progress-bar" id="myBar"></div>
    </div>
</div>
  
<div class = "content">      
     <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius libero urna, eu aliquet tellus consequat a. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam vitae dignissim ante. Morbi maximus auctor diam porta vestibulum. Suspendisse et luctus ex, ut interdum risus. Proin mi elit, viverra quis rhoncus euismod, luctus ac lectus. Phasellus laoreet accumsan pretium. Sed aliquam vestibulum sapien, et malesuada ipsum gravida faucibus. Duis vestibulum at nibh id ullamcorper. Curabitur maximus consequat diam non lobortis. Etiam tristique neque enim.</p>
     <p> Nulla sem ex, ultrices at velit id, tempor consequat neque. Nulla at molestie mi, ullamcorper interdum purus. Cras elementum, orci a sollicitudin elementum, tellus sem sodales mi, eget consectetur mi nunc non velit. Maecenas id mauris massa. Donec sed eros erat. Nam interdum sollicitudin elementum. Maecenas laoreet commodo gravida. Duis orci dolor, aliquet sed viverra ut, euismod ac sem. In hendrerit nisl quis massa tristique, vitae cursus urna consectetur.</p>
     <p> Suspendisse maximus dapibus orci, sed faucibus leo iaculis sed. Sed quam ante, accumsan ac gravida ut, feugiat volutpat ligula. Sed aliquet nisi metus, a dapibus diam porttitor et. Suspendisse potenti. Mauris dapibus interdum orci at blandit. Vivamus sit amet turpis est. Interdum et malesuada fames ac ante ipsum primis in faucibus.</p>
     <p> Etiam sodales id velit nec pulvinar. Nulla facilisi. Phasellus lobortis arcu a lobortis consectetur. Proin vitae laoreet odio. Ut sem purus, finibus non ante vitae, porttitor cursus leo. In sed dui lectus. Cras in enim vel ipsum fermentum condimentum. Praesent sit amet fringilla dui. Sed hendrerit varius enim vitae pulvinar. Duis hendrerit eleifend urna, eget cursus odio vulputate eu. Etiam pretium elit quis nibh tristique semper. Praesent vitae sem sed felis aliquam bibendum sed ac justo. Ut eu venenatis neque, vel tristique lacus. Etiam condimentum sit amet est in pulvinar.</p>
     <p> Sed ut pellentesque dolor. Suspendisse blandit tellus at orci pellentesque, a mattis diam dictum. Nullam condimentum et sapien sed tincidunt. Sed consequat urna nec arcu suscipit, vel dapibus elit porttitor. Suspendisse arcu est, ultrices vitae nisi nec, finibus malesuada ex. Aliquam erat volutpat. Fusce odio felis, posuere a dictum ut, dignissim dictum felis. Integer quis eros erat. Sed sed augue finibus, mattis nisl at, auctor orci. Praesent ex metus, viverra et molestie quis, suscipit eget quam. Praesent vehicula elementum tortor, sed dictum mauris. In lectus elit, gravida id iaculis nec, bibendum et ante.</p>
     <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius libero urna, eu aliquet tellus consequat a. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam vitae dignissim ante. Morbi maximus auctor diam porta vestibulum. Suspendisse et luctus ex, ut interdum risus. Proin mi elit, viverra quis rhoncus euismod, luctus ac lectus. Phasellus laoreet accumsan pretium. Sed aliquam vestibulum sapien, et malesuada ipsum gravida faucibus. Duis vestibulum at nibh id ullamcorper. Curabitur maximus consequat diam non lobortis. Etiam tristique neque enim.</p>
</div>


你对这个问题到目前为止尝试了什么?能展示一些代码吗? - AdityaSrivast
感谢您对此的关注--请参见上面的编辑。如果有任何其他信息可以帮助,请告诉我。 - mycoal
更新了 JSFiddle,以反映 Nico Diz 的方法 https://jsfiddle.net/mycoal/r8unvkLf/23/ - mycoal
1个回答

4

如果你希望滚动条具有固定的高度,这里有一个选项。希望它有所帮助:

  • 我复制了 .progress-container节点内的文本内容,并添加了一个名为.content-little的不同类。它具有position: absolute,因此重叠在滚动条上。
  • 我还添加了一些样式,例如font-size较小的.content-little、硬编码的widthheight到滚动条和其子元素中。因此请注意,CSS是不同的。

window.addEventListener('scroll', () => {
  const winScroll =
    document.body.scrollTop || document.documentElement.scrollTop;
  const height =
    document.documentElement.scrollHeight -
    document.documentElement.clientHeight;
  const scrolled = (winScroll / height) * 100;
  document.getElementById("myBar").style.height = `${scrolled}%`;
});
.scroll {
  position: fixed;
  top: 0;
  z-index: 1;
  height: 320px;
  background-color: #f1f1f1;
}

.progress-container {
  position: relative;
  height: 100%;
  width: 70px;
  background: #ccc;
  padding-left: 6px;
}

.progress-bar {
  position: absolute;
  left: -10px;
  width: 90px;
  background: #4caf50;
  height: 0%;
}
.content-little {
  position: absolute;
  font-size: 3px;
  width: 60px;
  height: 100%;
  overflow: hidden;
}
.content {
  width: 60%;
  margin: auto;
}
<div class="scroll">
  <div class="progress-container">
    <div class="progress-bar" id="myBar"></div>
    <div class="content-little">
      <p>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius libero
        urna, eu aliquet tellus consequat a. Class aptent taciti sociosqu ad
        litora torquent per conubia nostra, per inceptos himenaeos. Nam vitae
        dignissim ante. Morbi maximus auctor diam porta vestibulum. Suspendisse et
        luctus ex, ut interdum risus. Proin mi elit, viverra quis rhoncus euismod,
        luctus ac lectus. Phasellus laoreet accumsan pretium. Sed aliquam
        vestibulum sapien, et malesuada ipsum gravida faucibus. Duis vestibulum at
        nibh id ullamcorper. Curabitur maximus consequat diam non lobortis. Etiam
        tristique neque enim.
      </p>
      <p>
        Nulla sem ex, ultrices at velit id, tempor consequat neque. Nulla at
        molestie mi, ullamcorper interdum purus. Cras elementum, orci a
        sollicitudin elementum, tellus sem sodales mi, eget consectetur mi nunc
        non velit. Maecenas id mauris massa. Donec sed eros erat. Nam interdum
        sollicitudin elementum. Maecenas laoreet commodo gravida. Duis orci dolor,
        aliquet sed viverra ut, euismod ac sem. In hendrerit nisl quis massa
        tristique, vitae cursus urna consectetur.
      </p>
      <p>
        Suspendisse maximus dapibus orci, sed faucibus leo iaculis sed. Sed quam
        ante, accumsan ac gravida ut, feugiat volutpat ligula. Sed aliquet nisi
        metus, a dapibus diam porttitor et. Suspendisse potenti. Mauris dapibus
        interdum orci at blandit. Vivamus sit amet turpis est. Interdum et
        malesuada fames ac ante ipsum primis in faucibus.
      </p>
      <p>
        Etiam sodales id velit nec pulvinar. Nulla facilisi. Phasellus lobortis
        arcu a lobortis consectetur. Proin vitae laoreet odio. Ut sem purus,
        finibus non ante vitae, porttitor cursus leo. In sed dui lectus. Cras in
        enim vel ipsum fermentum condimentum. Praesent sit amet fringilla dui. Sed
        hendrerit varius enim vitae pulvinar. Duis hendrerit eleifend urna, eget
        cursus odio vulputate eu. Etiam pretium elit quis nibh tristique semper.
        Praesent vitae sem sed felis aliquam bibendum sed ac justo. Ut eu
        venenatis neque, vel tristique lacus. Etiam condimentum sit amet est in
        pulvinar.
      </p>
      <p>
        Sed ut pellentesque dolor. Suspendisse blandit tellus at orci
        pellentesque, a mattis diam dictum. Nullam condimentum et sapien sed
        tincidunt. Sed consequat urna nec arcu suscipit, vel dapibus elit
        porttitor. Suspendisse arcu est, ultrices vitae nisi nec, finibus
        malesuada ex. Aliquam erat volutpat. Fusce odio felis, posuere a dictum
        ut, dignissim dictum felis. Integer quis eros erat. Sed sed augue finibus,
        mattis nisl at, auctor orci. Praesent ex metus, viverra et molestie quis,
        suscipit eget quam. Praesent vehicula elementum tortor, sed dictum mauris.
        In lectus elit, gravida id iaculis nec, bibendum et ante.
      </p>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius libero
        urna, eu aliquet tellus consequat a. Class aptent taciti sociosqu ad
        litora torquent per conubia nostra, per inceptos himenaeos. Nam vitae
        dignissim ante. Morbi maximus auctor diam porta vestibulum. Suspendisse et
        luctus ex, ut interdum risus. Proin mi elit, viverra quis rhoncus euismod,
        luctus ac lectus. Phasellus laoreet accumsan pretium. Sed aliquam
        vestibulum sapien, et malesuada ipsum gravida faucibus. Duis vestibulum at
        nibh id ullamcorper. Curabitur maximus consequat diam non lobortis. Etiam
        tristique neque enim.
      </p>
    </div>
  </div>
</div>

<div class="content">
  <p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius libero
    urna, eu aliquet tellus consequat a. Class aptent taciti sociosqu ad litora
    torquent per conubia nostra, per inceptos himenaeos. Nam vitae dignissim
    ante. Morbi maximus auctor diam porta vestibulum. Suspendisse et luctus ex,
    ut interdum risus. Proin mi elit, viverra quis rhoncus euismod, luctus ac
    lectus. Phasellus laoreet accumsan pretium. Sed aliquam vestibulum sapien,
    et malesuada ipsum gravida faucibus. Duis vestibulum at nibh id ullamcorper.
    Curabitur maximus consequat diam non lobortis. Etiam tristique neque enim.
  </p>
  <p>
    Nulla sem ex, ultrices at velit id, tempor consequat neque. Nulla at
    molestie mi, ullamcorper interdum purus. Cras elementum, orci a sollicitudin
    elementum, tellus sem sodales mi, eget consectetur mi nunc non velit.
    Maecenas id mauris massa. Donec sed eros erat. Nam interdum sollicitudin
    elementum. Maecenas laoreet commodo gravida. Duis orci dolor, aliquet sed
    viverra ut, euismod ac sem. In hendrerit nisl quis massa tristique, vitae
    cursus urna consectetur.
  </p>
  <p>
    Suspendisse maximus dapibus orci, sed faucibus leo iaculis sed. Sed quam
    ante, accumsan ac gravida ut, feugiat volutpat ligula. Sed aliquet nisi
    metus, a dapibus diam porttitor et. Suspendisse potenti. Mauris dapibus
    interdum orci at blandit. Vivamus sit amet turpis est. Interdum et malesuada
    fames ac ante ipsum primis in faucibus.
  </p>
  <p>
    Etiam sodales id velit nec pulvinar. Nulla facilisi. Phasellus lobortis arcu
    a lobortis consectetur. Proin vitae laoreet odio. Ut sem purus, finibus non
    ante vitae, porttitor cursus leo. In sed dui lectus. Cras in enim vel ipsum
    fermentum condimentum. Praesent sit amet fringilla dui. Sed hendrerit varius
    enim vitae pulvinar. Duis hendrerit eleifend urna, eget cursus odio
    vulputate eu. Etiam pretium elit quis nibh tristique semper. Praesent vitae
    sem sed felis aliquam bibendum sed ac justo. Ut eu venenatis neque, vel
    tristique lacus. Etiam condimentum sit amet est in pulvinar.
  </p>
  <p>
    Sed ut pellentesque dolor. Suspendisse blandit tellus at orci pellentesque,
    a mattis diam dictum. Nullam condimentum et sapien sed tincidunt. Sed
    consequat urna nec arcu suscipit, vel dapibus elit porttitor. Suspendisse
    arcu est, ultrices vitae nisi nec, finibus malesuada ex. Aliquam erat
    volutpat. Fusce odio felis, posuere a dictum ut, dignissim dictum felis.
    Integer quis eros erat. Sed sed augue finibus, mattis nisl at, auctor orci.
    Praesent ex metus, viverra et molestie quis, suscipit eget quam. Praesent
    vehicula elementum tortor, sed dictum mauris. In lectus elit, gravida id
    iaculis nec, bibendum et ante.
  </p>
  <p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius libero
    urna, eu aliquet tellus consequat a. Class aptent taciti sociosqu ad litora
    torquent per conubia nostra, per inceptos himenaeos. Nam vitae dignissim
    ante. Morbi maximus auctor diam porta vestibulum. Suspendisse et luctus ex,
    ut interdum risus. Proin mi elit, viverra quis rhoncus euismod, luctus ac
    lectus. Phasellus laoreet accumsan pretium. Sed aliquam vestibulum sapien,
    et malesuada ipsum gravida faucibus. Duis vestibulum at nibh id ullamcorper.
    Curabitur maximus consequat diam non lobortis. Etiam tristique neque enim.
  </p>
</div>


谢谢您的回复!我肯定可以使用这个并进行相应的修改。我编辑了我的fiddle以反映您的方法,并进行了一些微调,这将帮助我更好地可视化结果。再次感谢您的帮助!https://jsfiddle.net/mycoal/r8unvkLf/23/ - mycoal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接