原生js实现自定义滚动条

实现自定义滚动条可以让页面看起来更加美观,并且可以提升用户体验。原生JS实现自定义滚动条的过程是比较复杂的,下面我将提供一份完整攻略。

前期准备

首先,我们需要准备一个带有滚动的内容块和一个用来代替原生滚动条的div。

<div class="scroll-wrapper">
  <div class="scroll-content">
    <!-- 省略部分内容 -->
  </div>
  <div class="scrollbar"></div>
</div>

其中,.scroll-wrapper是内容块的容器,.scroll-content是内容块,.scrollbar是代替原生滚动条的元素,初始时,.scrollbar应当有一个固定的宽度和高度,并且应当位于.scroll-wrapper容器的右侧。

实现滚动事件

接下来,我们需要监听内容块的滚动事件,并且同步滚动条的位置。

const contentEl = document.querySelector('.scroll-content');
const scrollbarEl = document.querySelector('.scrollbar');
const wrapperEl = document.querySelector('.scroll-wrapper');

contentEl.addEventListener('scroll', () => {
  const { scrollTop, scrollHeight, clientHeight } = contentEl;
  const scrollPercent = scrollTop / (scrollHeight - clientHeight) * 100;
  scrollbarEl.style.top = `${scrollPercent}%`;
});

在滚动事件中,我们通过计算当前滚动的百分比来更新滚动条的位置。这里用到了ES6的解构语法,获取了scrollTopscrollHeightclientHeight三个参数。计算当前滚动的百分比时,将scrollTop除以scrollHeight - clientHeight得到,然后将结果乘以100,就能得到当前滚动的百分比了。最后将滚动条的top属性设置为百分比即可。

实现拖动事件

接下来,我们需要实现滚动条的拖动事件。我们可以通过监听滚动条的mousedown事件来启动拖动事件。在拖动事件中,需要计算当前鼠标的位置,根据鼠标的位置计算出滚动条应该到达的位置。

let isDragging = false;
let offset = 0;

scrollbarEl.addEventListener('mousedown', (e) => {
  isDragging = true;
  offset = e.clientY - scrollbarEl.getBoundingClientRect().top;
});

document.addEventListener('mouseup', () => {
  isDragging = false;
});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  const { top: wrapperTop, height: wrapperHeight } = wrapperEl.getBoundingClientRect();
  const barHeight = scrollbarEl.offsetHeight;
  const minY = wrapperTop;
  const maxY = wrapperTop + wrapperHeight - barHeight;
  const newY = e.clientY - offset;

  if (newY < minY) {
    scrollbarEl.style.top = 0;
    contentEl.scrollTop = 0;
    return;
  }

  if (newY > maxY) {
    scrollbarEl.style.top = `${maxY - wrapperTop}px`;
    contentEl.scrollTop = contentEl.scrollHeight;
    return;
  }

  const newScrollTop = (newY - minY) / (maxY - minY) * (contentEl.scrollHeight - contentEl.clientHeight);
  contentEl.scrollTop = newScrollTop;
  scrollbarEl.style.top = `${newY - wrapperTop}px`;
});

在拖动事件中,我们需要计算出滚动条可以拖动的最小值和最大值,然后根据鼠标的位置计算出滚动条应该到达的位置。需要注意的是,判断滚动条的最小和最大值的时候,要考虑滚动条自身的高度。

示例说明

这里提供两个示例。

示例1:垂直方向滚动条

下面这个示例演示了如何实现垂直方向的自定义滚动条。

<div class="scroll-wrapper" style="height: 400px;">
  <div class="scroll-content" style="height: 800px;">
    <!-- 填充内容 -->
  </div>
  <div class="scrollbar" style="width: 8px;"></div>
</div>

这里设置.scroll-wrapper的高度为400px,.scroll-content的高度为800px。滚动条的宽度设置为8px。这样,当内容高度大于容器高度时,就会出现滚动条。

示例2:水平方向滚动条

下面这个示例演示了如何实现水平方向的自定义滚动条。

<div class="scroll-wrapper" style="width: 400px; white-space: nowrap;">
  <div class="scroll-content" style="display: inline-block;">
    <!-- 填充内容 -->
  </div>
  <div class="scrollbar" style="height: 8px;"></div>
</div>

