【js案例】滚动效果实现及简单动画函数抽离

news2024/9/24 13:24:17

目录

🌟效果

🌟实现思路

🌟实现方法

HTML&CSS代码

初始化

滚动效果 

完整JS代码 

🌟抽离动画函数

函数的简单使用 

小案例一

小案例二 

🌟效果

🌟实现思路

        要实现自动滚动,无非就是控制滚动条的移动,当把代码中列表高度及隐藏滚动条代码注释后,其实就是下面这个样子

 所以我们要做的其实很简单,就是控制元素的scrollTop值。

🌟实现方法

HTML&CSS代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>文字滚动效果</title>
    <link rel="stylesheet" href="./index.css" />
    <script src="./index.js" defer></script>
  </head>
  <body>
    <div class="container">
      <h1 class="title">最新公告</h1>
      <ul class="list">
        <li>1. 今天起满19元免配送费</li>
        <li>2. 买一送一不要错过</li>
        <li>3. 满100-50优惠大酬宾</li>
      </ul>
    </div>
  </body>
</html>
.container {
  background: #f59964;
  overflow: hidden;
  padding: 20px 0;
}
/* .container::after {
  content: '';
  display: block;
  clear: both;
} */
.title {
  float: left;
  font-size: 16px;
  font-weight: normal;
  margin: 0;
  margin-left: 20px;
  margin-top: 5px;
  border-right: 2px solid #ccc;
  padding-right: 30px;
}
.list {
  float: left;
  list-style: none;
  padding: 0;
  height: 30px;
  overflow: hidden ;
  margin: 0;
  margin-left: 50px;
  
}
.list li {
  height: 30px;
  line-height: 30px;
}

初始化

        实现效果可以看到到滚动到最后一条时,会重新返回第一条循环播放,这个时候其实就是scrollTop从某一个值变为0,会有个瞬间变化的效果,为了优化这一点,在初始化时,我们可以将第一个元素克隆到列表最后一个。

// 初始化:一开始做什么
  let list = document.querySelector('.list');
  // 1. 将列表中的第一个元素,克隆到列表的最后一个
  function cloneFirstItem() {
    let firstItem = list.children[0];
    let newItem = firstItem.cloneNode(true);
    list.appendChild(newItem);
  }
  cloneFirstItem();

滚动效果 

        接下来就是让元素动起来,在这过程中为了让效果更加丝滑,需要用上动画,动画可以用CSS3写也可以用JS,我这里是选择用JS,动画的本质就是由一个值变动到另一个值

        先定义基本参数

let duration = 2000; // 滚动的间隔时间
let itemHeight = 30; // 每一项的高度
let curIndex = 0; // 目前展示的是第几项

        实现滚动函数,每次的滚动区间比如从0到30,我们可以定义一个总的时间,及变化间隔,变化间隔越下,动画就越丝滑,也就是频繁但很小的改变scrollTop 的值。

  // 将列表滚动到下一个位置
  function moveNext() {
    let from = curIndex * itemHeight; // 开始的滚动高度
    curIndex++;
    let to = curIndex * itemHeight; // 下一项的滚动高度
    // 让list的scrollTop,从from慢慢变为to
    // 慢慢变为:在一段时间内,每隔一小段时间,变化一点
    let totalDuration = 300; // 变化的总时间
    let duration = 10; // 变化的间隔时间
    let times = totalDuration / duration; //变化的次数
    let dis = (to - from) / times; // 每次变化的量
    let timerId = setInterval(function () {
      from += dis;
      if (from >= to) {
        // 到达目标值了
        clearInterval(timerId); // 停止计时器
        // 滚动完成后,如果是最后一项
        if (curIndex === list.children.length - 1) {
          from = 0;
          curIndex = 0;
        }
      }
      list.scrollTop = from;
    }, duration);
  }

完整JS代码 

(function () {
  // 初始化:一开始做什么
  let list = document.querySelector('.list');
  // 1. 将列表中的第一个元素,克隆到列表的最后一个
  function cloneFirstItem() {
    let firstItem = list.children[0];
    let newItem = firstItem.cloneNode(true);
    list.appendChild(newItem);
  }
  cloneFirstItem();

  // 2. 滚动:每隔一段时间,将列表滚动到下一个位置
  let duration = 2000; // 滚动的间隔时间
  setInterval(moveNext, duration);
  let itemHeight = 30; // 每一项的高度
  let curIndex = 0; // 目前展示的是第几项
  // 将列表滚动到下一个位置
  function moveNext() {
    let from = curIndex * itemHeight; // 开始的滚动高度
    curIndex++;
    let to = curIndex * itemHeight; // 下一项的滚动高度
    // 让list的scrollTop,从from慢慢变为to
    // 慢慢变为:在一段时间内,每隔一小段时间,变化一点
    let totalDuration = 300; // 变化的总时间
    let duration = 10; // 变化的间隔时间
    let times = totalDuration / duration; //变化的次数
    let dis = (to - from) / times; // 每次变化的量
    let timerId = setInterval(function () {
      from += dis;
      if (from >= to) {
        // 到达目标值了
        clearInterval(timerId); // 停止计时器
        // 滚动完成后,如果是最后一项
        if (curIndex === list.children.length - 1) {
          from = 0;
          curIndex = 0;
        }
      }
      list.scrollTop = from;
    }, duration);
  }
})();

