JS实现可用滑块滑动的缓动图代码

下面是详细讲解“JS实现可用滑块滑动的缓动图代码”的攻略:

1. 引入JavaScript库

首先需要引入JavaScript库,包括jQuery和TweenMax。jQuery是一款非常流行的JavaScript库,它提供了各种各样的DOM操作和事件处理方法,而TweenMax是一款动画库,可以很方便地实现各种动画效果。

2. 设置HTML元素

接下来需要设置HTML元素,包括容器元素和滑块元素。容器元素用于显示缓动图,滑块元素用于拖拽控制。

<div class="container">
  <div class="scrollbar"></div>
</div>

这里使用了两个class,一个是.container,表示容器元素,一个是.scrollbar,表示滑块元素。

3. 设置样式

为了让容器元素和滑块元素显示效果更加美观,需要设置一些样式。

.container {
  width: 600px;
  height: 400px;
  overflow: hidden;
  position: relative;
  margin: 0 auto;
}

.scrollbar {
  width: 50px;
  height: 50px;
  background-color: #333;
  border-radius: 50%;
  cursor: move;
  position: absolute;
  top: 0;
  left: 0;
}

这里设置了容器元素的宽度和高度,以及overflow属性为hidden,表示超出容器的内容不显示。滑块元素设置了初始的宽度和高度,以及背景颜色、边界半径等样式。位置使用了绝对定位,并将top和left属性设置为0,使得滑块初始位置处于容器左上角。

4. 实现滑块拖拽

接下来需要实现滑块的拖拽功能,使用jQuery提供的鼠标事件处理方法。

var isDragging = false;
var initX = 0, initY = 0;
var dragX = 0, dragY = 0;
var scrollbar = $('.scrollbar');

scrollbar.mousedown(function(e) {
  isDragging = true;
  initX = e.pageX - dragX;
  initY = e.pageY - dragY;
});

$(document).mousemove(function(e) {
  if (isDragging) {
    dragX = e.pageX - initX;
    dragY = e.pageY - initY;

    var container = $('.container');
    var maxX = container.width() - scrollbar.width();
    var maxY = container.height() - scrollbar.height();
    dragX = Math.max(0, Math.min(dragX, maxX));
    dragY = Math.max(0, Math.min(dragY, maxY));

    scrollbar.css({left: dragX, top: dragY});
  }
});

$(document).mouseup(function() {
  isDragging = false;
});

这里使用了mousedown、mousemove和mouseup三种事件处理方法。当鼠标按下时设定isDragging标记为true,并记录当前的鼠标坐标和滑块坐标。在鼠标移动时,通过计算鼠标移动的距离和滑块初始位置来更新滑块的位置。同时需要进行一些边界判断,确保滑块不会移出容器范围。

最后,在鼠标抬起时设定isDragging标记为false。

5. 实现缓动效果

接下来可以使用TweenMax库来实现缓动效果。首先需要计算出滑块位置对应的缓动参数,然后使用TweenMax的to方法,将缓动参数作为参数传入并指定运动时间。

var scrollPercent = 0;
var position = 0;

function updatePosition() {
  var container = $('.container');
  var contentHeight = container.height();
  var currentScroll = scrollbar.position().top;
  scrollPercent = currentScroll / (contentHeight - scrollbar.height());
  position = -1 * (contentHeight - container.height()) * scrollPercent;
}

function animateScrollbar() {
  updatePosition();

  TweenMax.to(scrollbar, .5, {
    top: position,
    onComplete: function() {
      isDragging = false;
    }
  });
}

scrollbar.on('mousedown', function() {
  isDragging = true;
});

scrollbar.on('mouseup', animateScrollbar);

$(document).on('mousemove', function(e) {
  if (isDragging) {
    position = e.clientY - $('.container').offset().top;
    animateScrollbar();
  }
});

这里先定义了updatePosition方法,用于计算滑块位置对应的缓动参数。具体来说,首先获取容器元素的高度和当前滑块的位置,然后计算滑块的位置百分比,最后通过容器元素的高度和百分比计算出内容需要偏移的大小。

接着定义animateScrollbar方法,用于实现缓动效果。先调用updatePosition方法计算滑块位置对应的缓动参数,然后调用TweenMax的to方法,将滑块元素和缓动参数作为参数传入,并指定运动时间。运动完成后设定isDragging标记为false。

最后在mousedown、mouseup和mousemove三种事件处理方法中调用animateScrollbar方法来实现缓动效果。

