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

yizhihongxing

这里为大家详细讲解一下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日

相关文章

  • jQuery Pagination分页插件使用方法详解

    jQuery Pagination分页插件使用方法详解 简介 jQuery Pagination是一个可以创建分页效果的 jQuery 插件,用户可以设置分页的样式、每页显示数量、数据总条数等,非常方便实用。本文将详细介绍如何使用该插件。 安装 该插件可以通过以下两种方式进行安装: CDN 引入 在html文件中,你可以通过引入以下两条CDN来在项目中使用j…

    css 2023年6月9日
    00
  • javascript实现点击图片切换功能

    下面是详细讲解“JavaScript实现点击图片切换功能”的完整攻略。 1、HTML结构 如下所示的HTML结构中,我们将用JavaScript来实现当用户点击左侧的小图时,右侧显示对应的大图。 <div> <div class="thumbnails"> <img src="small-1.jpg…

    css 2023年6月11日
    00
  • CSS控制图片大小-适应宽度

    当我们在网页中插入一张图片时,为了避免图片超出页面边框或者不够美观,我们需要控制图片的大小。其中一种方法就是通过CSS来实现图片大小的适应。 以下是实现的具体步骤: 添加CSS样式 我们可以使用CSS语句指定图片的最大宽度,这样当图片的原始大小超出限制时,图片会自动缩小以符合最大宽度的限制。CSS代码如下: img { max-width: 100%; he…

    css 2023年6月10日
    00
  • VsCode插件整理(小结)

    VsCode插件整理(小结) Visual Studio Code是一款强大的跨平台代码编辑器,拥有丰富的插件生态系统。这些插件可以帮助开发人员更高效地编写代码和管理项目。在这篇文章中,我们将整理一些常用的VsCode插件,包括它们的功能、使用方法和示例。 插件列表 在这里,我们将列举几个常用的VsCode插件,并给出它们的详细介绍。 1. Bracket …

    css 2023年6月9日
    00
  • 8款非常棒的响应式jQuery 幻灯片插件推荐

    8款非常棒的响应式jQuery 幻灯片插件推荐 1. 插件概述 在现代 Web 设计中,响应式设计和幻灯片展示已成为必不可少的元素。为了满足这方面的需求,开发人员们开发了一系列优秀的响应式 jQuery 幻灯片插件,这些插件提供了各种不同的功能和效果。 本文将介绍 8 款非常棒的响应式 jQuery 幻灯片插件,你可以根据你的项目需求来选择合适的。 2. 插…

    css 2023年6月11日
    00
  • asp.net在后端动态添加样式表调用的方法

    在ASP.NET后端动态添加样式表一般有以下两种常用方法: 1. 直接在后端代码中添加样式 示例代码如下: protected void Page_Load(object sender, EventArgs e) { Label myLabel = new Label(); myLabel.ID = "myID"; myLabel.Tex…

    css 2023年6月9日
    00
  • JS实现旋转木马轮播案例

    下面是“JS实现旋转木马轮播案例”的完整攻略。 1. 实现思路 旋转木马轮播是一种经典的网页轮播效果,它可以让网页图片或广告在用户浏览页面的时候循环地进行滚动展示。实现旋转木马轮播的思路大致如下: 定义一个容器用于显示图片或广告; 通过 CSS 定义容器的宽度、高度、布局等样式属性; 在容器中插入图片或广告,并将它们排列在一个同心圆上; 通过 JavaScr…

    css 2023年6月10日
    00
  • 微信小程序wxss如何引用外部CSS文件以及iconfont

    微信小程序wxss引用外部CSS文件以及iconfont的方法如下: 引用外部CSS文件 在小程序的根目录(通常是项目名称)中创建一个新文件夹,例如:styles。 在styles文件夹中创建一个新的CSS文件,例如:global.css。 在global.css中编写CSS样式代码。 在需要使用global.css样式的WXSS文件中使用@import引入…

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