this(普通函数)
this是什么
this———用于访问当前方法所属的对象
+})()this(普通函数)————初版
this(普通函数)
this是什么
this———用于访问当前方法所属的对象
let obj = { |
当前这个方法fn是属于obj,所以this就是obj,所以结果为true
@@ -218,7 +218,7 @@let arr=[1,2,3] |
这里的用法就相当于是call的用法
-diff --git a/2023/11/20/first/index.html b/2023/11/20/first/index.html index 6a5cf29..294ab64 100644 --- a/2023/11/20/first/index.html +++ b/2023/11/20/first/index.html @@ -5,12 +5,12 @@ - + -
this———用于访问当前方法所属的对象
+})()this———用于访问当前方法所属的对象
let obj = { |
当前这个方法fn是属于obj,所以this就是obj,所以结果为true
@@ -218,7 +218,7 @@let arr=[1,2,3] |
这里的用法就相当于是call的用法
-图片懒加载是一种优化网页性能的技术,它允许在用户滚动到图片位置之前延迟加载图片。通过懒加载,可以在用户需要查看图片时才加载图片,避免了不必要的图片加载,从而提高了网页的加载速度和用户体验。
+})()图片懒加载是一种优化网页性能的技术,它允许在用户滚动到图片位置之前延迟加载图片。通过懒加载,可以在用户需要查看图片时才加载图片,避免了不必要的图片加载,从而提高了网页的加载速度和用户体验。
在说明思路之前,先了解几个常见的视图属性。
clientHeight:元素的像素高度,包含元素的高度+内边距,不包含水平滚动条,边框和外边距。
@@ -197,16 +197,16 @@遍历图片url集合,渲染loading图片
<div className={styles['box-one']} ref={scrollRef}> |
监听容器的滚动事件,当容器滚动时计算容器的高度加上滚动条的高度大于当前图片的offsetTop时加载当前的图片。
import loadingUrl from '@/assets/imgs/loading.jpg'; |
方案二的实现思路利用浏览器提供的 IntersectionObserver
API实现。IntersectionObserver
API提供了一种方便的方式来监视目标元素和其祖先元素或视窗之间的交叉状态变化。当目标元素进入或离开视口时,可以触发回调函数,进行相应的操作。它的原理是通过注册一个回调函数来观察特定元素的交叉状态变化,并在满足条件时执行相应的操作。
使用 IntersectionObserver
API非常简单,可以通过创建一个 IntersectionObserver
实例,并传入回调函数和选项对象来实现。回调函数会在目标元素的交叉状态发生变化时被调用,并接收一个参数,包含有关交叉状态的信息。
import loadingUrl from '@/assets/imgs/loading.jpg'; |
在初始化的时候,需要给imageSrc设置一个初始化的loading地址,如果没有的话,初始化的时候会加载多张图片。
利用react的懒加载库react-lazyload
,这里介绍几个它的常见属性:
scrollContainer
,scrollContainer
的值DOM对象。在实现的过程中,同时需要设置overflow为true,以及height的值。
import react, { useRef, useEffect } from 'react'; |
在Canvas中,动画其实也就是一些基础的几何变换
,因此想做动画第一步咱们需要先了解有哪些几何变换
。
在Canvas中,动画其实也就是一些基础的几何变换
,因此想做动画第一步咱们需要先了解有哪些几何变换
。
几何变换的类型其实和CSS动画中的类型差不多,也就是:移动、旋转、缩放
语法:translate(x, y)
,其中 x 是左右偏移量,y 是上下偏移量。
const canvas = document.getElementById('canvas'); // 获取Canvas |
const canvas = document.getElementById('canvas'); // 获取Canvas |
如上图我们可以看出,最开始我们设置了填充颜色为灰色,并绘制了一个矩形,然后我们执行了状态保存,上面我们已经列举了哪些状态可以保存,所以这里我们知道此次的状态保存的是:fillStyle
状态,保存完以后我们又设置了填充颜色为橘色,并且又绘制了一个矩形,最后我们执行了一次状态恢复,接着直接绘制一个正方形。我们知道如果没有状态保存和恢复的方法,正常情况下正方形应该是使用橘色来填充,但正因为我们保存了fillStyle
状态的灰色,又在绘制正方形之前恢复了fillStyle
状态为灰色,因此绘制出来的正方形为灰色。
Canvas呈现的东西都是绘制完了以后才能看到,因此想通过Canvas自己提供的Api来实现动画是做不到的。
那么想在 Canvas 中实现动画就得借助别的东西,那么借助啥呢?
@@ -209,7 +209,7 @@这里先使用 setInterval()
方法实现一个元素的位移效果。
const canvas = document.getElementById('canvas'); // 获取Canvas |
如图我们可以看出,元素确实动了,但是似乎不是我们想要的那个样子,我们想实现的是元素的位移,但看样子实现的是元素的变宽。
那么我们看一下问题出在哪里?
经过我们的一番思考,我们发现,Canvas 绘制时把元素一帧一帧的绘制到画布上,比如上面的例子我们把一个元素从(0,0)移动到(400,0),也就是横向移动400像素。既然是一帧一帧绘制的,那么我们看到的就是连续的从(0,0)绘制到(400,0)的效果,也就是我们看到的是所有的帧组合在一起的效果,而不是从(0,0)移动到(400,0)的效果。
@@ -224,7 +224,7 @@const canvas = document.getElementById('canvas'); // 获取Canvas |
requestAnimationFrame()
方法的整体性能要比setInterval()
方法好很多,打个比方,当我们用setInterval()
方法来做动画,我们需要设置一下多长时间执行一次setInterval()
方法里面的代码块,而这个时间我们只要设定了,那么就会强行这个时间执行,而如果我们的浏览器显示频率和setInterval()
方法执行的绘制请求不一致,就会导致一些帧率消失,从而造成卡顿的效果。因此使用requestAnimationFrame()
方法做动画会更加平缓且有效率。
同时在requestAnimationFrame()
方法的使用中我们需要注意,一般每秒钟回调函数执行次数为60次,但也可能会被降低,因为通常情况下requestAnimationFrame()
方法会遵循W3C的建议,在浏览器中的回调函数执行次数需要和浏览器屏幕刷新次数相匹配。还有就是为了提高性能和电池使用寿命,requestAnimationFrame()
方法运行在后台标签页或者隐藏在 <iframe>
标签里时,requestAnimationFrame()
方法会暂停调用以提升性能和电池使用寿命。
requestAnimationFrame()
方法不能自循环,那怎么让他实时触发渲染呢?
const canvas = document.getElementById('canvas'); |