原生js实现模拟滚动条

yizhihongxing

原生JS实现模拟滚动条,可以采用以下步骤:

步骤1:制作滚动条的HTML结构

在HTML中,需要设置滚动条容器和内容区域,其中内容区域可以设置固定高度,让内容超出内容区域,从而出现滚动条。

HTML结构示例代码如下:

<div class="scroll-box">
  <div class="scroll-content" style="height: 200px;">
    <!-- 填充内容 -->
  </div>
  <div class="scroll-bar">
    <div class="scroll-thumb"></div>
  </div>
</div>

在上述代码中,.scroll-box是滚动条容器,.scroll-content是内容区域,.scroll-bar是滚动条,.scroll-thumb是滚动条拖动块。

步骤2:制作滚动条的CSS样式

为了让滚动条实现滚动效果,需要设置.scroll-contentoverflow属性为hidden,将内容区域的滚动条隐藏。同时,需要设置.scroll-bar.scroll-thumb的样式,使其能够模拟原生滚动条的外观和拖动效果。

CSS样式示例代码如下:

.scroll-box {
  height: 200px;
  width: 300px;
  position: relative;
}

.scroll-content {
  overflow: hidden;
}

.scroll-bar {
  height: 100%;
  width: 10px;
  position: absolute;
  top: 0;
  right: 0;
  background-color: #f1f1f1;
}

.scroll-thumb {
  height: 50px;
  width: 100%;
  position: relative;
  top: 0;
  background-color: #888;
  border-radius: 5px;
}

在上述代码中,.scroll-box的高度和宽度是固定的,.scroll-contentoverflow属性为hidden,使得内容区域的滚动条隐藏。.scroll-bar是滚动条,其宽度和位置是与容器的宽度和位置对应的。.scroll-thumb是滚动条的拖动块,其高度是根据内容区域的高度和容器的高度进行计算得到的。

步骤3:实现滚动条的滚动效果

为了实现滚动条的滚动效果,需要为其添加事件监听器,当拖动滑块时,通过计算拖动块在滚动条容器中的位置,然后将内容区域的scrollTop设置为相应的值,实现滚动条的滚动效果。

JavaScript示例代码如下:

var scrollBox = document.querySelector(".scroll-box");
var scrollContent = document.querySelector(".scroll-content");
var scrollBar = document.querySelector(".scroll-bar");
var scrollThumb = document.querySelector(".scroll-thumb");

function initScroll() {
  var contentHeight = scrollContent.offsetHeight;
  var boxHeight = scrollBox.offsetHeight;
  var barHeight = boxHeight * boxHeight / contentHeight;
  var thumbHeight = barHeight > 50 ? barHeight : 50;

  scrollBar.style.height = barHeight + "px";
  scrollThumb.style.height = thumbHeight + "px";

  scrollThumb.addEventListener("mousedown", function(e) {
    e.preventDefault();
    var startY = e.clientY;
    var startTop = this.offsetTop;
    var barHeight = scrollBar.offsetHeight;
    var thumbHeight = this.offsetHeight;
    var maxTop = barHeight - thumbHeight;
    var contentHeight = scrollContent.offsetHeight;
    var boxHeight = scrollBox.offsetHeight;

    document.addEventListener("mousemove", function(e) {
      e.preventDefault();
      var offsetY = e.clientY - startY;
      var distance = offsetY + startTop;
      var percentage = distance / maxTop;
      var scrollTop = percentage * (contentHeight - boxHeight);

      if (distance < 0) {
        distance = 0;
      }
      if (distance > maxTop) {
        distance = maxTop;
      }

      this.top = distance;
      scrollContent.scrollTop = scrollTop;
    });
  });

  document.addEventListener("mouseup", function(e) {
    document.removeEventListener("mousemove");
  });
}

initScroll();

在上述代码中,initScroll()用于初始化滚动条,计算滚动条高度,根据计算得到的高度设置滚动条和拖动块的高度。.scroll-thumb添加鼠标按下事件监听器,当拖动滑块时,通过计算拖动块在滚动条容器中的位置,然后将内容区域的scrollTop设置为相应的值,实现滚动条的滚动效果。同时,需要添加鼠标松开事件监听器,取消鼠标移动事件监听器,确保只有在拖动时才会触发滚动效果。

示例1:垂直滚动条

下面给出一个垂直滚动条的示例代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>垂直滚动条示例</title>
  <style>
    .scroll-box {
      height: 200px;
      width: 300px;
      position: relative;
    }

    .scroll-content {
      overflow: hidden;
    }

    .scroll-bar {
      height: 100%;
      width: 10px;
      position: absolute;
      top: 0;
      right: 0;
      background-color: #f1f1f1;
    }

    .scroll-thumb {
      height: 50px;
      width: 100%;
      position: relative;
      top: 0;
      background-color: #888;
      border-radius: 5px;
    }
  </style>
