angular - Cum pot folosi content.scrollTo() pentru ion-scroll în ionic2?
Încerc să derulez până la o poziție fixă, de exemplu scrollTo(500, 20). Să zicem că ești pe un dispozitiv care are o lățime de 300 de pixeli. Ținta de derulare este acum în afara ecranului, trebuie să derulezi spre dreapta.
Am rezolvat asta urmând pașii următori:
<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>
Până aici totul este în regulă. Problema începe dacă vreau să sar 500 de pixeli spre dreapta apăsând un buton, de exemplu. Glisarea spre dreapta funcționează. Știu că există o funcție pentru a face acest lucru pentru <ion-content>:
@ViewChild(Content) content: Content;
[...]
this.content.scrollTo(500, 500, 500);
Din păcate, acest lucru nu funcționează în cazul meu. Cred că problema este că conținutul este legat de mărimea dispozitivului, astfel încât metoda scrollTo() nu are efect pentru <ion-scroll>. Cum pot folosi metoda scrollTo() pentru <ion-scroll> în loc de <ion-content>?
Mulțumesc pentru orice ajutor!
Răspuns #1
Cum pot folosi metoda scrollTo() pentru
<ion-scroll>în loc de<ion-content>?
Încă lucrez la modul de animare a derulării, dar cel puțin acest lucru poate fi considerat o soluție pentru scenariul tău. Te rog să arunci o privire la acest plunker.
Deoarece nu putem folosi ion-content pentru derulare, m-am gândit să obțin instanța Scroll, apoi să accesez elementul de derulare HTML intern și apoi să folosesc proprietatea element.scrollLeft pentru a derula pe acel element:
Proprietatea element.scrollLeft obține sau setează numărul de pixeli cu care conținutul unui element este derulat spre stânga.
Deci în codul componentului:
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;
}
}
Și în vedere:
<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>
Prin efectuarea this.scroll.scrollElement.scrollLeft=500;, putem derula conținutul lui ion-scroll cu 500px către dreapta. Putem apoi să ne întoarcem la început făcând this.scroll.scrollElement.scrollLeft=0;.
Răspunsul #2
Prin derularea conținutului
@ViewChild(Content) content: Content;
this.content.scrollTo
Prin id #scroll
@ViewChild('scroll') scroll: any;
this.scroll.scrollElement.scrollLeft = 500;
Metoda de mai sus funcționează bine pentru derularea sus-jos, dar în cazul derulării orizontale/scrollX nu funcționează, așa că prin codul de mai jos am rezolvat soluția mea. Sper că vă va fi de folos.
TypeScript
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>