6. 示例说明

这里提供两个示例说明,第一个示例为横向缓动图,第二个示例为纵向缓动图。

示例1:横向缓动图

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Horizontal Demo</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.0.2/TweenMax.min.js"></script>
  <style type="text/css">
    .container {
      width: 600px;
      height: 400px;
      overflow: hidden;
      position: relative;
      margin: 0 auto;
    }

    .scrollbar {
      width: 50px;
      height: 50px;
      background-color: #333;
      border-radius: 50%;
      cursor: move;
      position: absolute;
      top: 0;
      left: 0;
    }
  </style>
  <script type="text/javascript">
    var isDragging = false;
    var initX = 0, initY = 0;
    var dragX = 0, dragY = 0;
    var scrollbar = $('.scrollbar');

    scrollbar.mousedown(function(e) {
      isDragging = true;
      initX = e.pageX - dragX;
      initY = e.pageY - dragY;
    });

    $(document).mousemove(function(e) {
      if (isDragging) {
        dragX = e.pageX - initX;
        dragY = e.pageY - initY;

        var container = $('.container');
        var maxX = container.width() - scrollbar.width();
        var maxY = container.height() - scrollbar.height();
        dragX = Math.max(0, Math.min(dragX, maxX));
        dragY = Math.max(0, Math.min(dragY, maxY));

        scrollbar.css({left: dragX, top: dragY});
      }
    });

    $(document).mouseup(function() {
      isDragging = false;
    });

    var scrollPercent = 0;
    var position = 0;

    function updatePosition() {
      var container = $('.container');
      var contentWidth = container.width();
      var currentScroll = scrollbar.position().left;
      scrollPercent = currentScroll / (contentWidth - scrollbar.width());
      position = -1 * (contentWidth - container.width()) * scrollPercent;
    }

    function animateScrollbar() {
      updatePosition();

      TweenMax.to(scrollbar, .5, {
        left: position,
        onComplete: function() {
          isDragging = false;
        }
      });
    }

    scrollbar.on('mousedown', function() {
      isDragging = true;
    });

    scrollbar.on('mouseup', animateScrollbar);

    $(document).on('mousemove', function(e) {
      if (isDragging) {
        position = e.clientX - $('.container').offset().left;
        animateScrollbar();
      }
    });
  </script>
</head>
<body>
  <div class="container">
    <div class="scrollbar"></div>
  </div>
</body>
</html>

示例2:纵向缓动图

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Vertical Demo</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.0.2/TweenMax.min.js"></script>
  <style type="text/css">
    .container {
      width: 400px;
      height: 600px;
      overflow: hidden;
      position: relative;
      margin: 0 auto;
    }

    .scrollbar {
      width: 50px;
      height: 50px;
      background-color: #333;
      border-radius: 50%;
      cursor: move;
      position: absolute;
      top: 0;
      left: 0;
    }
  </style>
  <script type="text/javascript">
    var isDragging = false;
    var initX = 0, initY = 0;
    var dragX = 0, dragY = 0;
    var scrollbar = $('.scrollbar');

    scrollbar.mousedown(function(e) {
      isDragging = true;
      initX = e.pageX - dragX;
      initY = e.pageY - dragY;
    });

    $(document).mousemove(function(e) {
      if (isDragging) {
        dragX = e.pageX - initX;
        dragY = e.pageY - initY;

        var container = $('.container');
        var maxX = container.width() - scrollbar.width();
        var maxY = container.height() - scrollbar.height();
        dragX = Math.max(0, Math.min(dragX, maxX));
        dragY = Math.max(0, Math.min(dragY, maxY));

        scrollbar.css({left: dragX, top: dragY});
      }
    });

    $(document).mouseup(function() {
      isDragging = false;
    });

    var scrollPercent = 0;
    var position = 0;

    function updatePosition() {
      var container = $('.container');
      var contentHeight = container.height();
      var currentScroll = scrollbar.position().top;
      scrollPercent = currentScroll / (contentHeight - scrollbar.height());
      position = -1 * (contentHeight - container.height()) * scrollPercent;
    }

    function animateScrollbar() {
      updatePosition();

      TweenMax.to(scrollbar, .5, {
        top: position,
        onComplete: function() {
          isDragging = false;
        }
      });
    }

    scrollbar.on('mousedown', function() {
      isDragging = true;
    });

    scrollbar.on('mouseup', animateScrollbar);

    $(document).on('mousemove', function(e) {
      if (isDragging) {
        position = e.clientY - $('.container').offset().top;
        animateScrollbar();
      }
    });
  </script>
