Javascript 当元素出现在视口中时检查->;addClass

Javascript 当元素出现在视口中时检查->;addClass,javascript,jquery,html,css,Javascript,Jquery,Html,Css,我在dom树中有很多对象,当它们出现在视口中时,我将在其上添加新类。但我的代码非常慢-它会导致页面速度变慢 我有这样的想法: ... <span class="animation"></span> ... 也许我可以加快我的卷轴检查和班级申请 可以使用交点观察者API来检测元素何时出现在视口中。下面是一个示例,该示例向滚动到视口中的元素添加一个类,并将背景颜色从红色设置为蓝色: var targetElement=document.querySelector('.bl

我在dom树中有很多对象,当它们出现在视口中时,我将在其上添加新类。但我的代码非常慢-它会导致页面速度变慢

我有这样的想法:

...
<span class="animation"></span>
...

也许我可以加快我的卷轴检查和班级申请

可以使用交点观察者API来检测元素何时出现在视口中。下面是一个示例,该示例向滚动到视口中的元素添加一个类,并将背景颜色从红色设置为蓝色:

var targetElement=document.querySelector('.block');
var observer=新的IntersectionObserver(onChange);
观察者。观察(目标元素);
函数onChange(条目){
entries.forEach(函数(entry){
entry.target.classList.add('in-viewport');
观察者。未观察者(进入。目标);
});
}
正文{
保证金:0;
高度:9000px;
}
.街区{
宽度:100%;
高度:200px;
利润上限:2000px;
背景色:红色;
过渡:背景1s线性;
}
.block.in-viewport{
背景颜色:蓝色;
}

您可以使用交点观察者API来检测元素何时出现在视口中。下面是一个示例,该示例向滚动到视口中的元素添加一个类,并将背景颜色从红色设置为蓝色:

var targetElement=document.querySelector('.block');
var observer=新的IntersectionObserver(onChange);
观察者。观察(目标元素);
函数onChange(条目){
entries.forEach(函数(entry){
entry.target.classList.add('in-viewport');
观察者。未观察者(进入。目标);
});
}
正文{
保证金:0;
高度:9000px;
}
.街区{
宽度:100%;
高度:200px;
利润上限:2000px;
背景色:红色;
过渡:背景1s线性;
}
.block.in-viewport{
背景颜色:蓝色;
}

交叉点观察者API方法仅适用于chrome,但性能提高了100%。下面的代码在3/1000秒内加载

$(文档).ready(函数(){
"严格使用",;
变量startTime、endTime、sum;
startTime=Date.now();
var anim=$('.animation');
每个动画(功能(索引、元素){
var animoffset=$(elem).offset().top;
$(窗口).on('scroll resize touchmove',function(){
var winScTop=$(this.scrollTop();
var windowHeight=$(window.height();
var winBottom=winScTop+windowHeight;
如果(winBottom>=animoffset){
$(elem).addClass('show');
}
});
});
endTime=Date.now();
总和=结束时间-开始时间;
console.log('loaded in:'+sum);
});
html{
身高:100%;
}
身体{
保证金:0;
高度:9000px;
}
.动画{
显示:块;
宽度:400px;
高度:400px;
背景颜色:蓝色;
利润上限:1000px;
}
.动画:非(:类型的第一个){
边缘顶部:10px;
}
.动画{
背景颜色:黄色;
过渡:所有3s都很轻松
}

交叉点观察者API方法仅适用于chrome,但性能提高了100%。下面的代码在3/1000秒内加载

$(文档).ready(函数(){
"严格使用",;
变量startTime、endTime、sum;
startTime=Date.now();
var anim=$('.animation');
每个动画(功能(索引、元素){
var animoffset=$(elem).offset().top;
$(窗口).on('scroll resize touchmove',function(){
var winScTop=$(this.scrollTop();
var windowHeight=$(window.height();
var winBottom=winScTop+windowHeight;
如果(winBottom>=animoffset){
$(elem).addClass('show');
}
});
});
endTime=Date.now();
总和=结束时间-开始时间;
console.log('loaded in:'+sum);
});
html{
身高:100%;
}
身体{
保证金:0;
高度:9000px;
}
.动画{
显示:块;
宽度:400px;
高度:400px;
背景颜色:蓝色;
利润上限:1000px;
}
.动画:非(:类型的第一个){
边缘顶部:10px;
}
.动画{
背景颜色:黄色;
过渡:所有3s都很轻松
}

IntersectionObserver在浏览器中的支持有限,但正在改进

如果浏览器用户正在加载我的网站,并且不支持下面代码中的IntersectionObserver API,那么我基本上是懒得加载polyfill的

loadPolyfills()
   .then(() => /* Render React application now that your Polyfills are 
ready */)

/**
 * Do feature detection, to figure out which polyfills needs to be imported.
 **/

function loadPolyfills() {
  const polyfills = []

  if (!supportsIntersectionObserver()) {
    polyfills.push(import('intersection-observer'))
  }

  return Promise.all(polyfills)
}

function supportsIntersectionObserver() {
  return (
    'IntersectionObserver' in global &&
    'IntersectionObserverEntry' in global &&
    'intersectionRatio' in IntersectionObserverEntry.prototype
  )
}

IntersectionObserver在浏览器中的支持有限,但正在改进

如果浏览器用户正在加载我的网站,并且不支持下面代码中的IntersectionObserver API,那么我基本上是懒得加载polyfill的

loadPolyfills()
   .then(() => /* Render React application now that your Polyfills are 
ready */)

/**
 * Do feature detection, to figure out which polyfills needs to be imported.
 **/

function loadPolyfills() {
  const polyfills = []

  if (!supportsIntersectionObserver()) {
    polyfills.push(import('intersection-observer'))
  }

  return Promise.all(polyfills)
}

function supportsIntersectionObserver() {
  return (
    'IntersectionObserver' in global &&
    'IntersectionObserverEntry' in global &&
    'intersectionRatio' in IntersectionObserverEntry.prototype
  )
}

它的支持是有限的,但幸运的是它很容易填充。它的支持是有限的,但幸运的是它很容易填充。然后呢?它应该工作得很快。。。当然,它的加载速度很快)然后呢?它应该工作得很快。。。当然,它的加载速度很快。)polyfill难道不能自己检测in,并且只有在没有浏览器支持的情况下才能“激活”吗?polyfill难道不能自己检测in,并且只有在没有浏览器支持的情况下才能“激活”吗?