📜  JavaScript 滚动条(1)

📅  最后修改于: 2023-12-03 14:42:36.964000             🧑  作者: Mango

JavaScript 滚动条

在网页开发中,滚动条是一个很常用的组件。JavaScript可以帮助我们自定义滚动条,实现更加个性化的滚动效果。在本文中,我们将介绍如何使用JavaScript创建和定制滚动条。

制作基本滚动条

我们可以使用CSS样式来创建基本的滚动条,然后使用JavaScript来加载滚动条,并且在滚动时更新滚动条的位置以及内容的位置。

<!-- HTML结构 -->
<div class="scroll-container">
  <div class="scroll-content">
    <!-- 内容部分 -->
  </div>
</div>

<!-- CSS样式 -->
<style>
  .scroll-container {
    width: 300px;
    height: 200px;
    overflow: auto;
    position: relative;
  }
  .scroll-bar {
    position: absolute;
    top: 0;
    right: 0;
    width: 6px;
    height: 100%;
    background-color: #ccc;
  }
  .scroll-thumb {
    position: absolute;
    width: 6px;
    background-color: #666;
  }
</style>

<!-- JavaScript代码 -->
<script>
  // 选取节点
  const container = document.querySelector('.scroll-container');
  const content = document.querySelector('.scroll-content');
  // 创建滚动条节点
  const bar = document.createElement('div');
  const thumb = document.createElement('div');
  bar.classList.add('scroll-bar');
  thumb.classList.add('scroll-thumb');
  bar.appendChild(thumb);
  container.appendChild(bar);
  // 发生滚动时,更新滚动条状态
  content.addEventListener('scroll', () => {
    const { scrollTop, scrollHeight, clientHeight } = content;
    const thumbHeight = clientHeight / scrollHeight * clientHeight;
    thumb.style.height = `${thumbHeight}px`;
    thumb.style.transform = `translateY(${scrollTop / scrollHeight * clientHeight}px)`;
  });
</script>

代码解析:

  • HTML结构中,我们有一个内容容器scroll-container,默认情况下,该容器的内容会在超出容器高度的时候出现滚动条。
  • 在CSS样式中,我们定义了滚动条的样式:包含父容器scroll-bar和滚动条scroll-thumb两个容器。scroll-bar容器的高度和宽度随意设定,然后使用position:absolute,使其定位在父容器的右上角(通过topright样式),使用灰色背景。scroll-thumb的宽度为6px,高度用javascript计算得出,并且使用translateY属性,使其随着滚动事件而改变其Y轴位置。
  • 在JavaScript代码中,首先选取了HTML中的两个节点:scroll-containerscroll-content。然后创建了滚动条的节点,并且通过JavaScript设置了滚动条节点在父容器上的样式。在事件监听器中,我们处理了滚动事件,调整滚动条宽度和位置。
自定义滚动条样式

我们可以通过一些CSS技巧来自定义滚动条的样式。

<!-- HTML结构 -->
<div class="scroll-container">
  <div class="scroll-content">
    <!-- 内容部分 -->
  </div>
  <div class="scroll-bar">
    <div class="scroll-thumb"></div>
  </div>
</div>

<!-- CSS样式 -->
<style>
  .scroll-container {
    width: 300px;
    height: 200px;
    overflow: auto;
    position: relative;
  }
  .scroll-bar {
    position: absolute;
    top: 0;
    right: 0;
    width: 6px;
    height: 100%;
    background-color: #ccc;
  }
  .scroll-thumb {
    position: absolute;
    width: 6px;
    border-radius: 3px;
    background-color: #666;
    transition: all 0.3s ease-in-out;
  }
  .scroll-container:hover .scroll-thumb {
    background-color: #999;
  }
  .scroll-container::-webkit-scrollbar {
    width: 6px;
  }
  .scroll-container::-webkit-scrollbar-button {
    display: none;
  }
  .scroll-container::-webkit-scrollbar-thumb {
    background-color: #666;
  }
  .scroll-container::-webkit-scrollbar-thumb:hover {
    background-color: #999;
  }
</style>

<!-- JavaScript代码 -->
<script>
  // 选取节点
  const container = document.querySelector('.scroll-container');
  const content = document.querySelector('.scroll-content');
  const bar = document.querySelector('.scroll-bar');
  const thumb = document.querySelector('.scroll-thumb');
  // 发生滚动时,更新滚动条状态
  content.addEventListener('scroll', () => {
    const { scrollTop, scrollHeight, clientHeight } = content;
    const thumbHeight = clientHeight / scrollHeight * clientHeight;
    thumb.style.height = `${thumbHeight}px`;
    thumb.style.transform = `translateY(${scrollTop / scrollHeight * clientHeight}px)`;
  });
</script>

代码解析:

  • HTML结构与前面的例子几乎一致,唯一不同的就是我们需要显示自定义滚动条的样式,因此我们在HTML中添加了滚动条的节点。
  • 在CSS样式中,我们定义了自定义滚动条的样式。我们首先定义了鼠标悬浮在父容器上的滚动条样式。同时,我们使用Pseudo-elements技巧,自定义了Webkit浏览器下的滚动条样式。其中,我们隐藏了滚动条箭头,调整了滚动条宽度和样式,并且处理了滚动条hover时的样式。
  • 在JavaScript代码中,首先选取了HTML中的跟普通例子中不同的节点:.scroll-bar.scroll-thumb,并且在事件监听器中添加了滚动事件的处理程序。