</head>
<body>
  <div class="scroll-box">
    <div class="scroll-content" style="height: 400px;">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi at felis a magna malesuada placerat. Sed in nulla vel massa accumsan dapibus ut at nisl. Donec eget rutrum tortor. Praesent commodo, arcu at lacinia dictum, risus sapien varius elit, a rhoncus nunc metus ac nulla. Nullam a lacinia odio, a interdum lorem. Nulla ut ligula non quam vehicula lobortis. Phasellus viverra ante a enim blandit laoreet. Sed bibendum, arcu eu egestas luctus, ipsum magna volutpat sem, vitae ultrices ipsum diam a arcu. Suspendisse potenti. Donec id felis eget augue tempor sagittis.</p>
    </div>
    <div class="scroll-bar">
      <div class="scroll-thumb"></div>
    </div>
  </div>

  <script>
    var scrollBox = document.querySelector(".scroll-box");
    var scrollContent = document.querySelector(".scroll-content");
    var scrollBar = document.querySelector(".scroll-bar");
    var scrollThumb = document.querySelector(".scroll-thumb");

    function initScroll() {
      var contentHeight = scrollContent.offsetHeight;
      var boxHeight = scrollBox.offsetHeight;
      var barHeight = boxHeight * boxHeight / contentHeight;
      var thumbHeight = barHeight > 50 ? barHeight : 50;

      scrollBar.style.height = barHeight + "px";
      scrollThumb.style.height = thumbHeight + "px";

      scrollThumb.addEventListener("mousedown", function(e) {
        e.preventDefault();
        var startY = e.clientY;
        var startTop = this.offsetTop;
        var barHeight = scrollBar.offsetHeight;
        var thumbHeight = this.offsetHeight;
        var maxTop = barHeight - thumbHeight;
        var contentHeight = scrollContent.offsetHeight;
        var boxHeight = scrollBox.offsetHeight;

        document.addEventListener("mousemove", function(e) {
          e.preventDefault();
          var offsetY = e.clientY - startY;
          var distance = offsetY + startTop;
          var percentage = distance / maxTop;
          var scrollTop = percentage * (contentHeight - boxHeight);

          if (distance < 0) {
            distance = 0;
          }
          if (distance > maxTop) {
            distance = maxTop;
          }

          this.top = distance;
          scrollContent.scrollTop = scrollTop;
        });
      });

      document.addEventListener("mouseup", function(e) {
        document.removeEventListener("mousemove");
      });
    }

    initScroll();
  </script>
</body>
</html>

在上述代码中,设置内容区域的高度为400px,超出滚动条容器的高度200px,因此出现了垂直滚动条。

示例2:水平滚动条

下面给出一个水平滚动条的示例代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>水平滚动条示例</title>
  <style>
    .scroll-box {
      height: 200px;
      width: 300px;
      position: relative;
    }

    .scroll-content {
      overflow: hidden;
      white-space: nowrap;
    }

    .scroll-bar {
      height: 10px;
      width: 100%;
      position: absolute;
      bottom: 0;
      left: 0;
      background-color: #f1f1f1;
    }

    .scroll-thumb {
      height: 100%;
      width: 50px;
      position: absolute;
      left: 0;
      background-color: #888;
      border-radius: 5px;
    }
  </style>
</head>
<body>
  <div class="scroll-box">
    <div class="scroll-content" style="width: 600px;">
      <p style="display: inline-block;">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi at felis a magna malesuada placerat. Sed in nulla vel massa accumsan dapibus ut at nisl. Donec eget rutrum tortor. Praesent commodo, arcu at lacinia dictum, risus sapien varius elit, a rhoncus nunc metus ac nulla. Nullam a lacinia odio, a interdum lorem. Nulla ut ligula non quam vehicula lobortis. Phasellus viverra ante a enim blandit laoreet. Sed bibendum, arcu eu egestas luctus, ipsum magna volutpat sem, vitae ultrices ipsum diam a arcu. Suspendisse potenti. Donec id felis eget augue tempor sagittis.</p>
    </div>
    <div class="scroll-bar">
      <div class="scroll-thumb"></div>
    </div>
  </div>

  <script>
    var scrollBox = document.querySelector(".scroll-box");
    var scrollContent = document.querySelector(".scroll-content");
    var scrollBar = document.querySelector(".scroll-bar");
    var scrollThumb = document.querySelector(".scroll-thumb");

    function initScroll() {
      var contentWidth = scrollContent.offsetWidth;
      var boxWidth = scrollBox.offsetWidth;
      var barWidth = boxWidth * boxWidth / contentWidth;
      var thumbWidth = barWidth > 50 ? barWidth : 50;

      scrollBar.style.width = barWidth + "px";
      scrollThumb.style.width = thumbWidth + "px";

      scrollThumb.addEventListener("mousedown", function(e) {
        e.preventDefault();
        var startX = e.clientX;
        var startLeft = this.offsetLeft;
        var barWidth = scrollBar.offsetWidth;
        var thumbWidth = this.offsetWidth;
        var maxLeft = barWidth - thumbWidth;
        var contentWidth = scrollContent.offsetWidth;
        var boxWidth = scrollBox.offsetWidth;

        document.addEventListener("mousemove", function(e) {
          e.preventDefault();
          var offsetX = e.clientX - startX;
          var distance = offsetX + startLeft;
          var percentage = distance / maxLeft;
          var scrollLeft = percentage * (contentWidth - boxWidth);

          if (distance < 0) {
            distance = 0;
          }
          if (distance > maxLeft) {
            distance = maxLeft;
          }

          this.left = distance;
          scrollContent.scrollLeft = scrollLeft;
        });
      });

      document.addEventListener("mouseup", function(e) {
        document.removeEventListener("mousemove");
      });
    }

    initScroll();
  </script>
