如何在ionic2中使用content.scrollTo()进行离子滚动?

时间:2017-05-21 17:29:30

标签: angular typescript ionic-framework ionic2 ionic3

我尝试滚动到固定位置,例如scrollTo(500,20)。假设您使用的设备宽度为300像素。滚动目标现在已超出屏幕范围,您必须向右滚动。

我通过以下方式解决了这个问题:

<ion-content>
    <ion-scroll scrollX="true" style="width:100%; height:100%; white-space: nowrap; ">
        <div style="width:1000px; ">
            [box1] [box2] [box3] [...]
        </div>
    </ion-scroll>
</ion-content>

到这里一切都很好。如果我想通过按下按钮向右跳500像素,问题就开始了。向右滑动即可。我知道有一个函数可以为<ion-content>执行此操作:

@ViewChild(Content) content: Content;
[...]
this.content.scrollTo(500, 500, 500); 

遗憾的是,我的情况并不适用。我认为问题是内容与设备大小有关,因此scrollTo()方法不会影响<ion-scoll>。如何使用<ion-scroll>而不是<ion-content>的scrollTo()方法?

感谢您的帮助!

5 个答案:

答案 0 :(得分:8)

  

如何使用<ion-scroll>的scrollTo()方法代替   <ion-content>

我还在研究如何为滚动设置动画,但至少可以将其视为您的方案的解决方案。请查看this plunker

因为我们不能使用ion-content进行滚动,所以我想获取Scroll的实例,然后访问内部html滚动元素,然后使用element.scrollLeft属性滚动关于那个元素:

  

element.scrollLeft属性获取或设置像素数   元素的内容向左滚动。

所以在组件代码中:

import { Component, ViewChild } from '@angular/core';
import { NavController, Content } from 'ionic-angular';

@Component({...})
export class HomePage {
  @ViewChild('scroll') scroll: any;

    constructor() {}

    public backToStart(): void {
      this.scroll.scrollElement.scrollLeft = 0;
    }

    public scrollToRight(): void {
      this.scroll.scrollElement.scrollLeft = 500;
    }

}

在视图中:

<ion-content padding>
  <ion-scroll #scroll scrollX="true" style="width:100%; height:150px; white-space: nowrap;">
        <div  style="width:1000px;">
            <div style="display:inline-block;height:100px;width:100px;border:1px solid black;"></div>
            <div style="display:inline-block;height:100px;width:100px;border:1px solid red;"></div>
            <div style="display:inline-block;height:100px;width:100px;border:1px solid blue;"></div>
            <div style="display:inline-block;height:100px;width:100px;border:1px solid green;"></div>
            <div style="display:inline-block;height:100px;width:100px;border:1px solid grey;"></div>
            <div style="display:inline-block;height:100px;width:100px;border:1px solid brown;"></div>
            <div style="display:inline-block;height:100px;width:100px;border:1px solid yellow;"></div>
            <div style="display:inline-block;height:100px;width:100px;border:1px solid orange;"></div>
            <div style="display:inline-block;height:100px;width:100px;border:1px solid pink;"></div>
            <div style="display:inline-block;height:100px;width:100px;border:1px solid violet;"></div>
        </div>
    </ion-scroll>

    <button (click)="backToStart()" ion-button text-only>Go to start</button>
    <button (click)="scrollToRight()" ion-button text-only>Scroll to right!</button>
</ion-content>

通过执行this.scroll.scrollElement.scrollLeft = 500;,我们可以将离子滚动500px的内容滚动到右侧。然后我们可以通过this.scroll.scrollElement.scrollLeft = 0;再次回到起点。

答案 1 :(得分:6)

按内容滚动

@ViewChild(Content) content: Content;
  this.content.scrollTo 

通过id #scroll

@ViewChild('scroll') scroll: any;  
this.scroll.scrollElement.scrollLeft = 500;

以上方法适用于顶部底部滚动但在水平/ scrollX不能正常工作的情况下,通过以下代码我解决我的解决方案可能希望它对您有所帮助。

<强>打字稿

scrollmain(elementId, index) {
   console.info('elementId', elementId)
   var el = document.getElementById(elementId);
   el.scrollIntoView({ behavior: "smooth" });
}

<强> HTML

<ion-scroll #scroll scrollX="true" style="width:100%;white-space: 
          nowrap; height: 60px">
    <ion-segment *ngIf="mcqdata" color="appmaincolor">
        <ion-segment-button *ngFor="let mcq of mcqdata; let i=index;" [id]="mcq.ques_id" value="{{mcq.ques_id}}" (ionSelect)="scrollmain(mcq.ques_id,i)"
            [ngClass]="{'active': selectedIdx == i}">
            <strong>Queastion{{i+1}}</strong>
        </ion-segment-button>
    </ion-segment>
</ion-scroll>

答案 2 :(得分:2)

要添加上面的答案,这将处理平滑滚动。

在.html

中命名滚动元素
x_list

导入滚动。

<ion-scroll #scroll>

在.ts

中引用滚动条
import { Scroll } from 'ionic-angular';

在需要的地方添加此代码:

@ViewChild('scroll') scroll: any;

希望能帮助某人。

答案 3 :(得分:0)

为什么不首先获得要滚动的元素的尺寸?在html文件中为您的离子滚动分配一个ID,然后您可以use this function

scrollToElement(id) { 
    var el = document.getElementById(id);
    var rect = el.getBoundingClientRect();
    // scrollLeft as 0px, scrollTop as "topBound"px, move in 800 milliseconds
    this.content.scrollTo(0, rect.top, 800);
}

来自this documentation: getBoundingClientRect的返回值left,top,right,bottom,x,y,width,height属性描述边框,以像素为单位。宽度和高度以外的属性相对于视口的左上角。

查看您的代码,我认为您不需要离子滚动,您应该只能为您的div分配一个ID并获得您想要的结果。

答案 4 :(得分:0)

您可以将this.content.scrollTo(...)替换为this.content._scrollContent.nativeElement.scrollTo(...)