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