JS自定义滚动条效果简单实现代码

这里为大家详细讲解一下JS自定义滚动条效果的实现。下面将分为以下几个步骤:

  1. 准备HTML结构
<div class="content-wrap">
  <div class="content">
    <!--此处为内容区域-->
  </div>
</div>

其中,.content-wrap为滚动条的父级容器,.content为需要滚动的内容。

  1. 添加样式

通过CSS来完成滚动条的样式,具体代码如下:

/*容器样式*/
.content-wrap {
  position: relative;
  height: 300px;
  overflow: hidden;
}
/*内容样式*/
.content {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
}
/*滚动条轨道*/
.scrollbar-track {
  position: absolute;
  right: 0;
  top: 0;
  width: 5px;
  height: 100%;
  background-color: #f2f2f2;
  border-radius: 2.5px;
}
/*滚动条滑块*/
.scrollbar-thumb {
  position: absolute;
  right: 0;
  top: 0;
  width: 5px;
  height: 50px;
  background-color: #333;
  border-radius: 3px;
  cursor: pointer;
}

这里为滚动条添加了两个元素,.scrollbar-track为轨道,.scrollbar-thumb为滑块。

  1. 编写JS代码

首先需要通过JS获取到滑块和轨道元素,然后监听滑块的拖拽事件,实现滑块的位置和内容区域的滚动。具体代码如下:

//获取元素
var wrap = document.querySelector('.content-wrap');
var content = document.querySelector('.content');
var track = document.createElement('div');
var thumb = document.createElement('div');
track.className = 'scrollbar-track';
thumb.className = 'scrollbar-thumb';
track.appendChild(thumb);
wrap.appendChild(track);

//拖拽事件
var startY, startTop, moveY, endY;
thumb.addEventListener('mousedown', function (e) {
  startY = e.clientY;
  startTop = parseInt(getComputedStyle(thumb).top);
  document.addEventListener('mousemove', move);
  document.addEventListener('mouseup', end);
  e.stopPropagation();
  e.preventDefault();
}, false);

function move(e) {
  moveY = e.clientY;
  var offsetY = moveY - startY;
  var top = startTop + offsetY;
  if (top < 0) {
    top = 0;
  } else if (top > track.offsetHeight - thumb.offsetHeight) {
    top = track.offsetHeight - thumb.offsetHeight;
  }
  var contentTop = top / (track.offsetHeight - thumb.offsetHeight) * (content.offsetHeight - wrap.offsetHeight);
  content.style.top = -contentTop + 'px';
  thumb.style.top = top + 'px';
}

function end() {
  document.removeEventListener('mousemove', move);
  document.removeEventListener('mouseup', end);
}

代码中,首先创建了轨道和滑块的DOM节点,并将它们添加至滚动条父容器中。然后监听了滑块的mousedown事件,处理滑块的拖拽过程与滑块的位置,同时根据滑块的位置来滚动内容区域。在拖拽过程中监听了鼠标的mousemove和mouseup事件,并移除了这些事件的监听,防止冲突。

  1. 实例说明

以下为两个示例,一个为垂直方向的滚动条,一个为水平方向的滚动条,供大家参考:

(1)垂直方向的滚动条

<style>
  .content-wrap {
    position: relative;
    height: 300px;
    overflow: hidden;
  }
  .content {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
  }
  .scrollbar-track {
    position: absolute;
    right: 0;
    top: 0;
    width: 5px;
    height: 100%;
    background-color: #f2f2f2;
    border-radius: 2.5px;
  }
  .scrollbar-thumb {
    position: absolute;
    right: 0;
    top: 0;
    width: 5px;
    height: 50px;
    background-color: #333;
    border-radius: 3px;
    cursor: pointer;
  }
</style>
<div class="content-wrap">
  <div class="content">
    <p>这是一段很长的文本。</p>
    <p>这是一段很长的文本。</p>
    <p>这是一段很长的文本。</p>
    <p>这是一段很长的文本。</p>
    <p>这是一段很长的文本。</p>
    <p>这是一段很长的文本。</p>
    <p>这是一段很长的文本。</p>
    <p>这是一段很长的文本。</p>
  </div>
