热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IntersectionObserver页面优化针对页面css动画过多,在视图外部限制动画加载,可以优化为class渲染与否以及图片的懒加载

针对于在视图外部的的动画的停止1.选择对应的事件我开始想选择的事件是scroll事件,来获取目标元素所在高度和监听页面的滑动高度来判读元素的动画是否停止渲染,但是细想了一下,scr

针对于在视图外部的的动画的停止

1.选择对应的事件

我开始想选择的事件是scroll事件,来获取目标元素所在高度和监听页面的滑动高度来判读元素的动画是否停止渲染 ,但是细想了一下,scroll事件中添加多个判断会影响用户体验。然后询问其他大佬,找到了另一个API 是 IntersectionObserver

2.了解和使用API

在使用IntersectionObserver创建实例的时候 提供了一种异步观察目标元素的交点的变化与一个祖先元素或具有顶级文档的视口。祖先元素或视口称为根(在我而言就是相当于 目标DOM元素创建的视图实例 监听他们接触的情况),以下面代码为例

//创建视图
var Observer = new IntersectionObserver(回调函数 [,options ];
//监听获取到的DOM元素
let DOM = doucment.
intersectionObserver.observe(DOM);

我们可以在options中配置创建的视图的大小
未定义的化 var Observer = new IntersectionObserver(回调函数)视图即使全屏

参数模拟值意义
rootroot: document.querySelector(’#scrollArea’)可以传入DOM元素
rootMarginrootMargin: ‘0px’,和css的margin差不多定义视图的margin
thresholdthreshold: 0.0在0.0到1.0之间的单个数字或数字数组中,指定观察对象的相交区域与总边界框区域之比默认为0.0

//但是我们没有用到options 如下是我们定义的代码
function clearAnimation(el, isChildren = false, childrenName) {
// 通过传入的字符串来获取含有动画的目标函数或者 含有动画的目标函数的父元素
let arrList = $(el);
// 获取元素css兼容ie
function getCss(obj, attribute) {
if (obj.currentStyle) { //ie兼容
return obj.currentStyle[attribute];
}
else {
return window.getComputedStyle(obj, null)[attribute];
}
}
// 判断是否有子元素
if (isChildren) {
// 获取想要的子元素
function getChildrenDiv(children, liObj) {
//遍历子元素,当元素是DIV时,返回这个元素
for (var i = 0; i < children.length; i++) {
if (children[i].nodeName == liObj.toUpperCase()) {
var liChildrenDiv = children[i];
return liChildrenDiv;
}
}
}
//
let BigAnimation = "";
// 监听元素所处位置
var intersectionObserver = new IntersectionObserver(function (entries) {
// 获取到想要取消动画的子元素
let elementS = getChildrenDiv(entries[0].target.children, childrenName)
// console.log(elementS)
let animation01 = ""
if (!BigAnimation) {
if (getCss(elementS, "animation").length <= 37) {
return false
}
animation01 = getCss(elementS, "animation");
} else {
animation01 = BigAnimation;
}
// 当元素所处在视图中
if (entries[0].isIntersecting) {
elementS.style.animation = animation01;
}
// 当元素所出与视图外面
else {
new Promise((resolve, reject) => {
BigAnimation = getCss(elementS, "animation");
resolve('成功')
}).then((res) => {
elementS.style.animation = "none";
})
}
});
}
// 没有子元素
else {
let BigAnimation2 = "";
var intersectionObserver = new IntersectionObserver(function (entries) {
// 获取到想要取消动画的子元素
let elementS = entries[0].target
// console.log(elementS)
let animation01 = ""
if (!BigAnimation2) {
//当动画为none 的时候获取到的
if (getCss(elementS, "animation").length <= 37) {
return false
}
animation01 = getCss(elementS, "animation");
} else {
animation01 = BigAnimation2;
}
// 当元素所处在视图中
if (entries[0].isIntersecting) {
elementS.style.animation = animation01;
}
// 当元素所出与视图外面
else {
new Promise((resolve, reject) => {
BigAnimation2 = getCss(elementS, "animation");
resolve('成功')
}).then((res) => {
elementS.style.animation = "none";
})
}
});
}
//
arrList.each((index, item) => {
intersectionObserver.observe(item);
})
}
//父元素是 .botton_hand 子元素有动画 子元素是div
Event.interSectionObserver(".botton_hand", true, "div")
Event.interSectionObserver(".animation_btn")

参数数据类型必须输入?默认值代表意义
参数 elstring所选元素的字符串 像使用$()方法 一样传入实参
参数 isChildrenbooleanfalse想要去除的动画在子元素上么 默认不在子元素, 若有 传入true
参数 childrenNamestring子元素的名称
进一步优化点

1.可以不替换css动画,用移除和添加class来达到 渲染对应的样式
2.可以用于图片的渲染以达到懒加载


推荐阅读
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
author-avatar
张芬921_162
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有