</body>
</html>

在上述代码中,设置了.scroll-contentwhite-space属性为nowrap,让文本不自动换行,从而撑满了整个.scroll-box。设置了.scroll-bar.scroll-thumb的高度和宽度为10px和50px,使其可以模拟水平滚动条的效果。

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

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

相关文章

  • CSS鼠标点击改变图片透明度

    下面是如何通过CSS实现鼠标点击改变图片透明度的攻略: 准备工作 首先,需要添加一张需要变换透明度的图片和一些基本的HTML代码。以修改透明度的图片为例,我们可以这样写: <!DOCTYPE html> <html> <head> <title>CSS鼠标点击改变图片透明度</title> <…

    css 2023年6月10日
    00
  • 详解CSS3 用border写 空心三角箭头 (两种写法)

    下面我将详细讲解“详解CSS3 用border写空心三角箭头 (两种写法)”的完整攻略。 首先,创建一个HTML文档,并添加一个指向CSS文件的链接。然后,在CSS中,我们可以使用两种方法来用border属性创建一个空心三角箭头。 方法一: .arrow { width: 0; height: 0; border-top: 10px solid transp…

    css 2023年6月10日
    00
  • 分享CSS3中必须要知道的10个顶级命令

    当提到CSS3时,许多人会想到它的一些令人兴奋的特性,如圆角边框、阴影和渐变。但除了这些新特性外,CSS3还引入了许多与核心语言中的基本语法和规程相关的新属性和选项。在本文中,我们将讨论那些必须掌握的CSS3顶级命令,这些命令将有助于提高Web开发人员的技能。下面是分享CSS3中需要知道的10个顶级命令。 1. border-radius border-ra…

    css 2023年6月9日
    00
  • CSS属性选择器的四种格式

    当开发者需要对页面中特定属性的元素进行样式设定时,就可以使用CSS属性选择器。CSS属性选择器可以根据元素的属性值或属性存在性来选择对应的元素进行样式设定。在CSS中,属性选择器有四种格式,分别是简单属性选择器、子串匹配选择器、属性值匹配选择器和属性值包含选择器。 简单属性选择器 简单属性选择器可以根据元素的某个特定属性的值选取对应元素进行样式的设定。下面是…

    css 2023年6月9日
    00
  • 何为XHTML??

    XHTML是一种标记语言,是HTML的升级版本。它使用XML的语法,更加严格和结构化,可以为网站提供更好的标记和可访问性,也便于计算机处理和解析,同时也支持更多的扩展和样式控制。 XHTML文档的语法要求严格,必须包含DTD(DocType Declaration),并将HTML标签转换为小写字母。同时还需要避免一些HTML中不规范的语法,如缺失标签闭合、属…

    css 2023年6月9日
    00
  • 一个精简的JS DIV层tab切换代码

    下面是一个精简的JS DIV层tab切换代码的完整攻略。 什么是DIV层tab切换? 在网站中,为了将内容进行分类,我们会将内容放在不同的tab标签中,这些标签可以通过切换来显示不同的内容区域。而DIV层tab切换就是一种常见的实现方式,它基于DIV层和JavaScript代码来完成。 如何实现DIV层tab切换? 首先,我们需要在HTML中添加DIV标签,…

    css 2023年6月11日
    00
  • CSS画心形的三种方法

    下面是CSS画心形的三种方法的完整攻略: 第一种方法:使用border-radius属性 这种方法我们可以使用border-radius属性,它可以创建不同的圆角形状,当我们把左右两个圆角加大时,就可以形成心形了。下面是示例代码: .heart { width: 100px; height: 100px; background-color: red; bor…

    css 2023年6月10日
    00
  • jQuery插件-jRating评分插件源码分析及使用方法

    jQuery插件-jRating评分插件源码分析及使用方法 jRating评分插件介绍 jRating评分插件是一款jQuery评分插件,它可以让用户对一个对象进行打分,非常实用。相比大部分jQuery评分插件,jRating评分插件更加轻便,易于使用和定制。它使用CSS和DOM处理来改变HTML元素的外观和表现。 jRating评分插件的特点 简单易用。 …

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