html如何设置滚动动画,JavaScript 实现页面滚动动画

在做前端 UI 效果时,让元素根据滚动位置实现动画效果是一个非常流行的设计,通常我们会使用第三方插件或库来实现。在本教程中,我将教大家使用纯 JavaScript 和 CSS 来实现。

先预览一下实现的效果:

172259a20341bba60da3f1638c7dafc2.gif

我们使用 CSS 来实现动画,用 JavaScript 来处理触发所需的样式。我们先来创建布局。

创建布局

我们先使用 HTML 创建页面布局,然后为需要实现动画的元素分配一个通用类名,后面的 JavaScript 通过此类名定位这些元素。这里我们给需要根据滚动实现动画的元素指定为类名 js-scroll,HTML 代码如下:

This animation fades in from the top.

添加 CSS 样式

先来一个简单的淡入动画效果:

.js-scroll {

opacity: 0;

transition: opacity 500ms;

}

.js-scroll.scrolled {

opacity: 1;

}

页面上的所有 js-scroll 元素都会被隐藏,不透明度为 0。当滚动到该元素区域时,给它加上 .scrolled 类名让它显现出来。

用 JavaScript 操作元素

有了布局和样式,现在我们需要编写一个 JavaScript 函数,当元素滚动到视图中时,为它们分配类名。

我们来简单分解一下逻辑:

获取页面上所有 js-scroll 元素

使这些元素默认淡出不可见

检测元素是否在视窗内

如果元素在视窗内则分配 scrolled 类名

获取目标元素

获取页面上所有 js-scroll 元素,使用 document.querySelectorAll() 即可:

const scrollElements = document.querySelectorAll('.js-scroll')

默认淡出所有目标元素

遍历这些元素,使其全部淡出不可见:

scrollElements.forEach((el) => {

el.style.opacity = 0

})

检测元素是否在视窗内

我们可以通过判断元素距离页面顶部的间距是否小于页面可见部分的高度,来检测元素是否在用户视窗中。

在 JavaScript 中,我们使用 getBoundingClientRect().top 方法来获取元素与页面顶部的距离,使用 window.innerHeight或 document.documentElement.clientHeight来获取视窗的高度。

0576d9ae8f17d2ccfd265e965a7125f7.png

我们将使用上述逻辑创建一个 elementInView 函数:

const elementInView = (el) => {

const elementTop = el.getBoundingClientRect().top

return (

elementTop <= (window.innerHeight || document.documentElement.clientHeight)

)

}

我们可以修改这个函数来检测元素是否向页面滚动了 x 个像素,或者检测页面滚动的百分比。

const elementInView = (el, scrollOffset = 0) => {

const elementTop = el.getBoundingClientRect().top

return (

elementTop <=

(window.innerHeight || document.documentElement.clientHeight) - scrollOffset

)

}

在这种情况下,如果元素已经按 scrollOffset 的数量滚动到页面中,该函数返回 true。我们再稍作修改,把参数 scrollOffset 变成百分比:

const elementInView = (el, percentageScroll = 100) => {

const elementTop = el.getBoundingClientRect().top

return (

elementTop <=

(window.innerHeight || document.documentElement.clientHeight) *

(percentageScroll / 100)

)

}

这部分可以根据自己的特定需求来定义逻辑。

注意:可以使用 Intersection Observer API[2] 来实现同样的效果,但它不支持 IE。

给元素添加类名

现在我们已经能够检测到元素是否已经滚动到页面中,我们需要定义一个函数来处理该元素的显示--本例中我们通过分配 scrolled 类名来显示该元素。

const displayScrollElement = (element) => {

element.classList.add('scrolled')

}

然后,再把我们前面的逻辑与 displayScrollElement 函数结合起来,并使用 forEach 方法在所有 js-scroll 元素上调用该函数。

const handleScrollAnimation = () => {

scrollElements.forEach((el) => {

if (elementInView(el, 100)) {

displayScrollElement(el)

}

})

}