🌟抽离动画函数

        实现元素滚动效果中,改变元素位置时使用JS控制变化,这在后面分享的案例及实际开发中也是经常遇见的,那能不能抽成公共方法呢?当然是可以的。必须的就是起始值和结束值,其他的可以给个默认值,传不传都不会影响,因为未来使用这个方法不一定是来实现滚动,有无数可能性,所以这里就给回调函数就ok,方法如下:

function createAnimation(options) {
  let from = options.from; // 起始值
  let to = options.to; // 结束值
  let totalMS = options.totalMS || 1000; // 变化总时间
  let duration = options.duration || 15; // 动画间隔时间
  let times = Math.floor(totalMS / duration); // 变化的次数
  let dis = (to - from) / times; // 每一次变化改变的值
  let curTimes = 0; // 当前变化的次数
  let timerId = setInterval(function () {
    from += dis;
    curTimes++; // 当前变化增加一次
    if (curTimes >= times) {
      // 变化的次数达到了
      from = to; // 变化完成了
      clearInterval(timerId); // 不再变化了
      options.onend && options.onend();
    }
    // 无数的可能性
    options.onmove && options.onmove(from);
  }, duration);
}

函数的简单使用 

小案例一

        价格的变动,视频转成gif还是有点点卡顿,但实际上是非常丝滑的,可以copy过去试一下。

 

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h1>
      活动价:¥
      <span>500.00</span>
    </h1>

    <script src="./animate.js"></script>
    <script>
      var span = document.querySelector('h1 span');
      createAnimation({
        from: 500,
        to: 99,
        totalMS: 2000,
        duration: 50,
        onmove: function (n) {
          span.innerHTML = n.toFixed(2);
        },
        onend: function () {
          span.style.color = 'red';
        },
      });
    </script>
  </body>
</html>

小案例二 

        点击图形高度变小,颜色变化

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .item {
        background: #f40;
        width: 100px;
        height: 200px;
      }
    </style>
  </head>
  <body>
    <div class="item"></div>

    <script src="./animate.js"></script>
    <script>
      var div = document.querySelector('.item');
      div.onclick = function () {
        createAnimation({
          from: 200,
          to: 100,
          totalMS: 2000,
          onmove: function (n) {
            div.style.height = n + 'px';
          },
          onend: function () {
            div.style.background = '#008c8c';
          },
        });
      };
    </script>
  </body>
</html>

        使用封装函数实现动画效果非常方便,只需传入参数即方法,平时遇到可封装的方法就封装啦,大大提升开发效率!,JS案例系列将持续更新,感谢关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高等数学上册 第十章 重积分 第十一章 曲线积分与曲面积分 知识点总结

重积分 二重积分计算法&#xff1a; 直角坐标下&#xff1a;化为二次积分 { 如果图形是 X Y 型&#xff0c;则都可以&#xff0c;但要考虑哪个计算不定积分方便 如果图形既不是 X 也不是 Y 型&#xff0c;则要拆分 极坐标下&#xff1a; ∬ f ( x , y ) d x d y ∬ f ( ρ cos…

基于适应度相关算法优化的BP神经网络(预测应用) - 附代码

基于适应度相关算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于适应度相关算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.适应度相关优化BP神经网络2.1 BP神经网络参数设置2.2 适应度相关算法应用 4.测试结果&…

Python学习之一 基于交互式解释器的简单Python编程

在很奇葩的Deepin下Miniconda安装之旅 中完成了Deepin系统下的Miniconda安装&#xff0c;在使用Miniconda 中完成了Miniconda的使用。今天&#xff0c;将开始学习Python编程。 (一) 为Python编程学习创建虚拟环境 首先创建虚拟环境&#xff0c;选择Python3.7。 conda create…

用于C++律动运动的中央模式生成器

用于C律动运动的中央模式生成器 一、说明 本篇讲述关于生物模型的神经网络&#xff0c; 中央模式生成器的简单神经网络的一个例子是半中心振荡器&#xff1b;该系统分成两个组成&#xff0c;信号层和物理层。新概念仓本模型&#xff0c;以及龙格库塔法的方程解法&#xff0c;总…

6.跑一下Triton官方教程

1.模型部署 首先拉取官方示例代码 git clone --recursive https://github.com/triton-inference-server/tutorials.git cd tutorials/Conceptual_Guide/Part_1-model_deployment 1.下载文本检测模型 wget https://www.dropbox.com/s/r2ingd0l3zt8hxs/frozen_east_text_dete…

裸露土堆识别算法

裸露土堆识别算法首先利用图像处理技术&#xff0c;提取出图像中的土堆区域。裸露土堆识别算法首通过计算土堆中被绿色防尘网覆盖的比例&#xff0c;判断土堆是否裸露。若超过40%的土堆没有被绿色防尘网覆盖&#xff0c;则视为裸露土堆。当我们谈起计算机视觉时&#xff0c;首先…

React与Vue:两大前端巨头的深度对决