</head>
<body>
  <div class="container">
    <div class="scrollbar"></div>
  </div>
</body>
</html>

这两个示例都是使用相同的HTML和CSS代码,只有JavaScript部分稍有不同,在实现横向缓动图和纵向缓动图时需要将滑块位置和容器大小相应地修改即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现可用滑块滑动的缓动图代码 - Python技术站

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

相关文章

  • 简单谈谈javascript中的变量、作用域和内存问题

    Javascript中的变量、作用域和内存问题 变量的声明和数据类型 在Javascript中,我们可以使用var、let或const关键字声明一个变量。其中,var声明的变量具有函数作用域,而let和const声明的变量则具有块级作用域。 Javascript中的数据类型包括基本数据类型和引用数据类型。基本数据类型有Number、String、Boolea…

    JavaScript 2023年6月10日
    00
  • 27个JavaScript数组常见方法汇总与实例说明

    「27个JavaScript数组常见方法汇总与实例说明」是一篇介绍JavaScript数组操作方法的文章,主要分为以下三个部分: 一、常见数组方法 这一部分介绍了JavaScript中常用的数组操作方法,包括concat()、push()、pop()、shift()、unshift()、reverse()、sort()、slice()、splice()、in…

    JavaScript 2023年5月18日
    00
  • js对字符串进行编码的方法总结(推荐)

    JS对字符串进行编码的方法总结 在Web开发中,我们经常需要对URL、HTML等不同类型的数据进行编码,以防止不必要的转义或注入攻击。JavaScript提供了多种方法对字符串进行编码,本文将对这些方法进行总结。 1. encodeURIComponent()方法 encodeURIComponent() 方法可把字符串作为 URI 组件进行编码。该方法会对…

    JavaScript 2023年5月20日
    00
  • 详解JavaScript常量定义

    下面我将详细讲解“详解JavaScript常量定义”的完整攻略。 什么是JavaScript常量 在JavaScript中,声明一个变量的方式有两种:使用var关键字声明和使用const关键字声明。其中const声明的变量就是JavaScript常量。 常量是指在程序执行过程中其值不可变的变量。一旦用const关键字声明一个变量,就不能再对它进行赋值操作,否…

    JavaScript 2023年6月11日
    00
  • JavaScript中的简写语法分享

    当我们在写JavaScript代码的时候,经常会用到一些简写语法来简化代码、提高开发效率。在本篇文章中,我们将会分享一些JavaScript中的简写语法,帮助大家学会如何更加高效地编写JavaScript代码。 一、三元运算符简写 三元运算符通常用于处理条件分支,可以把一个简单if-else语句变得更加简洁。在三元运算符的基础上,我们还可以使用它的简写形式。…

    JavaScript 2023年6月10日
    00
  • Javascript实现秒表倒计时功能

    下面是“Javascript实现秒表倒计时功能”的完整攻略。 1. 准备工作 在开始编写代码实现倒计时功能之前,我们需要先准备一些基本的内容。具体包括以下几点: 1.1 确定计时的起点和终点 倒计时功能要想实现,我们需要确定计时的起点和终点。你可以自己设定一个时间,如5分钟(300秒),也可以通过用户输入动态获取倒计时的时间。 1.2 设计页面元素 在页面上…

    JavaScript 2023年5月27日
    00
  • js 通用javascript函数库整理

    JS 通用 JavaScript 函数库整理 JavaScript 作为一门用于前端开发的语言,具有广泛的应用场景。但是,由于浏览器的实现不同,同一段代码在不同浏览器下的表现会有所不同。因此,为了提高开发效率,减少浏览器兼容性的问题,在实际的开发中,我们通常会采用一些 JavaScript 函数库来进行编程。 函数库的使用方法 通常,我们使用一个 JavaS…

    JavaScript 2023年6月11日
    00
  • 如何在CocosCreator中做一个List

    现在我来为您详细讲解如何在CocosCreator中做一个List的完整攻略。 1、创建List节点 首先我们需要在CocosCreator中用节点编辑器来创建一个List节点。创建节点的方式可以在菜单栏中选择Creator > Create Node。然后输入节点的名称并点击确定,此时我们将会得到一个空的节点。 2、添加List组件 在这个空节点上添…

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