ボタンを押したときにターゲットまでスクロールできるようにしたい。私はこのようなことを考えていました。
<button (click)="scroll(#target)">Button</button>
そして私のcomponent.tsではのようなメソッド。
scroll(element) {
window.scrollTo(element.yPosition)
}
上記のコードは有効ではないことを知っていますが、私が考えていたことを示すためだけのものです。 Angularの経験がなくてもAngular 4を習い始めたばかりです。私はこのようなものを探し回っていましたが、すべての例はAngularJにあり、Angular 4とは異なります
あなたはこれのようにそれをすることができました:
<button (click)="scroll(target)"></button>
<div #target>Your target</div>
そしてあなたのコンポーネントで:
scroll(el: HTMLElement) {
el.scrollIntoView();
}
編集:要素が未定義であるため、これは機能しなくなったというコメントが表示されます。 Angular 7に StackBlitzの例 を作成しましたが、それでも機能します。誰かがうまくいかない場合の例を教えてください。
これがAngular 4を使ったやり方です。
テンプレート
<div class="col-xs-12 col-md-3">
<h2>Categories</h2>
<div class="cat-list-body">
<div class="cat-item" *ngFor="let cat of web.menu | async">
<label (click)="scroll('cat-'+cat.category_id)">{{cat.category_name}}</label>
</div>
</div>
</div>
この関数をコンポーネントに追加します。
scroll(id) {
console.log(`scrolling to ${id}`);
let el = document.getElementById(id);
el.scrollIntoView();
}
実際には、setTimeout
、requestAnimationFrame
、またはjQueryを使用せずにこれを達成するための純粋なjavascriptの方法があります。
つまり、scrollViewでスクロールしたい要素を見つけて、scrollIntoView
を使用します。
el.scrollIntoView({behavior:"smooth"});
これが plunkr です。
このパーティーには少し遅れましたが、私はAngular 4+のためのプラグインを書きました。それはあなたがぶつかるかもしれない他の問題をカバーします、サーバーサイドレンダリングのように。あなたの好みに合わせてスクロールするようにアニメーション化することもできます。完全な開示、私は作者です。
NPM:@ nicky-lenaers/ngx-scroll-to
GitHub:@ nicky-lenaers/ngx-scroll-to
これがあなたを助けてくれることを願っています!
Jonは正しい答えを持っています。これは私の5つか6つのプロジェクトでうまくいきます。
クリックしてナビゲーションバーからフッターにスムーズにスクロールするには、次の手順を実行します。
<button (click)="scrollTo('.footer')">ScrolltoFooter</button>
<footer class="footer">some code</footer>
scrollTo(className: string):void {
const elementList = document.querySelectorAll('.' + className);
const element = elementList[0] as HTMLElement;
element.scrollIntoView({ behavior: 'smooth' });
}
フッターからヘッダーにスクロールバックしたいので、この関数が置かれているサービスを作成し、それをナビゲーションバーコンポーネントとフッターコンポーネントに挿入し、必要に応じて 'header'または 'footer'を渡しました。実際にコンポーネント宣言に使用されているクラス名を付けることを忘れないでください。
<app-footer class="footer"></app-footer>
角度7で完璧な作品
HTML
<button (click)="scroll(target)">Click to scroll</button>
<div #target>Your target</div>
コンポーネント内
scroll(el: HTMLElement) {
el.scrollIntoView({behavior: 'smooth'});
}
角度ではViewChildとElementRefを使うことができます:あなたのhtml要素にrefを与える
<div #myDiv >
そしてあなたのコンポーネントの中に:
import { ViewChild, ElementRef } from '@angular/core';
@ViewChild('myDiv') myDivRef: ElementRef;
あなたはthis.myDivRef.nativeElementを使ってあなたの要素に到達することができます
Angularでそれを行う別の方法:
マークアップ:
<textarea #inputMessage></textarea>
ViewChild()プロパティを追加します。
@ViewChild('inputMessage')
inputMessageRef: ElementRef;
ScrollIntoView()関数を使用して、コンポーネント内の任意の場所にスクロールします。
this.inputMessageRef.nativeElement.scrollIntoView();