</div>
<script>
  var wrap = document.querySelector('.content-wrap');
  var content = document.querySelector('.content');
  var track = document.createElement('div');
  var thumb = document.createElement('div');
  track.className = 'scrollbar-track';
  thumb.className = 'scrollbar-thumb';
  track.appendChild(thumb);
  wrap.appendChild(track);

  var startY, startTop, moveY, endY;
  thumb.addEventListener('mousedown', function (e) {
    startY = e.clientY;
    startTop = parseInt(getComputedStyle(thumb).top);
    document.addEventListener('mousemove', move);
    document.addEventListener('mouseup', end);
    e.stopPropagation();
    e.preventDefault();
  }, false);

  function move(e) {
    moveY = e.clientY;
    var offsetY = moveY - startY;
    var top = startTop + offsetY;
    if (top < 0) {
      top = 0;
    } else if (top > track.offsetHeight - thumb.offsetHeight) {
      top = track.offsetHeight - thumb.offsetHeight;
    }
    var contentTop = top / (track.offsetHeight - thumb.offsetHeight) * (content.offsetHeight - wrap.offsetHeight);
    content.style.top = -contentTop + 'px';
    thumb.style.top = top + 'px';
  }

  function end() {
    document.removeEventListener('mousemove', move);
    document.removeEventListener('mouseup', end);
  }
</script>

(2)水平方向的滚动条

<style>
  .content-wrap {
    position: relative;
    width: 500px;
    height: 100px;
    overflow: hidden;
  }
  .content {
    position: absolute;
    left: 0;
    top: 0;
    height: 100%;
    white-space: nowrap;
  }
  .scrollbar-track {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 5px;
    background-color: #f2f2f2;
    border-radius: 2.5px;
  }
  .scrollbar-thumb {
    position: absolute;
    left: 0;
    bottom: 0;
    width: 50px;
    height: 5px;
    background-color: #333;
    border-radius: 3px;
    cursor: pointer;
  }
</style>
<div class="content-wrap">
  <div class="content">
    <span>水平</span>
    <span>方向</span>
    <span>滚动</span>
    <span>条的</span>
    <span>实现</span>
    <span>代码</span>
    <span>示例</span>
  </div>
</div>
<script>
  var wrap = document.querySelector('.content-wrap');
  var content = document.querySelector('.content');
  var track = document.createElement('div');
  var thumb = document.createElement('div');
  track.className = 'scrollbar-track';
  thumb.className = 'scrollbar-thumb';
  track.appendChild(thumb);
  wrap.appendChild(track);

  var startX, startLeft, moveX, endX;
  thumb.addEventListener('mousedown', function (e) {
    startX = e.clientX;
    startLeft = parseInt(getComputedStyle(thumb).left);
    document.addEventListener('mousemove', move);
    document.addEventListener('mouseup', end);
    e.stopPropagation();
    e.preventDefault();
  }, false);

  function move(e) {
    moveX = e.clientX;
    var offsetX = moveX - startX;
    var left = startLeft + offsetX;
    if (left < 0) {
      left = 0;
    } else if (left > track.offsetWidth - thumb.offsetWidth) {
      left = track.offsetWidth - thumb.offsetWidth;
    }
    var contentLeft = left / (track.offsetWidth - thumb.offsetWidth) * (content.offsetWidth - wrap.offsetWidth);
    content.style.left = -contentLeft + 'px';
    thumb.style.left = left + 'px';
  }

  function end() {
    document.removeEventListener('mousemove', move);
    document.removeEventListener('mouseup', end);
  }
</script>

希望这篇攻略能够帮助到大家实现JS自定义滚动条效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS自定义滚动条效果简单实现代码 - Python技术站

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