这里需要将.scroll-content设置为display: inline-block,使其不换行。另外,需要将.scroll-wrapper设置为横向滚动。这里将其设置为white-space: nowrap,表示不换行。滚动条的高度设置为8px。这样,当内容宽度大于容器宽度时,就会出现水平方向的滚动条。

总结

以上就是实现自定义滚动条的完整攻略。虽然需要一定的JS基础,但只要按照上述步骤实现,就能轻松地实现自定义滚动条。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js实现自定义滚动条 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • CSS改变网页中鼠标选中文字背景颜色例子

    下面是关于“CSS改变网页中鼠标选中文字背景颜色例子”的完整攻略: 改变网页中鼠标选中文字背景颜色的实现 在网页中,当用户选中了一段文本时,会有一个默认的背景颜色。如果你想改变这个背景颜色,可以使用CSS的::selection伪元素。 示例1 以下示例将鼠标选中文本的背景颜色改为粉色: ::selection { background-color: pin…

    css 2023年6月9日
    00
  • CSS定义字体间距 字体行与行间距

    CSS定义字体间距和行间距的方式有多种,本攻略将会讲解最常用的几种方法。 1. line-height属性 line-height属性可以定义元素的行间距,它的值可以是一个数字、一个百分比数值或normal。当值为数字时,它会乘以元素字体大小,得出最终的行间距。例如,下面的CSS代码将设置段落元素的行间距为1.5倍字体大小: p { font-size: 1…

    css 2023年6月9日
    00
  • webstorm怎么创建php文件?webstorm创建php文件教程以及快捷键大全

    WebStorm 是一款强大的 IDE,它不仅支持 JavaScript,还支持 PHP 等多种编程语言。下面详细讲解如何在 WebStorm 中创建 PHP 文件,以及 WebStorm 的快捷键大全。 创建 PHP 文件 新建项目 在 WebStorm 中创建 PHP 文件需要先新建一个项目: 打开 WebStorm,选择 Create New Proj…

    css 2023年6月9日
    00
  • 宽度高度不固定的div 如何水平居中以及垂直居中

    在网页设计中,我们经常需要将宽度高度不固定的 div 元素水平居中以及垂直居中,以使其更好地适应页面布局。下面是一个完整攻略,包含了如何使用 CSS 将 div 元素水平居中以及垂直居中的过程和两个示例说明。 CSS 如何将 div 元素水平居中以及垂直居中的过程 1. 使用 flexbox 布局 我们可以使用 CSS 的 flexbox 布局来将 div …

    css 2023年5月18日
    00
  • CodeMirror js代码加亮使用总结

    CodeMirror js代码加亮使用总结 CodeMirror是一款非常优秀的js代码编辑器,它支持语法高亮、自动补全、括号匹配、多种主题、多语言支持等功能,是非常适合在Web开发中使用的代码编辑器。 安装 CodeMirror的安装非常容易,你可以在CodeMirror官网下载它的各个版本,也可以使用npm进行安装。 npm install codemi…

    css 2023年6月9日
    00
  • JavaScript和CSS通过expression实现Table居中显示

    首先,我想强调的是,expression是一种非常不建议使用的技术,因为它会在页面加载的时候阻塞渲染,并且会在一些浏览器版本中被禁用。但是,为了回答你的问题,我会提供关于如何使用expression在JavaScript和CSS中实现Table居中显示的方法。 使用JavaScript实现Table居中 首先,我们需要在HTML中定义一个Table,并且添加…

    css 2023年6月10日
    00
  • css静态滤镜 + A:Hover 效果第2/3页

    CSS静态滤镜和A:Hover效果是常见的网页设计技巧。本文将为读者提供CSS静态滤镜和A:Hover的基础知识和实现方法,包含如下内容: CSS静态滤镜的概念和用途 A:Hover的概念和用途 实现CSS静态滤镜和A:Hover效果的步骤 示范1:文本阴影的静态滤镜和A:Hover效果 示范2:图片变亮的静态滤镜和A:Hover效果 1. CSS静态滤镜的…

    css 2023年6月11日
    00
  • CSS中边框使用负边距值的奇技淫巧

    下面详细讲解使用CSS中边框负边距的奇技淫巧: 什么是边框负边距? 边框负边距是指在CSS中将一个元素的边框向内缩进并移出元素区域的一种奇技淫巧。通常情况下元素的边框是在元素周围的,而边框负边距则使得边框向内移动,并可能会出现在元素内部。 边框负边距的语法 border: [border-width] [border-style] [border-color…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部