另外,当元素不再在视图中时,需要将其重置为默认状态,我们可以通过定义一个 hideScrollElement 来实现:

const hideScrollElement = (element) => {

element.classList.remove("scrolled");

};

const handleScrollAnimation = () => {

scrollElements.forEach((el) => {

if (elementInView(el, 100)) {

displayScrollElement(el);

} else {

hideScrollElement(el);

}

}

最后,我们将把上面的方法传递到窗口的滚动事件监听中,这样每当用户滚动时它就会运行。

window.addEventListener('scroll', () => {

handleScrollAnimation()

})

我们已经实现了滚动动画的所有功能。

完善示例

请大家回到文章开头看看效果图。看到,这些元素以不同的动画出现。这是通过给类名分配不同的 CSS 动画来实现的。这个示例的 HTML 是这样的:

淡入动效
切入顶部动效
从左边切入动效
从右边切入动效

这里我们给不同动效的元素分配了不同的 CSS 类名,下面是这些类对应的 CSS 代码:

.scrolled.fade-in {

animation: fade-in 1s ease-in-out both;

}

.scrolled.fade-in-bottom {

animation: fade-in-bottom 1s ease-in-out both;

}

.scrolled.slide-left {

animation: slide-in-left 1s ease-in-out both;

}

.scrolled.slide-right {

animation: slide-in-right 1s ease-in-out both;

}

@keyframes slide-in-left {

0% {

transform: translateX(-100px);

opacity: 0;

}

100% {

transform: translateX(0);

opacity: 1;

}

}

@keyframes slide-in-right {

0% {

transform: translateX(100px);

opacity: 0;

}

100% {

transform: translateX(0);

opacity: 1;

}

}

@keyframes fade-in-bottom {

0% {

transform: translateY(50px);

opacity: 0;

}

100% {

transform: translateY(0);

opacity: 1;

}

}

@keyframes fade-in {

0% {

opacity: 0;

}

100% {

opacity: 1;

}

}

虽然加了不同动画元素,但我们不需要修改 JavaScript 代码,因为逻辑保持不变。这意味着我们可以在页面添加任何数量的不同动画,而无需编写新的函数。

利用节流阀提高性能

每当我们在滚动监听器中绑定一个函数时,每次用户滚动页面,该函数都会被调用。滚动一个 500px 的页面会导致一个函数被调用至少 50 次。如果我们试图在页面上包含很多元素,这会导致我们的页面速度明显变慢。

我们可以通过使用“节流函数(Throttle Function)”来减少函数的调用次数。节流函数是一个高阶函数,它在指定的时间间隔内只调用传入的函数一次。

它对于滚动事件特别有用,因为我们不需要检测用户滚动的每个像素。例如,如果我们有一个定时器为 100ms 的节流函数,那么用户每滚动 100ms,该函数将只被调用一次。

节流函数在 JavaScript 中可以这样实现:

let throttleTimer = false

const throttle = (callback, time) => {

if (throttleTimer) return

// 这里标记一下,以使函数不会重复执行

throttleTimer = true

setTimeout(() => {

// 到了指定的时间,调用传入的回调函数

callback()

throttleTimer = false

}, time)

}

然后我们可以修改 window 对象上的 scroll 事件监听:

window.addEventListener('scroll', () => {

throttle(handleScrollAnimation, 250)

})

现在我们的 handleScrollAnimation 函数在用户滚动时每隔 250ms 就会被调用一次:

596e1e935fcdfbc50c419ef7706b1086.gif

以上就是JavaScript 实现页面滚动动画的详细内容,更多关于JavaScript 页面滚动的资料请关注脚本之家其它相关文章!

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

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

相关文章

绝非玩笑!人工智能或开创黑客新时代

专家称&#xff0c;未来的网络战争可能是机器对机器&#xff0c;这可能需要几年甚至几十年时间&#xff0c;但黑客并不一定总是人类。人工智能(AI)是可彻底改变网络安全的技术&#xff0c;而它有一天可能成为最终的攻击工具。 今年8月由美国国防部先进项目研究局(DARPA)赞助的C…

自学python系列14:映像,集合类型-集合类型

集合类型1.1如何创建集合类型和给集合赋值1.1.1 如何创建集合类型和给集合赋值集合的工厂方法set()和frozenset()>>> sset(abc)>>> sset([a, c, b])>>> tfrozenset(abc)>>> tfrozenset([a, c, b])len()计算的是集合的字母的个数1.1.2如何访…

观点:我们为什么需要威胁情报?

最近被谈论的异常火热的一个术语就是威胁情报&#xff0c;那么威胁情报到底是什么意思&#xff0c;它是一种什么概念或者机制呢?本文中我们就来亲密接触一下威胁情报&#xff0c;并了解它所具有的功能&#xff0c;然后给出几个威胁情报的最佳实践示例&#xff0c;最后分析威胁…

vijos 1942 [AH 2005] 小岛

描述 西伯利亚北部的寒地&#xff0c;坐落着由 N 个小岛组成的岛屿群&#xff0c;我们把这些小岛依次编号为 1 到 N 。 起初&#xff0c;岛屿之间没有任何的航线。后来随着交通的发展&#xff0c;逐渐出现了一些连通两座小岛的航线。例如增加一条在 u 号小岛与 v 号小岛之间的航…

聊城大学计算机应用基础函授,聊城大学试题计算机应用基础试题

姓名 年级专业层次 教学单位密封线 第1页 共3页聊城大学《计算机应用基础》函授试题一、判断题(共10题&#xff0c;每题2分&#xff0c;共20分)1、信息按状态划分可以划分为动态信息和静态信息。( √ )2、操作系统不具有通用性。( )3、在Windows XP环境中&#xff0c;整个显示…

(七)SpringBoot+SpringCloud —— 集成断路器

2019独角兽企业重金招聘Python工程师标准>>> 断路器简介 在一个项目中&#xff0c;系统可能被拆分成多个服务&#xff0c;例如用户、订单和库存等。 这里存在这服务调用服务的情况&#xff0c;例如&#xff0c;客户端调用订单服务&#xff0c;订单服务又调用库存服务…

计算机学业水平考试及格,信息技术学业水平考试表格部分试题(带答案)

第三章表格信息的加工与表达复习学案【学习目标】1.熟练使用excel加工表格信息&#xff0c;理解用图表来表现信息的特点与意义&#xff0c;2.能根据表格数据关系选择合适的图表类型表达意图。【考点】1.表格中常用的函数及其求值方法&#xff1b;2.根据数据选择合适的图表类型&…

云计算:容器技术变革云计算,SaaS带动CaaS市场

报告摘要&#xff1a; 1、容器技术增速惊人&#xff0c;市场认可度提高 虚拟化是云计算的重要基础&#xff0c;Docker定义了一套容器从构建到执行的标准化体系&#xff0c;改变了传统的虚拟化技术&#xff0c;深度影响了云计算领域。 随着谷歌、亚马逊、微软等云计算厂商纷纷加…

三年级神奇电子计算机教案,人教版小学三年级下册信息技术教案

人教版小学三年级下册信息技术教案 人教版小学信息技术教案第一课 神奇的信息世界教学目的&#xff1a;通过学习使学生更充分地了解信息技术在生活中的应用。教学内容&#xff1a;观看“神奇的信息世界”光碟教学准备&#xff1a;1、调试每台计算机 2、打开计算机并由教师机控制…

spark 安装配置

最佳参考链接 https://opensourceteam.gitbooks.io/bigdata/content/spark/install/spark-160-bin-hadoop26an_zhuang.html Apache Spark1.1.0部署与开发环境搭建   Spark是Apache公司推出的一种基于Hadoop Distributed File System(HDFS)的并行计算架构。与MapReduce不同&am…

python基础知识-列表,元组,字典

列表&#xff08;list&#xff09; 赋值方法&#xff1a; l [11,45,67,34,89,23] l list() 列表的方法&#xff1a; 1 #!/usr/bin/env python2 3 class list(object):4 """5 list() -> new empty list6 list(iterable) -> new list initial…

如何解决机器学习中的数据不平衡问题?

在机器学习任务中&#xff0c;我们经常会遇到这种困扰&#xff1a;数据不平衡问题。 数据不平衡问题主要存在于有监督机器学习任务中。当遇到不平衡数据时&#xff0c;以总体分类准确率为学习目标的传统分类算法会过多地关注多数类&#xff0c;从而使得少数类样本的分类性能下降…

四大技巧轻松搞定云容器

云容器技术&#xff0c;作为传统虚拟化管理程序的一种替代品&#xff0c;正称霸着云市场。容器是轻量级的&#xff0c;并提供增强的便携性&#xff0c;允许应用在平台之间迁移&#xff0c;而不需要开发者重做或重新架构应用。但是&#xff0c;尽管其好处让开发人员感到惊叹&…

Android 图文混排 通过webview实现并实现点击图片

在一个开源项目看到是用的webview 实现的 1. 这是在asset中的一个模板html <html> <head> <title>News Detail</title> <meta name"viewport" content"widthdevice-width, minimum-scale0.5, initial-scale1.2, maximum-scale2.0…

计算机硬件选型报价,组装电脑硬件该怎么选择?这几个硬件要舍得花钱,千万别买错了!...

原标题&#xff1a;组装电脑硬件该怎么选择&#xff1f;这几个硬件要舍得花钱&#xff0c;千万别买错了&#xff01;组装电脑是多硬件组合的产物&#xff0c;每一个硬件对于电脑的性能都是有影响的&#xff0c;影响的大小与电脑的硬件有直接关系&#xff0c;有些硬件就要舍得花…

高级会计师计算机考试中级,会计师需要计算机等级考试吗

尘伴考证达人06-19TA获得超过671个赞[color#000][font宋体][size3][alignleft]广东省高级会计师评审职称外语&#xff0c;执行《关于调整完善我省职称外语政策的通知》(粤人发〔2018〕120号)[/align][alignleft]三、报考职称外语考试的等级要求[b][size3](一)申报高教、科研、卫…

一 手游开发工具cocos2d-x editor初识

可学习的demo&#xff1a; 7个实战项目 flappybird&#xff08;飞扬小鸟&#xff09;、popstar&#xff08;消灭星星&#xff09;、fruitninja&#xff08;水果忍者&#xff09;、2048&#xff08;数度消除&#xff09;。 moonwarriors&#xff08;月亮战神&#xff09;、frui…

Provisioning Services 7.6 入门到精通系列之七:创建虚拟磁盘

在上一章节完成了主目标设备的准备&#xff0c;今天将揭晓如何通过映像向导创建虚拟磁盘。1.1 点击开始菜单”映像向导”1.2 在映像向导点击”下一步“1.3 输入PVS服务器信息&#xff0c;下一步1.4 点击”新建虚拟磁盘”1.5 输入新虚拟磁盘的相关信息&#xff0c;下一步1.6 配置…

全国职业院校技能大赛软件测试题目,我校喜获2018全国职业院校技能大赛“软件测试”赛项一等奖...

九江职院新闻网讯(信息工程学院)5月31日&#xff0c;从2018全国职业院校技能大赛传来喜讯&#xff0c;由我校信息工程学院教师艾迪、朱虎平指导&#xff0c;学生郭星宏、赖闽、吴宗霖组成的竞赛团队&#xff0c;代表江西省在高职组“软件测试”赛项中荣获团体一等奖的佳绩。为积…

两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]…*a[N-1]/a[i];...

转自&#xff1a;http://blog.csdn.net/shandianling/article/details/8785269 问题描述&#xff1a;两个数组a[N]&#xff0c;b[N]&#xff0c;其中A[N]的各个元素值已知&#xff0c;现给b[i]赋值&#xff0c;b[i] a[0]*a[1]*a[2]…*a[N-1]/a[i]&#xff1b; 要求&#xff1a…