ScrollTo Ionic 2 中 Listview 的特定项目
ScrollTo particular item of ListiVew in Ionic 2
我想滚动到 ionic 2 列表视图中的特定项目。我有一个绑定到数组的列表视图。
export class TestPage {
@ViewChild(Content) content: Content;
public items: Array<Object> = [];
ionViewWillEnter() {
console.log(this.navParams.data);
this.customService.getArray(this.params.index).then((items) => {
this.items = items;
//scroll to item
// this.content.scrollTo()
});
}
}
视图如下:
<ion-list [virtualScroll]="items" approxItemHeight="120px" approxItemWidth="100%"
class="items-listview list list-md">
<button class="items-listview-item item item-md" *virtualItem="let item">
<div class="items-listview-text">
{{ item.text }}<span>{{item.index}}</span>
</div>
</button>
</ion-list>
我看到 scrollTo 只支持位置,即顶部和左侧,但不支持元素本身。我如何滚动到列表视图项目 (e. item no 150) 本身?我如何获取 item no 150 的位置并将其传递给 scrollTo?
您可以为每个项目分配一个 ID(通过执行类似 [id]="'item' + item.index"
的操作,然后在您的代码中使用该 ID 获取 offsetTop
:
scrollTo(elementId:string) {
let yOffset = document.getElementById(elementId).offsetTop;
this.content.scrollTo(0, yOffset, 4000)
}
当前接受的答案仅相对于父元素滚动,所以这是我想出的滚动到所选元素的方法(不遍历 DOM)。
scrollTo(element:string) {
let elem = document.getElementById(element);
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var clientTop = docEl.clientTop || body.clientTop || 0;
var top = box.top + scrollTop - clientTop;
var cDim = this.content.getContentDimensions();
var scrollOffset = Math.round(top) + cDim.scrollTop - cDim.contentTop;
this.content.scrollTo(0, scrollOffset, 500);
}
我正在发布我想出的解决方案。首先,您需要为每个列表视图项目提供唯一 ID,然后 select ListView
@ViewChild(VirtualScroll) listView: VirtualScroll;
之后我创建了一个函数(如下)ScrollTo
,它在滚动后也有调整列表视图大小的超时(因为我正在动态更改缓冲区比率)。
private scrollTo(index: number) {
let key = '#customIds_' + index;
let hElement: HTMLElement = this.content._elementRef.nativeElement;
let element = hElement.querySelector(key);
element.scrollIntoView();
//wait till scroll animation completes
setTimeout(() => {
//resize it! otherwise will not update the bufferRatio
this.listView.resize();
},500);
}
最后我在等待列表视图加载时在第二次延迟后才调用此函数:
//must be delay otherwise content scroll doesn't go to element properly..magic!
setTimeout(() => {
this.scrollTo('someId');
}, 1000);
我想滚动到 ionic 2 列表视图中的特定项目。我有一个绑定到数组的列表视图。
export class TestPage {
@ViewChild(Content) content: Content;
public items: Array<Object> = [];
ionViewWillEnter() {
console.log(this.navParams.data);
this.customService.getArray(this.params.index).then((items) => {
this.items = items;
//scroll to item
// this.content.scrollTo()
});
}
}
视图如下:
<ion-list [virtualScroll]="items" approxItemHeight="120px" approxItemWidth="100%"
class="items-listview list list-md">
<button class="items-listview-item item item-md" *virtualItem="let item">
<div class="items-listview-text">
{{ item.text }}<span>{{item.index}}</span>
</div>
</button>
</ion-list>
我看到 scrollTo 只支持位置,即顶部和左侧,但不支持元素本身。我如何滚动到列表视图项目 (e. item no 150) 本身?我如何获取 item no 150 的位置并将其传递给 scrollTo?
您可以为每个项目分配一个 ID(通过执行类似 [id]="'item' + item.index"
的操作,然后在您的代码中使用该 ID 获取 offsetTop
:
scrollTo(elementId:string) {
let yOffset = document.getElementById(elementId).offsetTop;
this.content.scrollTo(0, yOffset, 4000)
}
当前接受的答案仅相对于父元素滚动,所以这是我想出的滚动到所选元素的方法(不遍历 DOM)。
scrollTo(element:string) {
let elem = document.getElementById(element);
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var clientTop = docEl.clientTop || body.clientTop || 0;
var top = box.top + scrollTop - clientTop;
var cDim = this.content.getContentDimensions();
var scrollOffset = Math.round(top) + cDim.scrollTop - cDim.contentTop;
this.content.scrollTo(0, scrollOffset, 500);
}
我正在发布我想出的解决方案。首先,您需要为每个列表视图项目提供唯一 ID,然后 select ListView
@ViewChild(VirtualScroll) listView: VirtualScroll;
之后我创建了一个函数(如下)ScrollTo
,它在滚动后也有调整列表视图大小的超时(因为我正在动态更改缓冲区比率)。
private scrollTo(index: number) {
let key = '#customIds_' + index;
let hElement: HTMLElement = this.content._elementRef.nativeElement;
let element = hElement.querySelector(key);
element.scrollIntoView();
//wait till scroll animation completes
setTimeout(() => {
//resize it! otherwise will not update the bufferRatio
this.listView.resize();
},500);
}
最后我在等待列表视图加载时在第二次延迟后才调用此函数:
//must be delay otherwise content scroll doesn't go to element properly..magic!
setTimeout(() => {
this.scrollTo('someId');
}, 1000);