相关文章

  • CSS实现单行、多行文本溢出显示省略号的实现方法

    下面我来详细讲解CSS实现单行、多行文本溢出显示省略号的实现方法。 一、单行文本溢出显示省略号的实现方法 实现单行文本溢出显示省略号的方法是通过增加CSS属性text-overflow来控制文本的溢出效果。 .single-line { white-space: nowrap; /* 禁止换行 */ overflow: hidden; /* 隐藏文本溢出部分…

    css 2023年6月10日
    00
  • jb51站长推荐的用js实现的多浏览器支持的图片轮换展示效果ie,firefox

    实现多浏览器支持的图片轮换展示效果并不难,下面是实现的步骤: 定义HTML结构和CSS样式 要实现多图片轮换展示效果,我们需要先定义一个包含图片和指示器 (indicator) 的结构。指示器指的是图片轮换时底部圆点的样式。代码如下所示: <div class="carousel"> <div class="s…

    css 2023年6月11日
    00
  • 手把手教你实现一个canvas智绘画板的方法

    手把手教你实现一个canvas智绘画板的方法 Canvas是HTML5中新增加的绘图标签,可以通过JavaScript脚本动态绘制图形,图形包括线条、路径、矩形、圆形、字符和图片等。本文将手把手教你实现一个canvas智绘画板的方法。 1. 准备工作 在编写代码之前,需要先准备好开发环境。我们需要一个文本编辑器,例如Visual Studio Code,以及…

    css 2023年6月9日
    00
  • JS运动改变单物体透明度的方法分析

    关于“JS运动改变单物体透明度的方法分析”的完整攻略,我先做一个简要的说明: 通常我们改变单个元素的透明度,可以使用CSS中的opacity属性,但如果要实现透明度的过渡效果,则需要使用JavaScript来操作。而在运动改变单物体透明度的方法中,也涉及到了一些计算和设计。 下面,我会具体分析两个示例,以更清晰地说明如何运用JavaScript来改变单个元素…

    css 2023年6月10日
    00
  • 多行图片hover加边框会把下面的图片挤到别处的解决方法

    针对“多行图片hover加边框会把下面的图片挤到别处”的问题,我们可以采取以下两种方法来解决。 方法一:为图片加上占位符 我们可以在HTML中为每个图片设置一个确定的大小,并填充占位符。这样可以确保在图片hover加边框时,不会引起其他图片位置的变化。 假设我们有以下的HTML代码: <div class="image-container&q…

    css 2023年6月10日
    00
  • CSS3中的Media Queries学习笔记

    CSS3中的Media Queries学习笔记 什么是Media Queries Media Queries 是 CSS3 中的一个重要特性,它允许我们根据设备的特性(如屏幕宽度、高度、方向、分辨率等)来应用不同的样式。通过使用 Media Queries,我们可以为不同的设备提供不同的样式,从而实现响应式设计。 Media Queries 的语法 Medi…

    css 2023年5月18日
    00
  • 纯CSS3实现8组超炫酷鼠标滑过图片动画

    以下是详细讲解“纯CSS3实现8组超炫酷鼠标滑过图片动画”的完整攻略。 简介 这是一篇介绍如何利用CSS3实现鼠标滑过图片动画效果的攻略,其中包括了8种不同的动画效果。这些动画都是纯CSS3实现的,非常简单易懂。 实现方式 鼠标滑过图片动画的实现,主要依靠CSS3中的transition和transform属性。transition属性可以设置元素从一个状态…

    css 2023年6月10日
    00
  • 初探CSS3中的calc()功能

    初探CSS3中的calc()功能 CSS3中提供了calc()函数,它可以帮助我们在CSS中执行简单的算术运算。这个功能让我们可以轻松地计算出元素的宽度、高度或偏移量,使CSS写作更加灵活。 语法 calc()函数可以包含任何长度、频率、角度、时间或数字值,支持四种基本算术运算符(加、减、乘、除)和括号。 计算长度 当我们需要计算元素的宽度或高度时,可以使用…

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