scrollIntoViewはすべてのブラウザで機能しますか?


回答:


81

はいサポートされていますが、ユーザーエクスペリエンスは...悪いです。

@ 9b​​itsが指摘しているように、これはすべての主要なブラウザで長い間サポートされてました。それについて心配する必要はありません。主な問題はそれが機能する方法です。ページの最後にある可能性のある特定の要素にジャンプするだけです。そこにジャンプすることで、ユーザーは次のことを理解できません。

  • ページが上にスクロールされました
  • ページが下にスクロールされました
  • それらは他の場所にリダイレクトされました

最初の2つはスクロール位置によって決定できますが、ジャンプが行われる前にユーザーがスクロール位置を追跡したと誰が言いますか?したがって、これは非決定論的なアクションです。

最後の1つは、特にページにスクロールして表示されない移動ヘッダーがあり、残りのページデザインが同じページにあることを意味しない場合に当てはまります(左側のメニューのように全高の垂直要素もない場合)バー)。この問題が発生しているページの数に驚かれることでしょう。自分でチェックしてください。あるページに移動し、上部を見てから、Endキーを押してもう一度見てください。別のページだと思われるかもしれません。

アニメーション化されたscrollintoviewjQueryプラグインが救助に

そのため、ネイティブDOM関数を使用する代わりにスクロールインビューを実行するプラグインがまだあります。これらは通常、スクロールをアニメーション化して、上記の3つの問題をすべて排除します。ユーザーは簡単に動きを追跡できます。


1
注:スクロールされた要素がiframe内にある場合(明らかな理由で)、jQueryプラグインは機能しません(右)。element.scrollIntoViewはそれでも機能します。
panzi 2014年

7
の新しい仕様でScrollIntoViewOptionsは、を指定できますbehavior: 'smooth'。残念ながら、このオプションがブラウザでサポートされているかどうかを簡単に検出する方法はありません…
フライングシープ

6
Firefoxはサポートしているようですbehavior: "smooth"が、ChromeやSafariはサポートしていません。
Flimm 2015

1
矢印キーで上下を制御し、選択した項目に応じてメニューをスクロールするカスタムドロップダウンメニューを作成する場合などに便利です。その場合、アイテム間を瞬時にジャンプしないのはユーザーエクスペリエンスが悪いでしょう。
user2867288 2015年

1
@FlimmはIE / Edgeでもありません。参考資料を参照してください。FF36+のみがこの機能を備えています。したがって、残念ながら、それは役に立たない。
Alex Zhukovskiy 2016


3

Matteo SpinnelliのiScroll-4を使用していますが、iOSサファリでも動作します。これには、scrollTo、scrollToElement、scrollToPageの3つのメソッドがあります。div内にラップされた要素の順序付けられていないリストがあるとしましょう。Robert Koritnikが上で書いたように、スクロールしたことを示すには、そのわずかなアニメーションが必要です。以下の方法でその効果が得られます。

scrollToElement(element, time); 

2
iScroll-4へのあなたのリンクは死んでいる
ロマン・ヴァンサン

1

これは試していませんが、組み込みのscrollIntoView関数に便乗すると多くのコードを節約できるようです。アニメーションアクションが必要な場合は、次のようにします。

  1. コンテナの現在のスクロール位置をSTARTPOSITIONとしてキャッシュします
  2. 組み込みのscrollIntoViewを実行する
  3. スクロール位置をENDPOSITIONとして再度キャッシュします
  4. コンテナを開始位置に戻します
  5. ENDPOSITIONまでスクロールをアニメーション化する

1

scrollIntoViewIfNeededについてお読みください

if(el.scrollIntoViewIfNeeded){
el.scrollIntoViewIfNeeded()
}else{
el.scrollIntoView()
}

0

jQueryの代替およびアニメーション<html><body>要素を使用できます。

$('html, body').animate({
  scrollTop: $("#myElem").offset().top
}, 1000);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.