How can I use content.scrollTo() for ion-scroll in ionic2?

后端 未结 5 2074
日久生厌
日久生厌 2020-12-05 14:50

I try to scroll to a fixed position, for example scrollTo(500, 20). Let\'s say that you are on a device, which has got a width of 300 pixel. The scroll target is now out of

相关标签:
5条回答
  • 2020-12-05 15:36

    You can replace this.content.scrollTo(...) with this.content._scrollContent.nativeElement.scrollTo(...)

    0 讨论(0)
  • 2020-12-05 15:47

    By content scrolling

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

    By id #scroll

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

    This above method is working fine for top bottom scrolling but in the case of horizontal/scrollX not working so by below code i resolve my solution may hope it will helpful for you.

    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>
    
    0 讨论(0)
  • 2020-12-05 15:48

    How can I use the scrollTo() method for <ion-scroll> instead of <ion-content>?

    I'm still working on how to animate the scroll, but at least this may be considered as a solution for your scenario. Please take a look at this plunker.

    Since we can't use theion-content for scrolling, I though about getting the instance of the Scroll, then accessing the inner html scroll element, and then using the element.scrollLeft property to scroll on that element:

    The element.scrollLeft property gets or sets the number of pixels that an element's content is scrolled to the left.

    So in the component code:

    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;
        }
    
    }
    

    And in the view:

    <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>
    

    By doing this.scroll.scrollElement.scrollLeft = 500;, we can scroll the content of the ion-scroll 500px to the right. We can then go back to the start again by doing this.scroll.scrollElement.scrollLeft = 0;.

    0 讨论(0)
  • 2020-12-05 15:51

    Why don't you get the dimensions of the element that you want to scroll to first? Assign an id to your ion-scroll in html file, then you can 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);
    }
    

    From this documentation: The returned value of getBoundingClientRect left, top, right, bottom, x, y, width, height properties describing the border-box in pixels. Properties other than width and height are relative to the top-left of the viewport.

    Looking at your code, I don't think you need ion-scroll, you should be able to just assign an id to your div and get the result you want.

    0 讨论(0)
  • 2020-12-05 15:56

    To add to the answers above, this will handle smooth scrolling.

    Name the scroll element in your .html

    <ion-scroll #scroll>
    

    Import the scroll.

    import { Scroll } from 'ionic-angular';
    

    Reference the scroller in the .ts

    @ViewChild('scroll') scroll: any;
    

    Add this code where its needed:

    this.scroll._scrollContent.nativeElement.scrollTo({ left: 0, top: 0, behavior: 'smooth' });
    

    Hope that helps somebody.

    0 讨论(0)
提交回复
热议问题