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

目录

🌟效果

🌟实现思路

🌟实现方法

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://xiahunao.cn/news/1617787.html

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

相关文章

[转载]田雪松硬笔行书临文征明《滕王阁序》_拔剑-浆糊的传说_新浪博客

原文地址&#xff1a;田雪松硬笔行书临文征明《滕王阁序》 作者&#xff1a;游目骋怀

【Acwing285】没有上司的舞会(树形dp)题目笔记

题目描述 题目分析 首先来看状态表示&#xff1a; f[u][1]&#xff1a;所有从以u为根的子树中选择&#xff0c;并且不选u这个点的情况之下的最大指数 f[u][0]&#xff1a;所有从以u为根的子树中选择&#xff0c;并且选择u这个点的情况之下的最大指数 然后看状态计算&#x…

leetcode 516. 最长回文子序列

2023.8.27 本题依旧使用dp算法做&#xff0c;可以参考 回文子串 这道题。dp[i][j]定义为&#xff1a;子串s[i,j] 的最长回文子串。 直接看代码: class Solution { public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(),vector<int&…

pandas由入门到精通-描述性统计量

pandas基础介绍-命令模版 描述性统计量pandas 统计函数相关与协方差唯一值&#xff0c;频次统计,成员关系1. Series.unique()2. Series/DataFrame/array.value_counts()3. Series.isin()4. get_indexer() 索引对应转换 本文介绍pandas中一些常用的描述性统计量相关知识&#xf…

网易 腾讯 新浪手机新闻客户端横向对比评测

这段时间关于iPhone新闻客户端的事件获得不少关注&#xff0c;一张截图对比在微博上四处转发&#xff0c;不过只有一个界面对比也说明不了问题吧&#xff0c;想知道这些新闻客户端是不是如此相似&#xff0c;还是要认真对比瞧瞧。 参赛选手&#xff1a;网易新闻/腾讯新闻/掌中…

乔布斯女儿嘲讽iPhone 14没新意;高德打车AR实景找车功能上线;Go语言报告:错误处理仍然是个挑战|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

极客日报:iPhone卫星功能仅用于紧急通信;韩国通过立法禁止苹果、谷歌垄断支付系统;Linux 5.14 版本发布

一分钟速览新闻点&#xff01; 小米集团加入开源专利社区 OIN饿了么&#xff1a;延长扬州会员一个月的权益阿里云教育推出钉钉课后服务系统华为 P50 Pro 推送鸿蒙更新淘宝更换新的 Slogan 为“淘宝太好逛了吧”鸿蒙 OS 2 升级用户破 7000 万&#xff01;近 100 款机型可升级网…

jQuery Mobile开发的新闻阅读器,适应iphone和android手机

程序员都很赖&#xff0c;你懂的&#xff01; 我们经常上新浪&#xff0c;腾讯&#xff0c;雅虎等各大网站上面看新闻&#xff0c;他们也都各自推出了自家的手机新闻阅读器。今天我自己使用jQuery Mobile 来实现这一功能。图片大小上传限制了大小250*400先看看iphone上的效果&a…

递归算法学习——全排列

目录 ​编辑 一&#xff0c;问题描述 1.例子&#xff1a; 题目接口&#xff1a; 二&#xff0c;问题分析和解决 1.问题分析 2.解题代码 一&#xff0c;问题描述 首先我们得来先看看全排列的问题描述。全排列问题的问题描述如下&#xff1a; 给定一个不含重复数字的数组 n…

2023年流行编曲软件哪个好用?flstudio有免费的吗 flstudio免费插件都有哪些

2023年流行的主流宿主编曲软件哪个好用&#xff0c;现在几款流行的主流宿主编曲软件包括FL Studio、Cubase、Pro Tools、Sonar、Logic Pro、Studio One等等。 对于新手学习来说我个人更推荐FL Studio 21&#xff0c;为什么说FL Studio 21 适合新手呢&#xff1f;自然是有道理的…

免费音频转换器,畅享音乐无边界。这些软件助你一键转换

嘿&#xff01;你是否有过这样的经历&#xff0c;当你想在特定设备上播放自己珍藏的音频时&#xff0c;却发现文件格式不兼容而无法播放&#xff1f;别灰心&#xff0c;我有个小秘诀要告诉你——音频格式转换&#xff01;通过将音频文件转换为适当的格式&#xff0c;你可以轻松…

Harbor 私有仓库迁移博客

文章目录 一.私有仓库迁移的介绍1.为何要对Harbor 私有仓库的迁移2.Harbor 私有仓库的迁移特点3. Harbor 私有仓库的迁移注意要点 二.私有仓库迁移配置1.源Harbor配置&#xff08;192.168.198.11&#xff09;&#xff08;1&#xff09;接着以下操作查看容器状况及是否可以登录 …

语言基础篇1——Python概述,Python是什么?Python能干什么?

概述 简介 Python&#xff0c;计算机高级语言&#xff0c;读作/ˈpaɪθən/&#xff08;英音&#xff09;、/ˈpaɪθɑːn/&#xff08;美音&#xff09;&#xff0c;意为蟒蛇&#xff0c;Python的logo为两条缠绕的蟒蛇 特点 Python以开发效率高而运行效率低著称 应用领域…

【洛谷】P2678 跳石头

原题链接&#xff1a;https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。&#xff08;使用二分需要满足两个条件。一个是有界&#xff0c;一个是单调。 这题的题面&#xff1a;使得选手们在比赛过程中…

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

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

【SpringBoot学习笔记02】静态资源

Spring Boot 通过 MVC 的自动配置类 WebMvcAutoConfiguration 为这些 WebJars 前端资源提供了默认映射规则&#xff0c;部分源码如下。 jar包&#xff1a; JAR 文件就是 Java Archive File&#xff0c;顾名思意&#xff0c;它的应用是与 Java 息息相关的&#xff0c;是 Java 的…

msvcp140.dll丢失的解决方法,win10系统dll报错的解决方法

今天&#xff0c;我将为大家分享一个关于msvcp140.dll丢失的解决方法&#xff0c;特别是针对在Windows 10系统上遇到这个问题的朋友们。在开始之前&#xff0c;我想先简要介绍一下msvcp140.dll文件的作用。msvcp140.dll是Microsoft Visual C运行时库的一部分&#xff0c;它包含…

Python功能制作之简单的绘画板

可能需要安装的库 pip install pillow pip install tk制作 我们使用Python的Tkinter库创建的一个简单绘画软件。 首先创建了一个简单的绘画应用&#xff0c;可以选择颜色、切换画笔和橡皮擦模式、清空画布以及绘制自由曲线。 里面的主要结构和功能是&#xff1a; 导入必要的…

WICC 2021 技术分论坛 “开箱即用”语聊房Demo成亮点

7月24日&#xff0c;第三届全球互联网通信云大会(WICC 2021)在北京成功召开&#xff0c;数千开发者共赴通信云技术盛宴。本次会议中&#xff0c;“开发者服务生态”被作为重要议题引起了全产业链的广泛关注。作为大会主办方&#xff0c;全球互联网通信云领导厂商融云不但提出了…

人工智能语聊的相关原理学习(二)

导读 前段时间楼主决定潜心研究google的word2vec中使用到的相关原理&#xff0c;但是在一番学习之后&#xff0c;楼主发现作为一枚小白&#xff0c;如果对自然语言处理的基础原理都不了解的话&#xff0c;实在是很难理解word2vec中的那些算法&#xff0f;公式等等&#xff0c;于…