引言 在当今的前端开发领域&#xff0c;React和Vue无疑是两大巨头。它们各自有着独特的历史和哲学&#xff0c;但都为开发者提供了强大的工具来构建高效、响应式的web应用。这篇文章将深入探讨这两个框架的差异&#xff0c;帮助开发者更好地理解它们的优势和劣势。 React与Vu…

Python“牵手”唯品会商品列表数据,关键词搜索唯品会API接口数据,唯品会API接口申请指南

唯品会平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;唯品会API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问唯品会平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现唯…

2023最新任务悬赏平台源码uniapp+Thinkphp新款悬赏任务地推拉新充场游戏试玩源码众人帮威客兼职任务帮任务发布分销机

新款悬赏任务地推拉新充场游戏试玩源码众人帮威客兼职任务帮任务发布分销机制 后端是&#xff1a;thinkphpFastAdmin 前端是&#xff1a;uniapp 1.优化首页推荐店铺模块如有则会显示此模块没有则隐藏。 2修复首页公告&#xff0c;更改首页公告逻辑。&#xff08;后台添加有公…

大规模 IoT 边缘容器集群管理的几种架构-6-个人体验及推荐

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad大规模 IoT 边缘容器集群管理的几种架构-3-Portainer大规模 IoT 边缘容器集群管…

(java) 进程调度

目录 进程 首先我们要了解一下什么是进程&#xff1f; 那如何管理进程&#xff1f; PCB中比较重要的属性 进程调度 为什么要进行进程调度&#xff1f; 状态 优先级 上下文 拓展介绍一下寄存器 记账信息 进程 首先我们要了解一下什么是进程&#xff1f; 简单来说…

window下jdk安装及更换jdk版本的一些问题。

目录 jdk安装jdk的选择。oracle的jdk怎么安装。openjdk怎么安装。 jdk的版本控制。更换jdk的一些问题。 jdk安装 jdk的选择。 目前有两种可选的jdk&#xff0c;oracle的和开源的Openjdk&#xff0c;这两种jdk的区别可以自行查阅&#xff0c;就结果而言&#xff0c;openjdk开源…

2023年浙大MEM提面/复试录取考生笔试成绩分布图一览

如果真要给备战浙大mem项目一个理由的话&#xff0c;我想本文的两张图基本算是之一吧&#xff01;几乎每年的上半年时间里&#xff0c;浙江本省连带附近一些省市的考生对浙大mem项目的报考热情都很满&#xff0c;但经历过八月提面之后&#xff0c;部分考生可能会因为提面的结果…

在安装pyhttpx过程中:ImportError: DLL load failed: 找不到指定的模块。

错误 ImportError: DLL load failed: 找不到指定的模块。 解决方案 我先尝试着去重新安装了下brotli 但是并没有成功 最终解决 安装 vc_redist.x64.exe 下载地址&#xff1a;https://learn.microsoft.com/en-GB/cpp/windows/latest-supported-vc-redist?viewmsvc-170 如果…

什么是 TF-IDF 算法?

简单来说&#xff0c;向量空间模型就是希望把查询关键字和文档都表达成向量&#xff0c;然后利用向量之间的运算来进一步表达向量间的关系。比如&#xff0c;一个比较常用的运算就是计算查询关键字所对应的向量和文档所对应的向量之间的 “相关度”。 简单解释TF-IDF TF &…

【Java基础增强】Stream流

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把"张"开头的集合中的长度为3的元素存储到一个新的集合 遍历上一步得…

打架斗殴行为识别算法

打架斗殴行为识别算法通过yolov7网络模型深度学习算法&#xff0c;打架斗殴行为识别算法对提取到的信息进行分析和比对&#xff0c;判断是否存在打架斗殴行为。打架斗殴行为识别算法一旦打架斗殴行为识别算法识别到打架斗殴行为&#xff0c;系统会立即生成预警信息&#xff0c;…

java八股文面试[多线程]——为什么不能用Excuters创建线程池

DelayedWorkQueue 也是一个无界队列。 如何根据实际需要&#xff0c;定制自己的线程池&#xff1a; 知识点&#xff1a; 【并发与线程】为什么大厂规定不能使用Executors去创建线程池&#xff1f;_哔哩哔哩_bilibili 【并发与线程】如何根据实际需要&#xff0c;定制自己的线…

uniapp iOS打包证书申请流程——window

uniapp 如何在 window 创建 iOS打包证书&#xff1f; 文章目录 uniapp 如何在 window 创建 iOS打包证书&#xff1f;下载 Appuploader安装创建证书相关入口创建证书创建描述文件运行调试账号过期提示 前提&#xff1a; 下载 Appuploader工具 Appuploader辅助工具&#xff0c;解…

<七> objectARX开发:创建自定义实体

1、介绍 在某些情况下,CAD中的实体对象无法满足需求,我们需要针对实际情况来设计并绘制自定义的实体,下面就用一个简单的例子来介绍一下自定义实体绘制。 实体形状:包括实体夹点和文字夹点拖动实现。 2、效果 3、创建自定义实体的步骤 新建一个从AcDbEntity继承的类,如C…