我试图在第一次加载带有延迟加载的页面时显示一个组件,该页面仅在视图中加载内容。 例如: -页面上有10个组件,我想在第一次加载时以懒惰加载方式显示/滚动到组件编号7(以提高性能)。
如何正确执行此操作?这里的挑战是因为这些组件是延迟加载的,并且具有巨大的图像,这些图像弄乱了scrollIntoView()并滚动到通过该组件的顶部太多。
我尝试过类似的操作,但是组件仍然滚动到顶部太多。
<div>Div 1</div>
<div>Div 2</div>
<div>Div 3</div>
<div>Div 4</div>
<div>Div 5</div>
<div>Div 6</div>
<div #target>Target Div 7</div>
<div>Div 8</div>
<div>Div 9</div>
<div>Div 10</div>
export class BBQComponent implements AfterViewInit {
@ViewChild("target") targetElement: ElementRef;
ngAfterViewInit() {
setTimeout(_ => {
this.targetElement.nativeElement.scrollIntoView({block: "start"});
window.scrollBy(0, -100);
}, 2000);
}
}
我希望该页面在首次访问时显示在导航栏下方(高度约100像素)。我一直在寻找解决方案,并尝试了不同的方法,但仍然停留在这一点。
是否缺少使此功能scrollIntoView用于延迟加载内容的功能?谢谢!
答案 0 :(得分:0)
export class BBQComponent implements AfterViewInit {
@ViewChild("target") targetElement: ElementRef;
scrolled = false; // To avoid multiple scrolls because ngAfterContentChecked
ngAfterContentChecked() { // Changed from ngAfterViewInit()
if(!scrolled) {
const target = this.targetElement.nativeElement;
target.scrollIntoView({block: "start"}); // Scroll to the component
// After scrolled, wait for the browser to figure out where the
// component is after lazy loading is done. Scroll again.
setTimeout(_ => {
target.scrollIntoView({block: "start"});
window.scrollBy(0, -100); // Nav's height
this.scrolled = true;
}, 1000); // Adjust wait time as needed
}
}
}
答案 1 :(得分:0)
党。
您应该确保兼容性。
如果您在此处阅读Doc,请注意,任何浏览器均不真正支持{block:“ start”}之类的选项。
顺便说一句,我真的不知道您的问题是否与延迟加载实现或scrollIntoView更相关。如果是关于延迟加载的问题,我强烈建议您使用JQuery Lazy loading,因为它的简单配置可以防止您头疼。