私の仕事では、AngularJSで作成した1ページのサイトがあります。
ui-routerプラグイン(バージョン0.2.0)を使用しています。
最近、ある状態から別の状態に移動するときに、ウィンドウが上にスクロールされないことに気づきました。
状態が変化するたびにjQueryのscrollTop()
関数を使用して(_$stateChangeSuccess
_イベントを使用して)手動で一番上までスクロールしようとしました。しかし、それはうまくいきませんでした。
そこで調査を開始しましたが、scrollTop()
がページ上のすべての要素に対して0を返していることに気付きました。
それだけでなく、_window.scrollY
_をコンソールに出力すると0になります(ページのどこにいても)。私のコードだけでなく、chrome開発ツールコンソールで記述しただけでも。
AngularJSとui-routerを使用していくつかのアプリを作成しましたが、これはこの特定のアプリでのみ発生します。
scrollTop()
関数または_window.scrollY
_フィールドを上書きしたかどうかを確認しましたが、何も見つかりませんでした。
_ui-view
_を_autoscroll="true"
_および_autoscroll="false"
_と一緒に使用してみましたが、違いはありませんでした。
また、html
要素とbody
要素に_height:100%
_を与えてみましたが、与えずに試しました。しかし、何もありません。
私は本当に次に何をすべきかわかりません。
問題を再現することはできませんでしたが、ここに投稿する必要のある、役立つコードがあると思われる場合は、喜んで対応させていただきます。
ありがとう!
編集:
私はコンソールでこの関数を実行しました:
_var l = $('*').length;
for(var i = 0; i < l; i++) {
var elem = $('*:eq(' + i + ')');
if(elem.scrollTop() > 0) {
console.log(elem, elem.scrollTop());
}
}
_
この関数は、トップスクロールで1つの要素のみを出力しました。
要素は、コンテンツ全体とメインビューを保持するラッピングdivです(アプリにネストされたビューがあります)。
この要素でscrollTop(0)
を使用すると、必要なものが得られますが、それは症状のみを扱い、実際の問題は扱いません。
@Hansがコメントしたように、実際には問題はありませんでした。 absolute
に配置されたラッピング要素がありました。
top:0;
bottom:0;
left:0;
right:0;
overflow:auto
したがって、ウィンドウのscrollTop
は常に0であり、スクロールバーは実際にはラッピング要素に属していました。
ラッピング要素の位置を取り除くことができなかったので、ui-routerの$stateChangeSuccess
イベントを使用し、ラッピング要素を手動で一番上にスクロールしました。
コンソールから、試してみてください
console.log(frames)
console.log(frames.top.scrollY)
Window.scrollYが0を示している場合、参照フレームはウィンドウであってはなりません。ページにiframeはありますか?フレームのconsole.logは、ページ上のフレームのリストを表示します。
お役に立てば幸いです。
私のコードもこの問題で発生し、body {overflow:hidden;}が理由であることがわかりました。「overflow:hidden;」を削除します。そして、すべてが順調です。